将WithValue添加到SQL语句中?VB.Net

将WithValue添加到SQL语句中?VB.Net,sql,vb.net,oledb,ms-access-2013,Sql,Vb.net,Oledb,Ms Access 2013,我有一堆AddWithValue语句。我一直在绞尽脑汁想办法把它们转换成SQL语句 这就是它现在的样子 Dim updateStatement As String = "UPDATE Customers SET " & "Name = @NewName, " "WHERE Name = @OldName " Dim updateCommand As New OleDbCommand(updateStatement, connect

我有一堆AddWithValue语句。我一直在绞尽脑汁想办法把它们转换成SQL语句

这就是它现在的样子

Dim updateStatement As String =
        "UPDATE Customers SET " &
        "Name = @NewName, "
        "WHERE Name = @OldName "

    Dim updateCommand As New OleDbCommand(updateStatement, connection)
    updateCommand.Parameters.AddWithValue("@NewName", newCustomer.Name)
    updateCommand.Parameters.AddWithValue("@OldName", oldCustomer.Name)
连接打开,连接关闭。

有人告诉我一种不同的方法

Dim SQL as String = "UPDATE Customers SET" &
"Name = '" Customer.Name "', "
但它拒绝这样做,说只有前两个双引号是它

“Name=”“Customer.Name“,”斜体表示代码为黑色而非红色,拒绝工作

我没有使用数据库,我只是从文件本身中提取它(就好像它在Access中一样)


尽你所能帮助我!我希望我能留下它,因为如果它没有坏,就不要修理它。但是我的老师有一种搞笑的方式来与人交往。

您缺少了一些位置合适的字符串连接运算符和空格,无法正确使用语法:

Dim SQL as String = "UPDATE Customers SET " & "Name = '" & newCustomer.Name & "'"
但是,如果我将Customer.Name设置为
“maliciousUser”;DROP TABLE Customers;-“
会发生什么情况,您可能已经注意到了这方面的安全问题?不同并不一定更好


检查以下内容:

您缺少一些位置合适的字符串连接运算符和空格,无法正确使用语法:

Dim SQL as String = "UPDATE Customers SET " & "Name = '" & newCustomer.Name & "'"
但是,如果我将Customer.Name设置为
“maliciousUser”;DROP TABLE Customers;-“
会发生什么情况,您可能已经注意到了这方面的安全问题?不同并不一定更好


检查一下:

我不会给出如何正确连接查询(即将文本值连接到查询中)的答案,因为连接查询不是正确的方法

正确的方法是您最初使用的方法:使用参数

如果将文字值放入查询中,则会出现以下问题:

  • 您的代码易受攻击。这个理由足以让人永远不推荐它

  • 您可能在类型转换方面有问题,例如,当您将值作为字符串传递时,日期、时间、数字的转换必须由数据库系统转换为正确的数据类型


我不会给出如何正确连接查询(即将文本值连接到查询中)的答案,因为连接查询不是正确的方法

正确的方法是您最初使用的方法:使用参数

如果将文字值放入查询中,则会出现以下问题:

  • 您的代码易受攻击。这个理由足以让人永远不推荐它

  • 您可能在类型转换方面有问题,例如,当您将值作为字符串传递时,日期、时间、数字的转换必须由数据库系统转换为正确的数据类型


    • 不要这样做永远。它使您容易受到称为Sql注入的非常严重的安全问题的攻击

      如果您希望以不同的方式添加参数,我可以为您提供一种实际改进代码的方法:

      Dim updateStatement作为字符串=
      “更新客户集”&
      Name=@NewName
      “其中Name=@OldName”
      '您还应该以这种方式创建连接
      使用updateCommand作为新的OleDbCommand(updateStatement,connection)
      “我不得不猜测你的DB类型和长度
      updateCommand.Parameters.Add(“@NewName”,OleDbType.VarChar,50)。Value=newCustomer.Name
      updateCommand.Parameters.Add(“@OldName”,OleDbType.VarChar,50)。Value=oldCustomer.Name
      updateCommand.ExecuteOnQuery()
      终端使用
      

      使用
      .AddWithValue()
      时可能会遇到某些问题,因为它会迫使.Net猜测参数的数据库类型。有时,.Net会猜错。即使它猜错了,大多数情况下,事情通常仍然有效,但可能发生的情况是,性能将受到严重影响,因为类型不匹配会导致每行转换或中断索引的使用。

      不要这样做永远。它使您容易受到称为Sql注入的非常严重的安全问题的攻击

       ' Add CustomerID parameter for WHERE clause.
      
          command.Parameters.Add("@ID", SqlDbType.Int)
          command.Parameters("@ID").Value = customerID
      
      
          ' Use AddWithValue to assign Demographics. 
          ' SQL Server will implicitly convert strings into XML.
      
       command.Parameters.AddWithValue("@demographics", demoXml)
      
      如果您希望以不同的方式添加参数,我可以为您提供一种实际改进代码的方法:

      Dim updateStatement作为字符串=
      “更新客户集”&
      Name=@NewName
      “其中Name=@OldName”
      '您还应该以这种方式创建连接
      使用updateCommand作为新的OleDbCommand(updateStatement,connection)
      “我不得不猜测你的DB类型和长度
      updateCommand.Parameters.Add(“@NewName”,OleDbType.VarChar,50)。Value=newCustomer.Name
      updateCommand.Parameters.Add(“@OldName”,OleDbType.VarChar,50)。Value=oldCustomer.Name
      updateCommand.ExecuteOnQuery()
      终端使用
      
      使用
      .AddWithValue()
      时可能会遇到某些问题,因为它会迫使.Net猜测参数的数据库类型。有时,.Net会猜错。即使它猜错了,通常情况下大部分时间仍然有效,但可能发生的情况是性能将受到显著影响,因为类型不匹配会强制每行转换或中断索引的使用

       ' Add CustomerID parameter for WHERE clause.
      
          command.Parameters.Add("@ID", SqlDbType.Int)
          command.Parameters("@ID").Value = customerID
      
      
          ' Use AddWithValue to assign Demographics. 
          ' SQL Server will implicitly convert strings into XML.
      
       command.Parameters.AddWithValue("@demographics", demoXml)
      


      您原来的方式是正确的。不过,不要尝试连接查询。它使代码容易受到SQL注入的攻击。谁告诉你的更好?想象一下,
      Customer.Name=“ABC”;从客户中删除--”我知道原来的方法是正确的。我应该学习不同的方法。相信我。我宁愿保持原样。这不仅仅是因为原作是正确的。这个“新”的替代品是可怕的,可怕的,错误的。使用字符串连接将数据放入这样的查询中是不合适的。您最初的方法是正确的。不过,不要尝试连接查询。它使代码容易受到SQL注入的攻击。谁告诉你的更好?想象一下,
      Customer.Name=“ABC”;从客户中删除--”我知道原来的方法是正确的。我应该学习不同的w