2017-04-25 204 views
0

我試圖插入數據到數據庫中使用登錄窗體中,但代碼似乎不工作。沒有錯誤發生,它看起來像我運行代碼時沒有發生任何事情。無法插入到MS Access數據庫

代碼:

Imports System.Data.OleDb 

Public Class Form2 
Dim provider As String 
Dim datafile As String 
Dim connstring As String 
Dim myconnection As OleDbConnection = New OleDbConnection 
Dim Mode As String 

Private Sub btnSignin_Click(sender As Object, e As EventArgs) Handles btnSignin.Click 


    ' Enable the Insert/Update/Delete buttons. 
    btnSignin.Enabled = True 

    ' Test for the Mode of the form and perform the necessary actions accordingly. 
    Select Case Mode 
     Case "INSERT" ' If the mode is INSERT, perform a new record insertion. 
      Try 
       ' Declare the connection and command objects. 
       Dim connection As New OleDb.OleDbConnection 
       Dim command As New OleDb.OleDbCommand 

       ' Set the ConnectionString property and open the database connection. 
       connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\Dentist Pat 2\Dentist Pat 2\Users.accdb;_Name=;_Surname=;_Username=;_Password=;" 
       connection.Open() 

       ' Set the Connection and CommandText properties of the command. 
       command.Connection = connection 
       command.CommandText = "INSERT INTO Users (_Name,_Surname,_Password,_Username) VALUES (@Name,@Surname,@Password,@Username)" 

       ' Declare and initialize the parameters required by the command object. 
       Dim parName = New OleDb.OleDbParameter("@Name", txtName.Text) 
       Dim parSurname = New OleDb.OleDbParameter("@Surname", txtSurname.Text) 
       Dim parUsername = New OleDb.OleDbParameter("@Username", txtUsername.Text) 
       Dim parPassword = New OleDb.OleDbParameter("@Password", txtPassword.Text) 

       ' Add the parameters to the command object. 
       command.Parameters.Add(parName) 
       command.Parameters.Add(parSurname) 
       command.Parameters.Add(parUsername) 
       command.Parameters.Add(parPassword) 

       ' Execute the command. 
       command.ExecuteNonQuery() 

       ' Close the database connection. 
       connection.Close() 

      Catch ex As Exception 
       ' Prompt the user with the exception. 
       MessageBox.Show("Sign In Complete") 
      End Try 
    End Select 
    Me.Hide() 
    Form3.ShowDialog() 
End Sub 
End Class 
+2

要說沒有任何反應是絕對錯誤的。一些事情總是發生。事實上,你所尋找的東西並不會發生並不意味着什麼都不會發生。首先要測試的是'ExecuteNonQuery'返回的值。如果這不是零,那麼代碼的工作方式應該和它應該的一樣,問題在於你。 – jmcilhinney

回答

2

我不知道你與你的連接字符串嘗試什麼,但你並不需要這一部分:

;_Name=;_Surname=;_Username=;_Password=; 

而是去掉上面:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\Dentist Pat 2\Dentist Pat 2\Users.accdb; 

有關連接字符串的更多信息,請參閱www.connectionstrings.com/access

如在comments中所述,請考慮檢查ExecuteNonQuery()返回的值以查看該行是否已插入。

使用MS Access時,參數的順序非常重要,而不是名稱。在使用參數時,我在我的SQL命令中使用了?佔位符。我也指定了數據類型,所以請考慮使用OleDbParameter Constructor (String, OleDbType)構造函數。在我的示例中,我使用了VarChar,您可能需要相應地進行更改。

我也會考慮實施Using

管理資源由.NET Framework垃圾收集器(GC),無需您任何額外的編碼處理。您不需要使用受管資源的塊。但是,仍然可以使用Using塊強制處理託管資源,而不是等待垃圾回收器。

您的代碼看起來類似於這樣:

Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\Dentist Pat 2\Dentist Pat 2\Users.accdb;"), 
     cmd As New OleDbCommand("INSERT INTO Users (_Name, _Surname, _Password, _Username) VALUES (?, ?, ?, ?)", con) 

    con.Open() 

    cmd.Parameters.Add(New OleDbParameter("@Name", OleDbType.VarChar)).Value = txtName.Text 
    cmd.Parameters.Add(New OleDbParameter("@Surname", OleDbType.VarChar)).Value = txtSurname.Text 
    cmd.Parameters.Add(New OleDbParameter("@Username", OleDbType.VarChar)).Value = txtUsername.Text 
    cmd.Parameters.Add(New OleDbParameter("@Password", OleDbType.VarChar)).Value = txtPassword.Text 

    Dim rowsAffected As Integer = cmd.ExecuteNonQuery() 

    If rowsAffected = 1 Then 
     MessageBox.Show("Sign In Complete") 
    End If 
End Using 

正如你所看到的,整體的代碼是一個很大整潔和很多更容易閱讀。我希望這可以幫助你解決問題。

這是超出了這個問題的範圍,但我也看看加密密碼。將它們存儲爲純文本是不好的做法。看看這個SO問題; Best way to store password in database,這可能會給你一些關於如何最好地做到這一點的想法。