注册表格问题VB.Net

时间:2015-11-09 22:44:34

标签: vb.net

我在设置此注册表单时遇到问题。 我目前的代码是:

Public Class Form2
Dim con As New OleDb.OleDbConnection

Dim dbProvider As String
Dim dbSource As String
Dim MyDocumentsFolder As String
Dim TheDatabase As String
Dim FullDatabasePath As String
Dim ds As New DataSet
Dim da As OleDb.OleDbDataAdapter
Dim sql As String
Dim DBTest1 As String
Dim DBTestP1 As String
Dim cmd As New OleDbCommand(sql, con)
Dim connStr As String

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim connection As New OleDb.OleDbConnection(connStr)
    dbProvider = "Provider=Microsoft.ACE.OLEDB.12.0;"

    TheDatabase = "\Robocopy_Test.accdb"
    MyDocumentsFolder = "C:\Users\Dan\Desktop\WindowsApplication2"
    FullDatabasePath = MyDocumentsFolder & TheDatabase

    dbSource = "Data Source = C:\Users\Dan\Desktop\WindowsApplication2\Robocopy_Testaccdb1.accdb"

    con.ConnectionString = dbProvider & dbSource

    con.Open()
    sql = "SELECT * FROM Robocopy"
    da = New OleDb.OleDbDataAdapter(sql, con)
    'da.Fill(ds, "Robocopy")
    MessageBox.Show("Databse is Open")
    DBTest1 = DBTest.Text
    DBTestP1 = DBTestP.Text
    'DBTest.Text = ds.Tables("Robocopy").Rows(0).Item(1)
    'DBTestP.Text = ds.Tables("Robocopy").Rows(0).Item(2
    sql = "INSERT INTO Robocopy(username,password) VALUES('" & DBTest1 & "','" & DBTestP1 & "')"
    cmd.Connection = connection
    connection.Open()
    cmd.CommandText = sql
    da.InsertCommand = cmd
    da.InsertCommand.ExecuteNonQuery()
    connection.Close()
    'With cmd.Parameters
    '.AddWithValue("usernamer", DBTest.Text)
    '.AddWithValue("password", DBTestP.Text)
    '.AddWithValue("email", txtsub.text)
    '.AddWithValue("contactnum", txtau.text)
    'End With
    'cmd.ExecuteNonQuery()
End Sub

Public Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    con.Close()
    MessageBox.Show("Database Is now Closed")
End Sub

结束班

我在connection.open()遇到了问题。我遇到的错误是 ConnectionString属性尚未初始化。 过去一小时我一直试图找到不同的方式写入数据库,但没有占上风,我无法弄明白。

[回应史蒂夫 编辑后我的代码仍然是同样的错误

Imports System.Data.OleDb

Public Class Form2
Dim connection As New OleDb.OleDbConnection

Dim dbProvider As String
Dim dbSource As String
Dim MyDocumentsFolder As String
Dim TheDatabase As String
Dim FullDatabasePath As String
Dim ds As New DataSet
Dim da As OleDb.OleDbDataAdapter
Dim sql As String
Dim DBTest1 As String
Dim DBTestP1 As String
Dim cmd As New OleDbCommand(sql, connection)
Dim connStr As String

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim connection As New OleDb.OleDbConnection(connStr)
    dbProvider = "Provider=Microsoft.ACE.OLEDB.12.0;"

    TheDatabase = "\Robocopy_Test.accdb"
    MyDocumentsFolder = "C:\Users\Dan\Desktop\WindowsApplication2"
    FullDatabasePath = MyDocumentsFolder & TheDatabase

    dbSource = "Data Source = C:\Users\Dan\Desktop\WindowsApplication2\Robocopy_Testaccdb1.accdb"

    Me.connection.ConnectionString = dbProvider & dbSource

    Me.connection.Open()
    sql = "SELECT * FROM Robocopy"
    da = New OleDb.OleDbDataAdapter(sql, connection)
    'da.Fill(ds, "Robocopy")
    MessageBox.Show("Databse is Open")
    DBTest1 = DBTest.Text
    DBTestP1 = DBTestP.Text
    'DBTest.Text = ds.Tables("Robocopy").Rows(0).Item(1)
    'DBTestP.Text = ds.Tables("Robocopy").Rows(0).Item(2
    sql = "INSERT INTO Robocopy(username,password) VALUES('" & DBTest1 & "','" & DBTestP1 & "')"
    cmd.Connection = connection
    connection.Open()
    cmd.CommandText = sql
    da.InsertCommand = cmd
    da.InsertCommand.ExecuteNonQuery()
    connection.Close()
    'With cmd.Parameters
    '.AddWithValue("usernamer", DBTest.Text)
    '.AddWithValue("password", DBTestP.Text)
    '.AddWithValue("email", txtsub.text)
    '.AddWithValue("contactnum", txtau.text)
    'End With
    'cmd.ExecuteNonQuery()
End Sub

Public Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    connection.Close()
    MessageBox.Show("Database Is now Closed")
End Sub
End Class

1 个答案:

答案 0 :(得分:1)

全球变量可能非常......邪恶。特别是如果您使用相同的本地变量名称命名它们。

Me.connection与sub中的局部变量声明的变量connection不同。您在全局变量上设置连接字符串,然后使用不带任何连接字符串的本地变量

更改这两行

Me.connection.ConnectionString = dbProvider & dbSource
Me.connection.Open()

删除我。

connection.ConnectionString = dbProvider & dbSource
connection.Open()

并且不要打开连接两次。

在任何情况下,您根本不需要适配器来执行插入命令

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    dbProvider = "Provider=Microsoft.ACE.OLEDB.12.0;"
    dbSource = "Data Source = C:\Users\Dan\Desktop\WindowsApplication2\Robocopy_Testaccdb1.accdb"
    Dim connStr = dbProvider & dbSource    

    DBTest1 = DBTest.Text
    DBTestP1 = DBTestP.Text
    sql = "INSERT INTO Robocopy(username,[password]) VALUES('" & DBTest1 & "','" & DBTestP1 & "')"

    Using connection = New OleDb.OleDbConnection(connStr)
    Using cmd = new OleDb.OleDbCommand(sql, connection )    
       connection.Open()
       cmd.ExecuteNonQuery()

       'With cmd.Parameters
          '.AddWithValue("usernamer", DBTest.Text)
          '.AddWithValue("password", DBTestP.Text)
          '.AddWithValue("email", txtsub.text)
          '.AddWithValue("contactnum", txtau.text)
       'End With
       'cmd.ExecuteNonQuery()
    End Using
    End Using
End Sub

我还看到你已经为你的查询注释了参数化方法。请自己帮个忙,尽快恢复参数逻辑。它更安全,避免了许多错误

最后,密码是Access中的保留关键字。使用它周围的方形托架,否则你会看到一个无法解释的"语法错误"在你的插入命令