在 VB 中声明一个 nvarchar/在 SQL 查询中匹配一个 nvarchar
Posted
技术标签:
【中文标题】在 VB 中声明一个 nvarchar/在 SQL 查询中匹配一个 nvarchar【英文标题】:Declaring an nvarchar in VB/Matching an nvarchar in a SQL query 【发布时间】:2009-04-22 13:04:24 【问题描述】:我正在开发一个使用 VB 的 ASP.NET 应用程序。我在 VB 文件中使用 SQLReader/SQLCommand/SQLConnection 来尝试提取数据值。
我很困惑地发现查询没有返回任何值的原因,这里有人向我展示了如何对查询进行故障排除以验证正在返回的东西,但事实并非如此。
我与一位同事交谈,他问它是否匹配,因为我正在输入一个字符串,而数据库的 Text 字段是一个 nvarchar。如何在 VB 中声明变量,以便在作为查询参数输入时,它可以匹配?
它看起来匹配的数据类型只是基本的东西,比如“2”、“2a”、“1a”等等。
如果没有办法只声明 nvarchar,有没有人建议我如何解决这个问题?
非常感谢。
旁注:这是这个问题的某种延续:SQL Reader saying no values exist, query seems fine
编辑:感谢所有帮助。我按照你们所说的进行设置,但现在我收到一个错误消息“不存在从对象类型 System.Data.SqlClient.SqlParameter 到已知托管提供程序本机类型的映射。”
我将参数作为表单范围的变量,如下所示:
Private travelParameter As New SqlParameter("@trip", SqlDbType.NVarChar)
然后在主窗体里面,
travelQuery.CommandText = "SELECT [StartLoc], [EndLoc],[TravelTime], [AvgSpeed], [Distance] FROM [TravelTimes] WHERE [TripNum] = @trip"
travelQuery.Parameters.AddWithValue("@trip", travelParameter)
稍后会调用这样的函数。
FillWithTime("2", travelReader, time, newCell)
定义为:
Private Sub FillWithTime(ByVal TripNum As Char, ByRef travelReader As SqlDataReader, ByRef TimeData() As Object, ByRef Cell As System.Web.UI.WebControls.TableCell)
travelParameter.Value = TripNum
travelReader = travelQuery.ExecuteReader()
If (travelReader.Read()) Then
travelReader.GetValues(TimeData)
'stuff
End If
End Sub
再次感谢。
附: - Adam 和 Cerebus,如果可以的话,我会接受这两个答案。他们俩确实为我带来了这个想法,非常感谢。
【问题讨论】:
【参考方案1】:.NET 中的数据类型应该是string
。您只需要确保您的参数实例使用的是NVarChar
(如果是DbParameter
,那么就是DBType.String
。如果是SqlDbParameter
,那么就是SqlDbType.NVarChar
)。
【讨论】:
【参考方案2】:nvarchar
SqlDbType 映射到 .NET 字符串数据类型。就个人而言,我喜欢通过使它们尽可能具体来创建 SqlParameters:
'This overload of the constructor takes the Parameter name, ...
' its SqlDbType and size.
Dim param as New SqlParameter("@trip", SqlDbType.NVarChar, 2)
param.Value = "1a"
travelQuery.CommandParameters.Add(param)
【讨论】:
我通常把它压缩成一行:tavelQuery.CommandParamenters.Add("@trip", SqlDbType.NVarChar, 2).Value = "1a"; 是的,我也是。但是这个例子的目的是说明性的,而不是方便的措施。通常,通过冗长来最好地解释概念! ;-)【参考方案3】:就 .net 而言,它只是文本编码。
找出它是什么编码,可能是UTF8
byte[] barr = String.GetBytes(string)
System.Text.Encoding.UTF8.GetString(byte[])
【讨论】:
【参考方案4】:字符串应该可以工作,因为它的长度小于数据库中 nvarchar 的字段大小。
【讨论】:
以上是关于在 VB 中声明一个 nvarchar/在 SQL 查询中匹配一个 nvarchar的主要内容,如果未能解决你的问题,请参考以下文章
SQL server中的nvarchar最大的长度是4000个字吗