3

我已经检查了这个网站上的大多数论坛,但我没有得到我的解决方案。我的问题是将数据从 vb.net 插入到 MS Access,但我做不到。它没有显示任何错误,但也没有在我的表中插入值。我正在使用非常简单的代码:

Imports System.Data.OleDb

Public Class Add_LEads

    Dim conn As New OleDbConnection
    Dim cmd As New OleDbCommand
    Dim da As New OleDbDataAdapter
    Private Sub Add_LEads_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\IndGlobalDB.accdb;Persist Security Info=True;Jet OLEDB:Database Password=admin")
        lblDate.Text = Format(Date.Now, "yyyy/MM/dd")
        conn.Open()
        Dim sql As String
        Dim a As Integer
        sql = "select S_No from Leadss"
        cmd = New OleDbCommand(sql, conn)
        Dim dr As OleDbDataReader
        dr = cmd.ExecuteReader
        While dr.Read
            a = dr(0)
        End While
        lblNo.Text = a + 1
        conn.Close()
    End Sub
    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        conn.Open()
        cmd.Connection = conn
        cmd.CommandText = "INSERT INTO Leadss(S_No,Contact_Person,Mobile_No,Email_Id,Description,First_Follow_Up,Remarks,L_Date,Alternate_no)VALUES('" & lblNo.Text & "','" & txtName.Text & "','" & txtMobile.Text & "','" & txtEmail.Text & "','" & txtWebDescr.Text & "','" & txtFollowUp.Text & "','" & txtRemarks.Text & "','" & lblDate.Text & "','" & txtAlternate.Text & "')"
        cmd.ExecuteNonQuery()
        conn.Close()
        MsgBox("Saved!!!", vbOK)
    End Sub
    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Me.Close()
        Welcome.Show()
    End Sub

End Class
4

5 回答 5

1

您应该使用参数化查询来避免 Sql 注入攻击,并让 JET 引擎解析您的字符串参数以查找无效字符。

 Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
                                                                   Handles btnSave.Click 
    conn.Open() 
    cmd.Connection = conn 

    cmd.CommandText = "INSERT INTO Leadss(S_No,Contact_Person,Mobile_No,Email_Id," & _
                      "Description,First_Follow_Up,Remarks,L_Date,Alternate_no) VALUES " & _
                      "(?, ?, ?, ?, ?, ?, ?, ?, ?)"


    cmd.Parameters.Clear()
    cmd.Parameters.AddWithValue("@p1", lblNo.Text)
    cmd.Parameters.AddWithValue("@p2", txtName.Text)
    cmd.Parameters.AddWithValue("@p3", txtMobile.Text)
    cmd.Parameters.AddWithValue("@p4", txtEmail.Text)
    cmd.Parameters.AddWithValue("@p5", txtWebDescr.Text)
    cmd.Parameters.AddWithValue("@p6", txtFollowUp.Text)
    cmd.Parameters.AddWithValue("@p7", txtRemarks.Text)
    cmd.Parameters.AddWithValue("@p8", lblDate.Text)
    cmd.Parameters.AddWithValue("@p9", txtAlternate.Text)
    cmd.ExecuteNonQuery() 
    conn.Close() 
End Sub 

也就是说,这仅在您的字段类型是文本类型而不是数字或日期时间或布尔值时才有效,在这种情况下,您应该使用 Convert.ToXXXXX 方法将输入文本转换为适当的类型。
(下面的示例假设您的输入包含有效的数字和日期)

....
cmd.Parameters.AddWithValue("@p3", Convert.ToInt32(txtMobile.Text))
.....
cmd.Parameters.AddWithValue("@p8", Convert.ToDateTime(lblDate.Text))
cmd.Parameters.AddWithValue("@p9", Convert.ToInt32(txtAlternate.Text))

另一个错误的方法是保留全局变量以供重用,例如 OleDbConnection、OleDbCommand。这可以防止运行时在不使用时处理这些对象。相反,您应该遵循这种方法

 Using conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data " +
                  "Source=|DataDirectory|\IndGlobalDB.accdb;" +
                   "Persist Security Info=True;Jet OLEDB:Database Password=admin")   
    Using cmd = New OleDbCommand()
        conn.Open() 
        cmd.Connection = conn 
        cmd.CommandText = "INSERT INTO ................"
        cmd.Parameters.AddWithValue("@p1", lblNo.Text)
        ..........
    End Using
End Using
于 2012-10-18T12:28:57.533 回答
0

在您的声明中使用反引号 ( `) 。FROM应该是FROM(`Field1`,`Field2`,...etc) Values('value1', 'value2')

于 2013-07-28T05:13:35.340 回答
0

下面是一个使用 SqlParameter 和 try/catch 块的简单示例:

Dim connection As SqlConnection = As New SqlConnection("YourDbConnection")
Dim command As SqlCommand = connection.CreateCommand()

Try
    connection.Open()
    command.CommandText = "INSERT INTO Leadss(S_No) VALUES (@S_No)"
    command.Parameters.Add("@S_No", SqlDbType.Text)
    command.Parameters["@FirstName"].Value = lblNo.Text
    command.ExecuteNonQuery()
Catch Ex As SqlException
    'Process the exception
Finally
    connection.Close()
End Try
于 2012-10-18T12:40:21.553 回答
0

根据您的数据库名称,表名称,保存按钮的单击事件中的字段名称编写此编码...

 Using conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\user\Documents\Visual Studio 2008\Projects\demo for db in access\demo for db in access\DatabaseforDemo.accdb'")
        Using cmd = New OleDbCommand()
            conn.Open()
            cmd.Connection = conn
            cmd.CommandText = "INSERT INTO demo1(Name) VALUES('" & TextBox1.Text & "')"
            'cmd.Parameters.AddWithValue("@p1", lblNo.Text)
            cmd.ExecuteNonQuery()
            MsgBox("saved..")
            conn.Close()
        End Using
    End Using

祝你好运......希望它会帮助你......!

于 2015-02-27T11:26:04.177 回答
0

在你的问题中你说:

它没有显示任何错误,但也没有在我的表中插入值

尝试使用提交。

SQL 中的COMMIT语句结束关系数据库管理系统 (RDBMS) 中的事务,并使所有更改对其他用户可见。一般格式是发出 BEGIN WORK 语句、一个或多个 SQL 语句,然后是 COMMIT 语句。或者,可以发出 ROLLBACK 语句,该语句撤消自发出 BEGIN WORK 以来执行的所有工作。COMMIT 语句还将释放任何可能正在使用的现有保存点。在事务方面,commit 的反面是丢弃一个事务的试探性更改,即回滚。

此处引用:提交(数据管理)

Try
    'Open Connection...

        'Insert Statement....

        'Notification / Msgbox to confirm successful transaction

    Catch ex As Exception
        'RollBack Transaction...
        'Error Management...

    Finally
        'Commit...
        'Close DB Connection....
    End Try

Microsoft 文档:OleDbTransaction.Commit 方法 ()

但请记住:只有在插入/更新多个 SQL 语句时才应该使用事务,这对回滚有意义。

这是使用 MS Access 2010 在表单中添加事务管理的示例

于 2015-12-15T02:17:31.920 回答