从 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 在 vi​​sual 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