【问题标题】:VB.Net - Inserting data to Access Database using OleDbVB.Net - 使用 OleDb 将数据插入 Access 数据库
【发布时间】:2016-03-03 06:47:50
【问题描述】:

您能告诉我我使用的代码有什么问题吗?每次我执行这个,它都会抛出异常(无法连接到数据库)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim conn As New System.Data.OleDb.OleDbConnection()

conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\socnet.accdb"

Dim sql As String = String.Format("INSERT INTO login     VALUES('{username}','{password}','{secques}','{secans}')", txt_username.Text, txt_passwd.Text, txt_secquestion.Text, txt_secansw.Text)

            Dim sqlCom As New System.Data.OleDb.OleDbCommand(sql)

            'Open Database Connection
            sqlCom.Connection = conn
            conn.Open()
            Dim icount As Integer = sqlCom.ExecuteNonQuery
            MessageBox.Show(icount)
            MessageBox.Show("Successfully registered..", "Success", MessageBoxButtons.OK, MessageBoxIcon.Error)

        Catch ex As Exception
            MessageBox.Show("Failed to connect to Database..", "Database Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

        cmd_submit2_Click(sender, e)

    End If
End Sub

如果有帮助,我正在使用 Access 2013 和 VS 2015 社区。谢谢。

【问题讨论】:

  • 如果无法连接到数据库,则错误在您的连接字符串中。你能加吗?你在哪里初始化全局 conn 变量?
  • 顺便说一句,我忘了包括有一个连接字符串。 Dim conn As New System.Data.OleDb.OleDbConnection() conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\socnet.accdb"
  • 嗨,史蒂夫,感谢您指出这一点。我已经更新了我的代码。仍然出现同样的错误。
  • 在桌面应用程序中使用 DataDirectory 意味着您的数据库位于 BIN\DEBUG 文件夹中。但是更好地查看您的代码,该错误消息是无用的,因为隐藏了真正的错误。请为调试工作将其更改为 MessageBox.Show(ex.Message) 并告诉我们异常中引发的真正错误是什么
  • 最好学会使用参数来避免sql注入和格式化问题。名为 O'Brien 的人将无法通过您的查询。最好包含字段名称。

标签: vb.net ms-access oledb


【解决方案1】:

您应该对命令使用参数化方法。 参数化查询消除了 Sql Injection 的可能性,如果您的字符串值格式不正确,您将不会收到错误。

请注意,如果您没有在异常块中执行任何操作,那么最好将其删除并让异常自行显示或至少显示 Exception.Message 值,以便您了解实际错误。

最后,每个一次性对象都应使用 Using 语句创建,以确保正确关闭和处置此类对象(尤其是 OleDbConnection)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim sql As String = "INSERT INTO login VALUES(@name, @pass, @sec, @sw)"
    Using conn = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\socnet.accdb")
    Using sqlCom = New System.Data.OleDb.OleDbCommand(sql, conn)
         conn.Open()
         sqlCom.Parameters.Add("@name", OleDbType.VarWChar).Value = txt_username.Text
         sqlCom.Parameters.Add("@pass", OleDbType.VarWChar).Value = txt_passwd.Text
         sqlCom.Parameters.Add("@sec", OleDbType.VarWChar).Value = txt_secquestion.Text
         sqlCom.Parameters.Add("@sw", OleDbType.VarWChar).Value =  txt_secansw.Text 
         Dim icount As Integer = sqlCom.ExecuteNonQuery
    End Using
    End Using
End Sub

请记住,在 INSERT INTO 语句中省略字段名称要求您为登录表中存在的每个字段提供值,并且按照表所期望的确切顺序(因此最好插入字段名称)

例如,如果您的表格只有 4 个已知字段:

Dim sql As String = "INSERT INTO login (username, userpass, secfield, secfieldsw) " & _ 
                    "VALUES(@name, @pass, @sec, @sw)"

【讨论】:

  • 谢谢!但是,使用上面的代码给了我一个System.Data.dll 中发生“System.Data.OleDb.OleDbException”类型的未处理异常:查询值和目标字段的数量不相同。 异常.
  • 如答案最后一部分所述。如果您的表有 5 列(或更多),那么值较少的 INSERT INTO 将失败。您应该添加缺失值或声明哪些字段接收值
  • 谢谢。我现在知道错误了。我的表有 5 列,第一列是主键(自动编号的“ID”)。
  • 在这种情况下,字段名称是强制性的,除了 ID 字段
  • 我尝试使用 "INSERT INTO login " + "(user_name, pass_word, secques, secans)" + "VALUES(@name, @pass, @sec, @sw)" 。它没有显示任何错误或异常,但我的表格仍然是空白的。
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 2019-08-05
  • 1970-01-01
  • 2015-05-13
相关资源
最近更新 更多