使用vb.net在MS Access中插入和更新值

时间:2012-10-18 11:56:07

标签: vb.net ms-access

我已检查过本网站上的大多数论坛,但我没有得到我的解决方案。 我的问题是将数据从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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分: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
祝你好运...... 希望如此,它会帮助你......!

答案 4 :(得分:0)

在你的问题中你说:

  

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

尝试使用Commit。

  

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

引用此处:Commit (data management)

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 Documentation: OleDbTransaction.Commit Method ()

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

以下是Adding transaction management into a form using MS Access 2010

中的示例