C# 将所有Access表数据导入SQL Server表

C# 将所有Access表数据导入SQL Server表,c#,sql-server,ms-access-2013,sqlbulkcopy,C#,Sql Server,Ms Access 2013,Sqlbulkcopy,我需要使用我所有的access表,并在SQL Server 2008中使用数据和键/约束创建完全相同的表。如果表已经存在,下面的语法将插入数据,但是如果表不存在,我该如何做呢?还是有更好的方法可以实现这个结果 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.Data.SqlCli

我需要使用我所有的access表,并在SQL Server 2008中使用数据和键/约束创建完全相同的表。如果表已经存在,下面的语法将插入数据,但是如果表不存在,我该如何做呢?还是有更好的方法可以实现这个结果

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AccessToSQL
{
public partial class Form1 : Form
{
    const string databaselocation = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Database1.accdb;Persist Security Info = False;";
    List<string> tables = new List<string>();
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        GetTableNames();
        const string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Database1.accdb;Persist Security Info = False;";
        const string connectionStringDest = "Data Source = TO\\SQLEXPRESS;Initial Catalog=Testing;Integrated Security=SSPI;";
        using (var sourceConnection = new OleDbConnection(connectionString))
        {
            sourceConnection.Open();
            using (var destinationConnection = new SqlConnection(connectionStringDest))
            {
                destinationConnection.Open();
                foreach (string tbl in tables)
                {
                    var commandSourceData = new OleDbCommand("Select * from "+tbl, sourceConnection);
                    var reader = commandSourceData.ExecuteReader();
                    using (var bulkCopy = new SqlBulkCopy(destinationConnection))
                    {
                        bulkCopy.DestinationTableName = "dbo."+tbl;
                        try { bulkCopy.WriteToServer(reader); }
                        catch (Exception ex) { MessageBox.Show(ex.Message); }
                        finally { reader.Close(); }
                    }
                }
            }
        }
    }
    public List<string> GetTableNames()
    {
        try {
            using (OleDbConnection con = new OleDbConnection(databaselocation))
            {
                con.Open();
                //DataTable schema = con.GetSchema("Columns");
                //foreach (DataRow row in schema.Rows)
                //{
                //    tables.Add(row.Field<string>("TABLE_NAME"));
                //}
                foreach (DataRow r in con.GetSchema("Tables").Select("TABLE_TYPE = 'TABLE'"))
                {
                    tables.Add(r["TABLE_NAME"].ToString());
                }
                return tables;
            }
        }
        catch (Exception ex) { MessageBox.Show(ex.Message); }
        return tables;
    }
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用System.Data.OleDb;
使用System.Data.SqlClient;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间访问SQL
{
公共部分类Form1:Form
{
const string databaselocation=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=C:\\Database1.accdb;持久安全信息=False;”;
列表表=新列表();
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
GetTableNames();
const string connectionString=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=C:\\Database1.accdb;持久安全信息=False;”;
const string connectionStringDest=“数据源=到\\SQLEXPRESS;初始目录=测试;集成安全性=SSPI;”;
使用(var sourceConnection=new OleDbConnection(connectionString))
{
sourceConnection.Open();
使用(var destinationConnection=new-SqlConnection(connectionStringDest))
{
destinationConnection.Open();
foreach(表中的字符串tbl)
{
var commandSourceData=新的OleDbCommand(“选择*自”+tbl,sourceConnection);
var reader=commandSourceData.ExecuteReader();
使用(var bulkCopy=new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName=“dbo.”+tbl;
请尝试{bulkCopy.WriteToServer(reader);}
catch(Exception ex){MessageBox.Show(ex.Message);}
最后{reader.Close();}
}
}
}
}
}
公共列表GetTableNames()
{
试一试{
使用(OleDbConnection con=新OleDbConnection(databaselocation))
{
con.Open();
//DataTableSchema=con.GetSchema(“列”);
//foreach(schema.Rows中的数据行)
//{
//tables.Add(row.Field(“TABLE_NAME”));
//}
foreach(con.GetSchema(“表”)中的数据行r。选择(“表类型='TABLE'))
{
tables.Add(r[“TABLE_NAME”].ToString());
}
返回表;
}
}
catch(Exception ex){MessageBox.Show(ex.Message);}
返回表;
}
}
}

SQL Server具有导入Access数据库的向导,SSMS具有从Access导入数据的向导。为什么要尝试对代码执行相同的操作?请使用SQL Server向导导入access数据库。是否只能选择表?access还有一个高级实用程序。导入向导允许您选择要导入的内容。