insert语句sql vb

时间:2015-10-01 21:18:35

标签: sql vb.net combobox

我在组合框中使用插入语句有问题“ذكر”它工作正常,但是当组合框项目为“انثي”时它不起作用并给出此消息

*字符串或二进制数据将被截断。

*声明已被终止。

Dim char1 As String
Dim char2 As String = TextBox7.Text.Substring(0, 4)
Dim char3 As String = Label29.Text
'******************* تاريخ انتهاء صلاحية الشهادة الصحية'
If TextBox9.Text.Length = 10 Then
    HealthyIssue = TextBox9.Text
    HealthyExpire = HealthyIssue.AddDays(364)
    If ComboBox2.SelectedItem = "انثي" Then
        char1 = 2
        TextBox18.Text = char1 & char2 & char3
    ElseIf ComboBox2.SelectedItem = "ذكر" Then
        char1 = 1
        TextBox18.Text = char1 & char2 & char3
    End If

    Dim connString As String = "...................."
    Dim myConnection As SqlConnection = New SqlConnection(connString)
    myConnection.Open()
    Dim ss As String
    ss = "INSERT INTO PersonalData ([Name], [IDNo], [Gender], [PlaceOfWork],[birthPlace], [PassportNo], [Nationality], [SocialState], [Occupation], [Mobile], [VisaNo], [VisaIssueDate], [VisaExpireDate], [EntryDate], [HealthyIssueDate], [HealthyExpireDate], [ContractIssue], [Guarantor], [Guarantorplace], [GuarantorPhoneNo], [Note]) VALUES (@Name, @IDNo, @Gender,  @PlaceOfWork, @birthPlace, @PassportNo, @Nationality, @SocialState, @Occupation, @Mobile, @VisaNo, @VisaIssueDate, @VisaExpireDate, @EntryDate, @HealthyIssueDate, @HealthyExpireDate, @ContractIssue, @Guarantor, @Guarantorplace,  @GuarantorPhoneNo, @Note) "
    Dim cmdd As SqlCommand = New SqlCommand(ss, myConnection)
    cmdd.Parameters.AddWithValue("@Name", TextBox1.Text)
    cmdd.Parameters.AddWithValue("@IDNo", TextBox18.Text)
    cmdd.Parameters.AddWithValue("@Gender", ComboBox2.SelectedItem)
    cmdd.Parameters.AddWithValue("@PlaceOfWork", TextBox19.Text)
    cmdd.Parameters.AddWithValue("@birthPlace", TextBox7.Text)
    cmdd.Parameters.AddWithValue("@PassportNo", TextBox6.Text)
    cmdd.Parameters.AddWithValue("@Nationality", ComboBox3.Text)
    cmdd.Parameters.AddWithValue("@SocialState", TextBox8.Text)
    cmdd.Parameters.AddWithValue("@Occupation", ComboBox4.Text)
    cmdd.Parameters.AddWithValue("@Mobile", TextBox5.Text)
    cmdd.Parameters.AddWithValue("@VisaNo", TextBox14.Text)
    cmdd.Parameters.AddWithValue("@VisaIssueDate", TextBox15.Text)
    cmdd.Parameters.AddWithValue("@VisaExpireDate", TextBox16.Text)
    cmdd.Parameters.AddWithValue("@EntryDate", TextBox17.Text)
    cmdd.Parameters.AddWithValue("@HealthyIssueDate", TextBox9.Text)
    cmdd.Parameters.AddWithValue("@HealthyExpireDate", HealthyExpire)
    cmdd.Parameters.AddWithValue("@ContractIssue", TextBox10.Text)
    cmdd.Parameters.AddWithValue("@Guarantor", TextBox11.Text)
    cmdd.Parameters.AddWithValue("@Guarantorplace", TextBox12.Text)
    cmdd.Parameters.AddWithValue("@GuarantorPhoneNo", TextBox13.Text)
    cmdd.Parameters.AddWithValue("@Note", TextBox19.Text)
    cmdd.ExecuteNonQuery()
    cmdd.Dispose()

2 个答案:

答案 0 :(得分:1)

对于与SQL表相关的错误,在您的问题中提供表定义(或其相关部分)通常是个好主意。根据你现在在问题中的内容......

有效的那个似乎是3个字符,而那个似乎不是4个字符。

您的列可能定义为NVARCHAR(3)或NCHAR(3)。

如果定义为更宽,则数据库列类型可能是CHAR或VARCHAR,而不是NCHAR或NVARCHAR。

“ذكر”的Unicode表示中的字节数足够短,以适应指定的存储量,但“انثي”中的字节数不是。

答案 1 :(得分:0)

问题是列长度不等于来自combobox项的字符串。

两种纠正方法是修改表结构以调整该输入的列长度,或者将用户输入验证为仅3个字符。

一点建议,最好使用STORED PROCEDURE,因为内联SQL语句容易受到SQL注入攻击。特别是当您在查询中传递STRING时。

此外,如果想要避免意外结果或错误,只需最小化使用.Parameters.AddWithValue,因为在那种过程中数据类型参数未定义好,您可以使用.Parameters.Add替换它然后您可以定义数据类型。

类似的东西:

    .Parameters.Add("@ParameterName", DataType, Lenght).Value = ValueHere

    .Parameters.Add("@IDNo", SqlDbType.Int, 5).Value = TextBox18.Text

如果使用编码中的最佳实践,我们总能避免意外的结果和错误。