从 visual basic 2010 连接到 ms access 数据库时如何修复溢出异常
HOW to fix overflow exception while connecting to ms access database from visual basic 2010
我是 Visual Basic 新手。我正在为我的 mini project.I 在 visual basic 2010 中开发一个项目,想将我以 visual basic 形式插入的数据存储到在 ms access 2007.I 中创建的数据库中,但是,每次我输入将值输入表单并按提交我在消息框中收到异常 "overflow" 。我无法找出原因。请帮帮我。
代码如下:
Imports System.Data.OleDb
Public Class dn_register
Dim provider As String
Dim dataFile As String
Dim connString As String
Dim myConnection As OleDbConnection = New OleDbConnection
Private Sub dn_sub_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dn_sub.Click
provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
dataFile = "F:\MyDatabase\MyProjectDatabase.accdb"
connString = provider & dataFile
myConnection.Close()
myConnection.ConnectionString = connString
myConnection.Open()
Dim str As String
str = "Insert into Dnr_tbl([Dname],[Age],[Bloodgroup],[Location],[Contact],[Email]) Values(?,?,?,?,?,?)"
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
cmd.Parameters.Add(New OleDbParameter("Dname", CType(TextBox1.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Age", CType(TextBox2.Text, Integer)))
cmd.Parameters.Add(New OleDbParameter("Bloodgroup", CType(TextBox3.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Location", CType(TextBox4.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Contact", CType(TextBox5.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Email", CType(TextBox6.Text, String)))
Try
cmd.ExecuteNonQuery()
cmd.Dispose()
myConnection.Close()
TextBox1.Clear()
TextBox2.Clear()
TextBox3.Clear()
TextBox4.Clear()
TextBox5.Clear()
TextBox6.Clear()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class
And here is the snapshot of my error message
首先尝试缩小导致问题的参数范围。您可以注释掉所有参数并将它们添加回来,直到找到问题(根据需要调整 SQL 语句以匹配参数计数)或选择一个可能的可疑对象并将其注释掉并继续注释掉参数和调整 SQL 语句直到它起作用。您可能需要临时调整 Access 中的 table 以允许测试列中的空值。整数值似乎是一个可能的候选者,我会从那里开始。
一旦找到问题参数,可能很明显 VB.NET 和 Access 之间存在数据类型冲突或不匹配,或者您可能需要进行一些试验才能找到哪个 VB 转换有效.在您的示例中,下一个最有可能的候选人是字符串长度问题,通过查看 table 定义和您的文本框输入长度限制,这将是非常明显的。
我猜这行抛出异常:
cmd.Parameters.Add(New OleDbParameter("Age", CType(TextBox2.Text, Integer)))
我的第一个建议是使用适当的控件来处理数字输入,例如 NumericUpDown 控件。
我的第二个建议(如果您继续使用文本框)是使用 Integer.TryParse.
将字符串值显式转换为整数
我的第三个建议是停止在字符串值 (textBox[n].Text) 上使用 CType 将它们转换为字符串,这是不必要的。
我的第四个建议是改用 Parameter.AddWithValue,因为它将使用传递值的数据类型。
我的第五个也是最后一个建议是将实现 iDisposable 的对象包装在 Using 语句中,或者至少显式处理它们。
下面是实现建议2-5的例子,如果你采纳了我的第一个建议,那么#2就不需要了:
'Declare an age variable that is an Integer
Dim age As Integer
'Convert the String to an Integer
If Integer.TryParse(TextBox2.Text, age) Then
'Declare the connection object
Dim con As OleDbConnection
'Database operations should always be wrapped in Try/Catch
Try
'Set the connection object to a new instance
con = New OleDbConnection(connString)
'Create a new instance of the command object
Using cmd As OleDbCommand = New OleDbCommand("INSERT INTO [Dnr_tbl] ([Dname], [Age], [Bloodgroup], [Location], [Contact], [Email]) VALUES (@name, @age, @bloodgroup, @location, @contact, @email)", con)
'Parameterize the query
With cmd.Parameters
.AddWithValue("@name", TextBox1.Text)
.AddWithValue("@age", age)
.AddWithValue("@bloodgroup", TextBox3.Text)
.AddWithValue("@location", TextBox4.Text)
.AddWithValue("@contact", TextBox5.Text)
.AddWithValue("@email", TextBox6.Text)
End With
'Open the connection
con.Open()
'Execute the query
cmd.ExecuteNonQuery()
'Close the connection
con.Close()
'Clear the controls
TextBox1.Clear() : TextBox2.Clear() : TextBox3.Clear() : TextBox4.Clear() : TextBox5.Clear() : TextBox6.Clear()
End Using
Catch ex As Exception
MessageBox.Show(ex.ToString())
Finally
'Check if the connection object was initialized
If con IsNot Nothing Then
If con.State = ConnectionState.Open Then
'Close the connection if it was left open(exception thrown)
con.Close()
End If
'Dispose of the connection object
con.Dispose()
End If
End Try
Else
MessageBox.Show("Invalid age input.")
End If
我是 Visual Basic 新手。我正在为我的 mini project.I 在 visual basic 2010 中开发一个项目,想将我以 visual basic 形式插入的数据存储到在 ms access 2007.I 中创建的数据库中,但是,每次我输入将值输入表单并按提交我在消息框中收到异常 "overflow" 。我无法找出原因。请帮帮我。
代码如下:
Imports System.Data.OleDb
Public Class dn_register
Dim provider As String
Dim dataFile As String
Dim connString As String
Dim myConnection As OleDbConnection = New OleDbConnection
Private Sub dn_sub_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dn_sub.Click
provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
dataFile = "F:\MyDatabase\MyProjectDatabase.accdb"
connString = provider & dataFile
myConnection.Close()
myConnection.ConnectionString = connString
myConnection.Open()
Dim str As String
str = "Insert into Dnr_tbl([Dname],[Age],[Bloodgroup],[Location],[Contact],[Email]) Values(?,?,?,?,?,?)"
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
cmd.Parameters.Add(New OleDbParameter("Dname", CType(TextBox1.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Age", CType(TextBox2.Text, Integer)))
cmd.Parameters.Add(New OleDbParameter("Bloodgroup", CType(TextBox3.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Location", CType(TextBox4.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Contact", CType(TextBox5.Text, String)))
cmd.Parameters.Add(New OleDbParameter("Email", CType(TextBox6.Text, String)))
Try
cmd.ExecuteNonQuery()
cmd.Dispose()
myConnection.Close()
TextBox1.Clear()
TextBox2.Clear()
TextBox3.Clear()
TextBox4.Clear()
TextBox5.Clear()
TextBox6.Clear()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class
And here is the snapshot of my error message
首先尝试缩小导致问题的参数范围。您可以注释掉所有参数并将它们添加回来,直到找到问题(根据需要调整 SQL 语句以匹配参数计数)或选择一个可能的可疑对象并将其注释掉并继续注释掉参数和调整 SQL 语句直到它起作用。您可能需要临时调整 Access 中的 table 以允许测试列中的空值。整数值似乎是一个可能的候选者,我会从那里开始。
一旦找到问题参数,可能很明显 VB.NET 和 Access 之间存在数据类型冲突或不匹配,或者您可能需要进行一些试验才能找到哪个 VB 转换有效.在您的示例中,下一个最有可能的候选人是字符串长度问题,通过查看 table 定义和您的文本框输入长度限制,这将是非常明显的。
我猜这行抛出异常:
cmd.Parameters.Add(New OleDbParameter("Age", CType(TextBox2.Text, Integer)))
我的第一个建议是使用适当的控件来处理数字输入,例如 NumericUpDown 控件。
我的第二个建议(如果您继续使用文本框)是使用 Integer.TryParse.
将字符串值显式转换为整数我的第三个建议是停止在字符串值 (textBox[n].Text) 上使用 CType 将它们转换为字符串,这是不必要的。
我的第四个建议是改用 Parameter.AddWithValue,因为它将使用传递值的数据类型。
我的第五个也是最后一个建议是将实现 iDisposable 的对象包装在 Using 语句中,或者至少显式处理它们。
下面是实现建议2-5的例子,如果你采纳了我的第一个建议,那么#2就不需要了:
'Declare an age variable that is an Integer
Dim age As Integer
'Convert the String to an Integer
If Integer.TryParse(TextBox2.Text, age) Then
'Declare the connection object
Dim con As OleDbConnection
'Database operations should always be wrapped in Try/Catch
Try
'Set the connection object to a new instance
con = New OleDbConnection(connString)
'Create a new instance of the command object
Using cmd As OleDbCommand = New OleDbCommand("INSERT INTO [Dnr_tbl] ([Dname], [Age], [Bloodgroup], [Location], [Contact], [Email]) VALUES (@name, @age, @bloodgroup, @location, @contact, @email)", con)
'Parameterize the query
With cmd.Parameters
.AddWithValue("@name", TextBox1.Text)
.AddWithValue("@age", age)
.AddWithValue("@bloodgroup", TextBox3.Text)
.AddWithValue("@location", TextBox4.Text)
.AddWithValue("@contact", TextBox5.Text)
.AddWithValue("@email", TextBox6.Text)
End With
'Open the connection
con.Open()
'Execute the query
cmd.ExecuteNonQuery()
'Close the connection
con.Close()
'Clear the controls
TextBox1.Clear() : TextBox2.Clear() : TextBox3.Clear() : TextBox4.Clear() : TextBox5.Clear() : TextBox6.Clear()
End Using
Catch ex As Exception
MessageBox.Show(ex.ToString())
Finally
'Check if the connection object was initialized
If con IsNot Nothing Then
If con.State = ConnectionState.Open Then
'Close the connection if it was left open(exception thrown)
con.Close()
End If
'Dispose of the connection object
con.Dispose()
End If
End Try
Else
MessageBox.Show("Invalid age input.")
End If