如何在 IF 条件下使用 SQL 参数以及什么数据类型等于 NVARCHAR。 OLeDB,VB.NET
How to use SQL parameters with IF conditions and what datatype is equal to the NVARCHAR. OLeDB, VB.NET
所以我的问题实际上有 2 个以上的部分,但所有 link 都是为了保护我的应用程序免受 SQL 注入。
最近我正在重建我的应用程序以使其 SQL 防注入。我的应用程序是用 VB.NET 编写的,我使用 Parameters.Add
来保护查询。
更新第一个问题:
发现 NVARCHAR
数据类型等同于 OLEDB 中的 WChar
数据类型。当悬停在 WChar
上时,它在描述中说它是 WSTR
。
我有几个问题,但我无法在网上找到答案。
第一个,我想也是最简单的一个是 OleDB 中的数据类型是 NVARCHAR。在做一些研究时,我发现这个 link https://msdn.microsoft.com/en-us/library/ms130984.aspx 指出在 OleDB 中 DBTYPE_WSTR
数据类型与 NVARCHAR
相同(我在我的 t-SQL 服务器)。但是,在我的 VB 应用程序中添加参数时,没有这样的数据类型可用 (WSTR
)。一些选项是 VarChar
、VarWChar
、WChar
、LongVarChar
、LongVarWChar
。
问题是,哪一个是正确的?我假设它是 VarChar
.
--------更新到这里-----
第二个问题是查询中涉及到IF条件时如何处理参数(见下例)
sSQL1 = "SELECT [Omschrijving], [Nummer], [OrderType], [Orderdatum] FROM [Orders] WHERE [OrderDatum]>dateadd(""ww"",-4,GetDate()) "
If sOrderType <> "" Then
sSQL1 &= "AND ([OrderType]=""" & sOrderType & """)"
End If
sSQL1 &= "ORDER BY [Orders].[Nummer] DESC;"
lstOrder.Items.Clear()
Try
OpenConn()
cmd = New OleDbCommand(sSQL1, cn)
dr = cmd.ExecuteReader
While dr.Read()
lstOrder.Items.Add(dr("nummer") & " - " & dr("Omschrijving"))
End While
Catch
Debug.Print(sSQL1)
MsgBox("Error: " & sSQL1)
End Try
dr.Close()
CloseConn()
我应该如何使用参数重写这个?我是否需要在 if 条件中将 cmd = New OleDbCommand(sSQL1, cn)
与 Parameters.Add
一起实例化?但我想这也意味着我必须提前打开连接?
我想过重写成这样:
OpenConn()
sSQL1 = "SELECT [Omschrijving], [Nummer], [OrderType], [Orderdatum] FROM [Orders] WHERE [OrderDatum]>dateadd(""ww"",-4,GetDate()) "
If sOrderType <> "" Then
sSQL1 &= "AND ([OrderType]=?)"
cmd = New OleDbCommand(sSQL1, cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@OrderType", OleDbType.VarChar).Value = sOrderType
Else
cmd = New OleDbCommand(sSQL1, cn)
End If
sSQL1 &= "ORDER BY [Orders].[Nummer] DESC;"
lstOrder.Items.Clear()
Try
dr = cmd.ExecuteReader
While dr.Read()
lstOrder.Items.Add(dr("nummer") & " - " & dr("Omschrijving"))
End While
Catch
Debug.Print(sSQL1)
MsgBox("Error: " & sSQL1)
End Try
不知道这是否有效(遗憾的是现在我无法测试它)。
另一个问题是:我是否也需要在查询中为 dateadd
(参见上面的查询)使用参数?如果我这样做,怎么做?
最后一个问题是,当我使用 Parameters.Add
时,最好也给出 size
值还是不需要?
提前致谢!
我对你第一个问题的回答是
我认为这是您想要的相同数据类型的列表:
SQL Server | OLEDB (ADO => ad+...)
-----------+---------------
char | Char
nchar | WChar
varchar | VarChar
nvarchar | VarWChar
text | LongVarChar
ntext | LongWVarChar
所以我的问题实际上有 2 个以上的部分,但所有 link 都是为了保护我的应用程序免受 SQL 注入。
最近我正在重建我的应用程序以使其 SQL 防注入。我的应用程序是用 VB.NET 编写的,我使用 Parameters.Add
来保护查询。
更新第一个问题:
发现 NVARCHAR
数据类型等同于 OLEDB 中的 WChar
数据类型。当悬停在 WChar
上时,它在描述中说它是 WSTR
。
我有几个问题,但我无法在网上找到答案。
第一个,我想也是最简单的一个是 OleDB 中的数据类型是 NVARCHAR。在做一些研究时,我发现这个 link https://msdn.microsoft.com/en-us/library/ms130984.aspx 指出在 OleDB 中 DBTYPE_WSTR
数据类型与 NVARCHAR
相同(我在我的 t-SQL 服务器)。但是,在我的 VB 应用程序中添加参数时,没有这样的数据类型可用 (WSTR
)。一些选项是 VarChar
、VarWChar
、WChar
、LongVarChar
、LongVarWChar
。
问题是,哪一个是正确的?我假设它是 VarChar
.
--------更新到这里-----
第二个问题是查询中涉及到IF条件时如何处理参数(见下例)
sSQL1 = "SELECT [Omschrijving], [Nummer], [OrderType], [Orderdatum] FROM [Orders] WHERE [OrderDatum]>dateadd(""ww"",-4,GetDate()) "
If sOrderType <> "" Then
sSQL1 &= "AND ([OrderType]=""" & sOrderType & """)"
End If
sSQL1 &= "ORDER BY [Orders].[Nummer] DESC;"
lstOrder.Items.Clear()
Try
OpenConn()
cmd = New OleDbCommand(sSQL1, cn)
dr = cmd.ExecuteReader
While dr.Read()
lstOrder.Items.Add(dr("nummer") & " - " & dr("Omschrijving"))
End While
Catch
Debug.Print(sSQL1)
MsgBox("Error: " & sSQL1)
End Try
dr.Close()
CloseConn()
我应该如何使用参数重写这个?我是否需要在 if 条件中将 cmd = New OleDbCommand(sSQL1, cn)
与 Parameters.Add
一起实例化?但我想这也意味着我必须提前打开连接?
我想过重写成这样:
OpenConn()
sSQL1 = "SELECT [Omschrijving], [Nummer], [OrderType], [Orderdatum] FROM [Orders] WHERE [OrderDatum]>dateadd(""ww"",-4,GetDate()) "
If sOrderType <> "" Then
sSQL1 &= "AND ([OrderType]=?)"
cmd = New OleDbCommand(sSQL1, cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@OrderType", OleDbType.VarChar).Value = sOrderType
Else
cmd = New OleDbCommand(sSQL1, cn)
End If
sSQL1 &= "ORDER BY [Orders].[Nummer] DESC;"
lstOrder.Items.Clear()
Try
dr = cmd.ExecuteReader
While dr.Read()
lstOrder.Items.Add(dr("nummer") & " - " & dr("Omschrijving"))
End While
Catch
Debug.Print(sSQL1)
MsgBox("Error: " & sSQL1)
End Try
不知道这是否有效(遗憾的是现在我无法测试它)。
另一个问题是:我是否也需要在查询中为 dateadd
(参见上面的查询)使用参数?如果我这样做,怎么做?
最后一个问题是,当我使用 Parameters.Add
时,最好也给出 size
值还是不需要?
提前致谢!
我对你第一个问题的回答是 我认为这是您想要的相同数据类型的列表:
SQL Server | OLEDB (ADO => ad+...)
-----------+---------------
char | Char
nchar | WChar
varchar | VarChar
nvarchar | VarWChar
text | LongVarChar
ntext | LongWVarChar