如何在 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)。一些选项是 VarCharVarWCharWCharLongVarCharLongVarWChar

问题是,哪一个是正确的?我假设它是 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