【问题标题】:How to copy Access table to SQL table in C#?如何在 C# 中将 Access 表复制到 SQL 表?
【发布时间】:2020-02-04 04:40:52
【问题描述】:

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

【问题讨论】:

  • 如果这是一次性的事情,在 Access 中打开 SQL Server 表然后跨两个表执行 INSERT 操作可能会更容易。
  • 请更新您的问题以包含您遇到的任何错误。另外,您使用的是 .NET Framework 还是 .NET Core?我问是因为我从未见过 Core 与 Access 一起工作(即使它应该这样做)。

标签: c# sql ms-access


【解决方案1】:

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

包:

【讨论】:

    【解决方案2】:

    将 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);
            }
        }
    

    当然,使用 VBA、SQL 或其他方法直接从 Access 访问 SQL Server 有更简单的方法。

    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/

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        以下选项需要验证 1) 列名应该相同。 2) 验证列长。 3) 验证数据类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-09
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 2014-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多