繁体   English   中英

如何将Access表复制到C#中的SQL表?

[英]How to copy Access table to SQL table in C#?

正如标题所说,我已经将 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;
                }

我实际上写了一个 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 核心。

套餐:

这是批量插入的基本示例。

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)循环。 这是必需的,以便它知道列名在源表和目标表中是相同的。 (如果它们不相同,请以相同的方式手动 map 它们。)

资料来源: https://grauenwolf.github.io/DotNet-ORM-Cookbook/BulkInsert.htm#ado.net

将 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) Column Name 应该相同。 2) 验证柱长。 3) 验证数据类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM