0

我正在使用 vb.net,我想从我的 Windows 窗体中向我的数据库表“adwPays”中插入一行。这是我的代码: Dim CC、EngName、FreName、LanCode As String Dim DialCode As Integer

    CC = txtCC.Text
    EngName = txtEN.Text
    FreName = txtFN.Text
    LanCode = txtLC.Text
    DialCode = txtDC.Text


    Dim MyConn As New SqlConnection("Server=(local);Database=dbAjout;Integrated Security=True")
    Dim query As String
    query = "INSERT INTO adwPays (CC, Anglais,Francais,CodeLangue,IndicInter) VALUES ( ' " & CC & "','" & EngName & "','" & FreName & "','" & LanCode & "','" & DialCode & " ');"

    Dim cmd As New SqlCommand(query, MyConn)

    MyConn.Open()
    cmd.ExecuteScalar()
    MyConn.Close()

但是它给了我这个错误“System.Data.dll中发生了'System.Data.SqlClient.SqlException'类型的未处理异常

附加信息:字符串或二进制数据将被截断。该语句已终止。”

有什么帮助吗?

4

2 回答 2

0

听起来您的String值比数据库类型大小允许的长。您能否验证以下每个字段的类型和大小:

  • 抄送
  • 姓名
  • 名称
  • 局域网

现在将这些尺寸与您从 UI 中提取它们的文本框字段中的值进行交叉引用。

我的钱花在了超出数据库大小限制的其中之一上。

如果是这种情况,那么您需要在尝试保存到数据库之前引入长度检查。

于 2013-07-09T13:33:02.153 回答
0

使用这样的参数化查询

Dim query  = "INSERT INTO adwPays (CC, Anglais,Francais,CodeLangue,IndicInter) " & 
             "VALUES (@cc, @ename, @fname, @lan, @dial)"
Using MyConn = New SqlConnection("Server=(local);Database=dbAjout;Integrated Security=True")
Using cmd = New SqlCommand(query, MyConn)
    cmd.Parameters.AddWithValue("@cc", CC)
    cmd.Parameters.AddWithValue("@ename", EngName)
    cmd.Parameters.AddWithValue("@fname", FreName)
    cmd.Parameters.AddWithValue("@lan", LanCode)
    cmd.Parameters.AddWithValue("@dial", DialCode)
    MyConn.Open()
    cmd.ExecuteNonQuery()
End Using
End Using

使用参数化查询可以避免 Sql Injections 的问题,并从围绕字符串和日期的格式引号中清除命令文本,还可以让框架代码在需要时为数字类型传递正确的小数点

我还在 SqlConnection 和 SqlCommand 周围添加了一个Using 语句,以确保对象被关闭和销毁。参数全部作为字符串传递,如果您的任何数据库字段不是文本类型,这可能是错误的。

于 2013-07-09T13:29:31.810 回答