2014-05-21 66 views
0

每次尝试向我的数据库表中添加信息时,都会产生错误。将信息添加到数据库时出现System.ArgumentException

Error: An unhandled exception of type 'System.ArgumentException' occurred in System.Data.dll 

Additional information: Input string was not in a correct format.Couldn't store <JHK> in KEY TAG Column. Expected type is Int32. 

这是我的代码到目前为止。

Imports System 
Imports System.Data 
Imports System.Data.OleDb 

Public Class add_new_key_window 

Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 

End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Me.Close() 
End Sub 

Private Sub add_new_key_window_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    'saveRecord() 
    management_window.RKM_SystemTableAdapter.Insert(Me.TextBox1.Text, Me.TextBox2.Text, Me.TextBox3.Text, Me.TextBox4.Text, Me.TextBox5.Text, Me.TextBox6.Text, Me.RichTextBox1.Text) 
    management_window.RKM_SystemTableAdapter.Fill(management_window.RKM_System_dataDataSet.RKM_System) 
    clearTextboxes() 
End Sub 

'Public Sub saveRecord() 
' Dim cn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & Application.StartupPath & "\RKM System data.accdb") 
' Dim str As String 

' Try 
'  cn.Open() 
'  Dim cmd As New System.Data.OleDb.OleDbCommand("INSERT INTO [RKM System]([KEY TAG], LOCATION, [HOOK NO], [KEY TYPE], BRAND, SERIAL, [TAG COLOR], NOTES) " & _ 
'              "VALUES ('" & TextBox1.Text & "','" & TextBox2.Text & "','1','" & TextBox3.Text & _ 
'              "','" & TextBox4.Text & "','" & TextBox5.Text & "','" & TextBox6.Text & _ 
'              "','" & RichTextBox1.Text & "') ", cn) 
'  str = cmd.ExecuteNonQuery 
'  MsgBox("The new record was inserted successfully!") 

' Catch ex As Exception 
'  MsgBox("Error message: " & ex.Message) 
' End Try 
' cn.Close() 
'End Sub 

Public Sub clearTextboxes() 
    TextBox1.Clear() 
    TextBox2.Clear() 
    TextBox3.Clear() 
    TextBox4.Clear() 
    TextBox5.Clear() 
    TextBox6.Clear() 
    RichTextBox1.Clear() 
End Sub 

End Class 

回答

0

您需要的值转换在textbox1.text为整数 - 目前它特林字符串存储在一个Int32场

例如Access数据库可以有一个字段的类型为“数字”,你必须将其中的某种数字。您试图直接将文本框的内容放入不是数字的字段中,它是一个字符串。因此,您需要使用“int.Parse(textbox1.Text)”或类似方法将文本框中的数据“转换”为正确的类型。

顺便说一句,你应该从不使用内联语句创建这样的SQL查询时。使用SQL参数,否则你打开自己的潜在的SQL注入攻击。

例如(在C#不算太出色了我的VB!):

var cmd = new System.Data.OleDb.OleDbCommand("INSERT INTO table1 (firstname, lastname) VALUES (@firstname, @lastname)"); 

cmd.Parameters.AddWithValue("@id", (int)textbox1.text); 
cmd.Parameters.AddWithValue("@firstname", textbox2.text); 

欲了解更多信息请参阅

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

+1

Int.TryParse是你的朋友... –

+0

冬青牛...我忘了提及...我是一个非常初学者。我知道需要解释很多,但我对编码充满激情,我想学习。有没有解释的机会,你会向初学者解释?非常感谢你快速回来。 – Kobra

+0

在关于语法错误的问题流向你之前,你可能想现在把它转换成VB。另外,您要添加两次TB1,而OleDb实际上并不使用可能会引起误解的命名参数。 – Plutonix

0
Public Sub saveRecord() 
    Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & 
       myDbFileName) 

    Dim SQL as String = "INSERT INTO [RKM System]([KEY TAG], LOCATION, [HOOK NO], 
      [KEY TYPE], BRAND, SERIAL, [TAG COLOR], NOTES) 
      VALUES (?, ?, ?, ?, ?, ?, ?, ?)" 
      ' ? = a place holder for a parameter to be added later 

    Try 
     cn.Open() 

     Using cmd As New OleDBCommand(SQL, cn) 
      ' add param values IN ORDER SPECIFIED 
      cmd.Parameters.AddWithValue("@p1", Convert.ToInt32(TextBox1.Text)) 
      cmd.Parameters.AddWithValue("@p2", TextBox2.Text) 
      ' etc 
      ' number of AddWithValue lines must = number of "?" in SQL 

      cmd.ExecuteNonQuery 
     End Using   ' disposes of the OLEDbCOmmand object 


     MessageBox.Show("The new record was inserted successfully!") 

    Catch ex As Exception 
     MessageBox.Show("Error message: " & ex.Message) 
    End Try 
    cn.Close() 
End Sub 

参数避免SQL注入攻击(阅读了关于这个)。由于[KEY TAG]是数据库中的一个整数列,而TextBox1.Text是字符串(总是),因此您需要使用Convert.ToInt32来转换该值(因为它是用户输入,所以在实际情况下应实际使用Integer.TryParse他们进入“红色”或“Ziggy”)。

命名参数的简单占位OLEDB对待,所以这可以给你带来麻烦:

Dim SQL As String = "INSERT INTO Employee (FirstName, LastName) 
      Values (@FName, @LName)" 

     cmd.Parameters.AddWithValue("@LName", TextBox1.Text) 
     cmd.Parameters.AddWithValue("@FName", TextBox2.Text) 

TextBox1的将映射到名字,因为它是在SQL第一列名。

相关问题