VB.NET Вставить данные в БД MS Access - PullRequest
1 голос
/ 14 марта 2019

Это моя первая попытка работы с .NET и базой данных.

Я пытаюсь добавить записи в таблицу, но ничего не добавляется.Я сократил его до базового кода ниже.

Ошибки не генерируются, но в таблицу ничего не добавляется.

Imports System.Data
'Imports System.Data.OleDb
Class Form1
    Dim dbProvider As String
    Dim dbSource As String

    Dim dbPathAndFilename As String
    Dim con As New OleDb.OleDbConnection
    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim sql As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" ' MDB
        'dbProvider = "PROVIDER=Microsoft.Ace.OLEDB.12.0;" 'ACCDB
        dbSource = "Data Source="

        LoadData()
    End Sub

    Sub LoadData()
        'Connect to db
        'You could store the db path in the Settings of the App.
        'dbPathAndFilename = My.Settings.dbPath
        dbPathAndFilename = "C:\temp\VB\DBTest\Test.mdb"
        con.ConnectionString = dbProvider & dbSource & dbPathAndFilename

        con.Open()
        sql = "INSERT INTO Table1(Field1) VALUES('Field1');"
        da = New OleDb.OleDbDataAdapter(sql, con)
        con.Close()
    End Sub
End Class

Ответы [ 2 ]

0 голосов
/ 29 марта 2019
Imports System.Data
Imports System.Data.OleDb

Class Form1
    Dim dbProvider As String = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" ' MDB
    Dim dbSource As String = "Data Source="
    Dim dbPathAndFilename As String

    Public Property ConnectionString as String
       Get
          return $"{dbProvider}{dbSource}{dbPathAndFilename}"
       End Get
    End Property

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        dbPathAndFilename = "C:\temp\VB\DBTest\Test.mdb"    
        LoadData()
    End Sub

    Sub LoadData()
        Dim sql As String = "INSERT INTO Table1(Field1) VALUES(?);"

        Using con As New OleDbConnection(ConnectionString), _
              cmd As New OleDbCommand(sql)

            cmd.Parameters.Add("Field1", OleDbType.VarWString, 50).Value = "Field1"

            con.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Sub
End Class
0 голосов
/ 14 марта 2019

Попробуйте это

Class Form1
    Private dbProvider As String
    Private dbPathAndFilename As String

    Sub LoadData()
        dbProvider = "Microsoft.Jet.OLEDB.4.0;"
        dbPathAndFilename = "C:\temp\VB\DBTest\Test.mdb"
        Using con As New OleDb.OleDbConnection($"PROVIDER={dbProvider};DATA SOURCE={dbPathAndFilename}")
            con.Open()
            Using cmd = con.CreateCommand()
                cmd.CommandText = "INSERT INTO Table1([Field1]) VALUES(@field1);"
                cmd.Parameters.AddWithValue("@field1", field1Value) ' replace field1Value with your value
                cmd.ExecuteNonQuery()
            End Using
        End Using
    End Sub

End Class

Он имеет несколько преимуществ по сравнению с вашей версией.

  1. Он ограничивает область применения одноразовых предметов с помощью Using блоков
  2. Этоиспользует параметр, который является предпочтительным, чтобы избежать внедрения
  3. Я чувствовал, что строка подключения была немного неуклюжей, и это немного ее сглаживало
  4. Самое главное, команда введена, чтобы можно было вызывать ExecuteNonQuery,в отличие от вашего связанного примера, который возвращает данные в запросе.
...