2012-10-18 56 views
2

我已經檢查了本網站上的大部分論壇,但是沒有得到我的解決方案。 我的問題是從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 
+0

爲例你問[SQL注入攻擊(http://en.wikipedia.org/wiki/SQL_injection)。 – Eonasdan

+0

你從「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&「')」「 – andy

+0

使用try/catch語句塊查看可能出錯的內容。也出於安全原因,請使用SqlParameters而不是直接將TextBox值放入您的SQL語句中。 – Abbas

回答

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 
+0

仍然不工作......我也應用了你的代碼......我不知道我要去哪裏錯...... .....Steve – user1756139

+0

它也沒有顯示任何錯誤。 – user1756139

+0

您是否複製了與數據庫文件關聯的Local = true?如果數據庫包含在項目中,則每次啓動調試會話時都會重新進行復制。 – Steve

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 
0

使用反引號(`)在FROM聲明。它應該是FROM(`Field1`,`Field2`,...etc) Values('value1', 'value2')

0

根據你的數據庫名,表名,字段名在保存按鈕的Click事件寫這個編碼...

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 

好運... 希望所以它會幫助你...!

0

在你的問題,你說:

它沒有表現出任何錯誤,而且它不是我的表中插入值

嘗試使用提交。

一個COMMIT在SQL語句中關係數據庫管理系統(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