Как скопировать таблицу доступа в SQL таблицу в C#? - PullRequest
0 голосов
/ 04 февраля 2020

Как видно из заголовка, я использовал odbcconnection для sqlconnection, и на всю жизнь не могу заставить его работать. Скопировал кучу кода с этого сайта, но не могу заставить их обоих работать.

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

 using (OdbcConnection myConnection = new OdbcConnection())
            {
                string myConnectionString = @"Driver={Microsoft Access Driver (*.mdb)};" +
 "Dbq=//####/data/Toronto/wrkgrp/wrkgrp30/Business Risk Oversight and Control/DATA INTEGRITY/CDE/CDE Testing Portal Requirements/Migration Requirements/RCM/Mutual Funds/Mutual Funds.mdb;";

                myConnection.ConnectionString = myConnectionString;
                myConnection.Open();

                //execute queries, etc
                OdbcCommand cmd = myConnection.CreateCommand();

                cmd.CommandText = "SELECT * FROM RCM_MF_New_Accounts_Samples";
                OdbcDataReader reader = cmd.ExecuteReader(); // close conn after complete

                DataTable myDataTable = new DataTable();
                myDataTable.Load(reader);
                //myConnection.Close();

                string destinationConnectionString = "Data Source=####;Initial Catalog=DYOF_STAGING_BROC;User ID=;Password=;Connection Timeout=999";

                SqlConnection destination = new SqlConnection(destinationConnectionString);
                SqlBulkCopy bulkData;
                //destination.Open();

                Exception ex = null;
                try
                {
                    Console.WriteLine("step1");
                    bulkData = new SqlBulkCopy(destinationConnectionString, SqlBulkCopyOptions.FireTriggers);
                    bulkData.BulkCopyTimeout = 1;
                    bulkData.DestinationTableName = "Load_CTR_Sample_Account_Opening2";
                    bulkData.WriteToServer(myDataTable);
                    bulkData.Close();
                    Console.WriteLine("moved from here to there");
                    reader.Close();

                    //destination.Close();


                }
                catch (Exception e)
                {
                    ex = e;
                }

Ответы [ 4 ]

2 голосов
/ 04 февраля 2020

Я действительно написал ORM, чтобы упростить задачу такого рода.

var accessDS = new AccessDataSource(connectionString1);
var dt = accessDS.From("RCM_MF_New_Accounts_Samples").ToDataTable().Execute();

var sqlDS = new SqlServerDataSource(connectionString2);
sqlDS.InsertBulk("Load_CTR_Sample_Account_Opening2", dt).Execute();

Это не работает для NET Core.

Пакеты:

1 голос
/ 04 февраля 2020

Считайте данные из Access в DataTable:

string strConnect = @"Provider=Microsoft.ACE.OLEDB.12.0;data source=D:\Temp\MyDB.accdb";

DataTable dt = new DataTable();
using (OleDbConnection con = new OleDbConnection(strConnect))
    {
    OleDbCommand cmd = new OleDbCommand("SELECT * FROM MyTable", con);
    con.Open();
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    da.Fill(dt);
    }

Затем используйте SqlBulkCopy для обновления SQL:

string strConnect = @"Data Source=GRIFFPC\SQLEXPRESS;Initial Catalog=Testing;Integrated Security=True";
using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlBulkCopy bulk = new SqlBulkCopy(con))
        {
        bulk.DestinationTableName = "Test";
        bulk.WriteToServer(dt);
        }
    }

Конечно, есть гораздо более простой способ go прямо с Access на SQL Server, используя VBA, SQL или другими способами.

https://support.office.com/en-us/article/import-or-link-to-data-in-an-sql-server-database-a5a3b4eb-57b9-45a0-b732-77bc6089b84e

https://www.sqlshack.com/six-different-methods-to-copy-tables-between-databases-in-sql-server/

1 голос
/ 04 февраля 2020

Вот базовый c пример массовой вставки.

public void BulkInsert(DataTable employees)
{
    if (employees == null)
        throw new ArgumentNullException(nameof(employees), $"{nameof(employees)} is null.");

    using (var con = OpenConnection())
    using (var sbc = new SqlBulkCopy(con))
    {
        sbc.DestinationTableName = "HR.Employee";
        foreach (DataColumn column in employees.Columns)
            sbc.ColumnMappings.Add(column!.ColumnName, column.ColumnName);
        sbc.WriteToServer(employees);
    }
}

Обратите внимание на foreach (DataColumn column in employees.Columns) l oop. Это необходимо, чтобы знать, что имена столбцов одинаковы в исходной и целевой таблицах. (Если они не совпадают, вручную сопоставьте их таким же образом.)

Источник: https://grauenwolf.github.io/DotNet-ORM-Cookbook/BulkInsert.htm#ado. net

0 голосов
/ 04 февраля 2020

Следующую опцию необходимо проверить 1) Имя столбца должно совпадать. 2) проверьте длину столбца. 3) проверить тип данных.

...