Vb.net 如何修复从visual basic 2010连接到ms access数据库时出现的溢出异常

Vb.net 如何修复从visual basic 2010连接到ms access数据库时出现的溢出异常,vb.net,visual-studio-2010,ms-access,Vb.net,Visual Studio 2010,Ms Access,我不熟悉visual basic。我正在用visual basic 2010为我的小项目开发一个项目。我想将以visual basic表单插入的数据存储到ms access 2007中创建的数据库中。我键入了以下代码,但每次我在表单中输入值并按submit键时,我都会在一个消息框中看到异常“溢出”。我找不出原因。请帮帮我 代码如下: Imports System.Data.OleDb Public Class dn_register Dim provider As String

我不熟悉visual basic。我正在用visual basic 2010为我的小项目开发一个项目。我想将以visual basic表单插入的数据存储到ms access 2007中创建的数据库中。我键入了以下代码,但每次我在表单中输入值并按submit键时,我都会在一个消息框中看到异常“溢出”。我找不出原因。请帮帮我

代码如下:

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

首先尝试缩小导致问题的参数范围。您可以注释掉所有参数并重新添加它们,直到发现问题为止(根据需要调整SQL语句以匹配参数计数),也可以选择一个可能的可疑对象并注释掉它,然后继续注释掉参数并调整SQL语句,直到它起作用为止。您可能需要临时调整Access中的表,以允许测试列中出现空值。整数值似乎是一个很可能的候选值,我将从这里开始


一旦找到有问题的参数,很明显VB.NET和Access之间存在数据类型冲突或不匹配,或者您可能需要进行一些实验,以找到哪种VB cast可以工作。在您的示例中,下一个最有可能出现的问题是字符串长度问题,从表定义和文本框输入长度限制来看,这一点非常明显。

我猜这一行引发了异常:

cmd.Parameters.Add(新的OLEDB参数(“年龄”,CType(TextBox2.Text,整数)))

我的第一个建议是使用适当的控件来处理数字输入,例如NumericUpDown控件

我的第二个建议(如果您继续使用文本框)是使用显式地将字符串值转换为整数

我的第三个建议是停止对字符串值(textBox[n].Text)使用CType将其转换为字符串,这是不必要的

我的第四个建议是使用,因为它将使用传递的值的数据类型

我的第五个也是最后一个建议是使用语句包装实现iDisposable的对象,或者至少显式地处理它们

下面是实施建议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

从这里开始:我相信您的insert查询可能不正确。如果不查看表结构,很难判断您的查询参数是否错误。最可疑的部分是
cmd.Parameters.Add(新的OleDbParameter(“Age”,CType(TextBox2.Text,Integer))
,因为
Age
列经常使用
Byte
数据类型。请注意,存储捐赠者的年龄不是一个好主意,我会存储他们的DOB。确保字符串的长度正确。此外,VB.NET中的整数是4个字节,而Access中的整数是2个字节。您可能希望在.NET中使用
Int16