我在组合框中使用插入语句有问题“ذكر”它工作正常,但是当组合框项目为“انثي”时它不起作用并给出此消息
*字符串或二进制数据将被截断。
*声明已被终止。
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()
答案 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
如果使用编码中的最佳实践,我们总能避免意外的结果和错误。