ошибка в коде vb.net импорта данных из доступа в sdf

введите здесь описание изображенияЯ использую файл базы данных SQL Server Compact 3.5 (.sdf) в vb.net

Произошла ошибка при синтаксическом анализе запроса. [Номер строки токена, смещение строки токена, ошибочный токен,]

Dim flag As Boolean
    Dim flag2 As Boolean
    Me.OpenFileDialog1.Filter = "mdb files (*.mdb)|"
    Me.OpenFileDialog1.Filter = "mdb files (*.mdb)|*.mdb|All files (*.*)|*.*"
    flag2 = (Me.OpenFileDialog1.ShowDialog() = DialogResult.OK)
    If flag2 Then
        flag = (Operators.CompareString(FileSystem.Dir(Me.OpenFileDialog1.FileName, FileAttribute.Normal), "", False) <> 0)
    End If
    Dim myConnectionStringMDB As String = "provider=Microsoft.Ace.OLEDB.12.0;" & "data source=" & Me.OpenFileDialog1.FileName
    Dim myConnectionStringSQL As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" & "Data Source=" & Application.StartupPath & "\Archive.sdf"
    Using conSQL As OleDbConnection = New OleDbConnection(), conMDB As OleDbConnection = New OleDbConnection()
        conSQL.ConnectionString = myConnectionStringSQL
        conSQL.Open()
        conMDB.ConnectionString = myConnectionStringMDB
        conMDB.Open()
        Using cmdSQL As OleDbCommand = New OleDbCommand(), cmdMDB As OleDbCommand = New OleDbCommand()
            cmdMDB.CommandType = Data.CommandType.Text
            cmdMDB.Connection = conMDB
            cmdMDB.CommandText = "SELECT * FROM [student]"
            Dim daMDB = New System.Data.OleDb.OleDbDataAdapter(cmdMDB)
            Dim dt = New Data.DataTable()
            daMDB.Fill(dt)
            For Each dr As Data.DataRow In dt.Rows
                ' change row status from "Unchanged" to "Added" so .Update below will insert them
                dr.SetAdded()
            Next
            cmdSQL.CommandType = Data.CommandType.Text
            cmdSQL.Connection = conSQL
            cmdSQL.CommandText = "SELECT * FROM [student]"
            Dim daSQL = New System.Data.OleDb.OleDbDataAdapter(cmdSQL)
            Dim cbuilderMDB = New OleDbCommandBuilder(daSQL)
            cbuilderMDB.QuotePrefix = "["
            cbuilderMDB.QuoteSuffix = "]"
            daSQL.Update(dt)
        End Using
        conSQL.Close()
        conMDB.Close()
    End Using

person Anis Qabaily    schedule 29.02.2020    source источник


Ответы (1)


Я избавился от лишних логических переменных flag и flag2 и просто напрямую проверил значения.

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

Я сократил код, по возможности передав свойства напрямую конструкторам объектов. DataAdapter и StringBuilder также предоставляют метод .Dispose, поэтому я включил их в блоки Using.

daMDB.AcceptChangesDuringFill = False

Эта строка кода позволяет .DataRowState оставаться как Added (обычно она изменяется на Unchanged методом .Fill), поэтому DataTable будет готова добавить все записи во вторую таблицу без цикла.

Я не верю, что слово «студент» является зарезервированным словом ни в одной из баз данных, поэтому я удалил квадратные скобки.

И .Fill, и .Update методы DataAdapter будут .Open и .Close соединением, если обнаружат, что соединение закрыто. Если они найдут его открытым, они оставят его открытым. Таким образом, закрытие соединения не требуется. Также End Using закрывает и удаляет все объекты, включенные в часть использования (первая строка, включая запятые) блока.

Private Sub OPCode()
    OpenFileDialog1.Filter = "mdb files (*.mdb)|*.mdb|All files (*.*)|*.*"
    Dim MDBFile As String
    If OpenFileDialog1.ShowDialog = DialogResult.OK AndAlso Not String.IsNullOrEmpty(OpenFileDialog1.FileName) Then
        MDBFile = OpenFileDialog1.FileName
    Else
        Exit Sub
    End If
    Dim myConnectionStringMDB As String = "provider=Microsoft.Ace.OLEDB.12.0;" & "data source=" & MDBFile
    Dim myConnectionStringSQL As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" & "Data Source=" & Application.StartupPath & "\Archive.sdf"
    Dim dt = New Data.DataTable()
    Using conMDB As OleDbConnection = New OleDbConnection(myConnectionStringMDB),
            cmdMDB As OleDbCommand = New OleDbCommand("SELECT * FROM student", conMDB),
            daMDB As New System.Data.OleDb.OleDbDataAdapter(cmdMDB)
        daMDB.AcceptChangesDuringFill = False
        daMDB.Fill(dt)
    End Using
    Using conSQL As OleDbConnection = New OleDbConnection(myConnectionStringSQL),
                cmdSQL As OleDbCommand = New OleDbCommand("SELECT * FROM student", conSQL),
                daSql As New OleDbDataAdapter(cmdSQL),
                cbuilderMDB As New OleDbCommandBuilder(daSql)
        daSql.Update(dt)
    End Using
End Sub
person Mary    schedule 01.03.2020