sql server语言 - 如何在IF条件下使用sql参数,以及什么数据类型等于NVARCHAR.OLeDB, VB.NET



所以我的问题实际上有超过2部分,但所有链接到保护我的应用程序免受SQL注入。

最近我正在重建我的应用程序,使其SQL注入证明。我的应用程序是用VB编写的。. NET和我使用Parameters.Add来保护查询。

UPDATE第一个问题:

发现OLEDB中的NVARCHAR数据类型等于WChar数据类型。当鼠标悬停在WChar上时,它在描述中显示它是WSTR

我有几个问题,虽然我不能在网上找到答案。第一个,我想也是最简单的一个是OleDB中NVARCHAR的数据类型。在做一些研究时,我发现了这个链接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条件下与Parameters.Add一起实例化cmd = New OleDbCommand(sSQL1, cn) ?但我想这也意味着我必须更早地打开连接?

我想过这样重写:

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

最新更新