Импорт MS Access в MS SQL Server - PullRequest
       20

Импорт MS Access в MS SQL Server

0 голосов
/ 23 ноября 2018

В настоящее время пытается обновить базу данных SQL Server из базы данных Access, она работает при импорте новых записей, но не удается, когда я повторно импортирую файл, и появляется дубликат - при поиске, чтобы вставить строку, если ее там нет (работает), но пропустите, если он уже существует.В первом столбце установлен первичный ключ.

Dim table As DataTable = New DataTable
Dim accConnection As New OleDb.OleDbConnection(
   "Provider=Microsoft.JET.OLEDB.4.0; Data Source='C:\Tester.mdb';User Id=admin; Password=;")
Dim sqlConnection As New SqlClient.SqlConnection(
   "Data Source=10.75.24.94;Initial Catalog=CTData;User ID=sql;Password=")
Try
    'Import the Access data
    accConnection.Open()
    Dim accDataAdapter = New OleDb.OleDbDataAdapter(
        "SELECT * FROM Import_test", accConnection)
    accDataAdapter.Fill(table)
    accConnection.Close()
    'Export to MS SQL
    For Each row As DataRow In table.Rows
        row.SetAdded()
    Next
    sqlConnection.Open()
    Dim sqlDataAdapter As New SqlClient.SqlDataAdapter(
        "SELECT * FROM Import_test", sqlConnection)
    Dim sqlCommandBuilder As New SqlClient.SqlCommandBuilder(sqlDataAdapter)
    sqlDataAdapter.InsertCommand = sqlCommandBuilder.GetInsertCommand()
    sqlDataAdapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand()
    sqlDataAdapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand()
    sqlDataAdapter.Update(table)
    sqlConnection.Close()
Catch ex As Exception
    If accConnection.State = ConnectionState.Open Then
        accConnection.Close()
    End If
    If sqlConnection.State = ConnectionState.Open Then
        sqlConnection.Close()
    End If
    MessageBox.Show("Import failed with error: " &
                    Environment.NewLine & Environment.NewLine &
                    ex.ToString)
End Try

Ошибка, с которой я столкнулся:

Нарушение первичного ключа.Невозможно вставить повторяющийся ключ в объект.

1 Ответ

0 голосов
/ 24 ноября 2018

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

INSERT INTO Table
SELECT * FROM #Table xx
WHERE NOT EXISTS (SELECT 1 FROM Table rs WHERE rs.id = xx.id)

Или.,,

DELETE FROM Table
WHERE (ID NOT IN (SELECT MAX(ID) AS Expr1
FROM Table
AS Table_1 GROUP BY NAME,ADDRESS,CITY,STATE,ZIP,PHONE,ETC.))

Существует множество других способов справиться с этим.Если вам нужно включить VB, вы можете сделать что-то вроде этого.

Dim cmd As New OleDbCommand
       Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\your_path\DB.accdb")

       Dim queryResult As Integer
       Dim sqlQRY As String = "SELECT COUNT(*) AS FROM ESRRegister WHERE ID = '" & IDtxt.Text & "'"
       con.Open()
       cmd.Connection = con
       cmd.CommandType = CommandType.Text
       If queryResult > 0 Then
           cmd.CommandText = "insert into ESRRegister (Dt,ID)VALUES ('" & Dttxt.Text & "' , '" & IDtxt.Text & "')"
           queryResult = cmd.ExecuteScalar()
           MsgBox("Added Successfuly")
       Else

           MessageBox.Show("Already Exists!", "ALI ENTERPRISES", MessageBoxButtons.OK, MessageBoxIcon.Information)

       End If
...