大家好。我想从访问数据库中将值导入sql,但以前从访问中添加的记录除外

时间:2018-06-22 11:13:37

标签: c# .net

从我的访问数据库获取值到DataTable table

string accessconst = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:/Program Files (x86)/BALLBACH/Database/Messdaten.mdb";
DataTable table = new DataTable();
using (OleDbConnection conn = new OleDbConnection(accessconst))
{
    using (OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Messdaten", conn))
    {
        da.Fill(table);
    }
}

从我的sql数据库中获取值到DataTable tablesql

string sqlconstr = "sqlconstr";
DataTable tablesql = new DataTable();
using (SqlConnection conn = new SqlConnection(sqlconstr))
{
    using (SqlDataAdapter da = new SqlDataAdapter("SELECT p1 FROM UMP", conn))
    {
        da.Fill(tablesql);
    }
}

现在,我想将值从访问数据库导入到sql数据库中,除了先前从访问数据库添加的记录。我该怎么办?

//HERE IS THE PROBLEM 
using (SqlConnection con = new SqlConnection("MyConnectionStr "))
{
    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.CommandText = "INSERT INTO UMP VALUES (@p1, @p2, @p3)";
        cmd.Connection = con;
        cmd.Parameters.Add("@p1", SqlDbType.NVarChar, 50);
        cmd.Parameters.Add("@p2", SqlDbType.NVarChar, 50);
        cmd.Parameters.Add("@p3", SqlDbType.NVarChar, 50);
        con.Open();

        for (int i = 0; i < table.Rows.Count; i++)
        {
            cmd.Parameters["@p1"].Value = table.Rows[i][0];
            cmd.Parameters["@p2"].Value = table.Rows[i][1];
            cmd.Parameters["@p3"].Value = table.Rows[i][2];
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                break;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我建议采取所有访问数据并将其插入到临时表中。

然后基于左联接插入数据,执行插入。

然后您的代码将如下所示……

    //data from access
    private void insertValues(DataTable table)
    {
        using (SqlConnection con = new SqlConnection("MyConnectionStr "))
        {
            using (SqlCommand cmd = con.CreateCommand())
            {
                createTable();
                //note changed the insert to tmp table.
                cmd.CommandText = "INSERT INTO UMP_TMP VALUES (@p1, @p2, @p3)";
                cmd.Connection = con;
                cmd.Parameters.Add("@p1", SqlDbType.NVarChar, 50);
                cmd.Parameters.Add("@p2", SqlDbType.NVarChar, 50);
                cmd.Parameters.Add("@p3", SqlDbType.NVarChar, 50);
                con.Open();

                for (int i = 0; i < table.Rows.Count; i++)
                {
                    cmd.Parameters["@p1"].Value = table.Rows[i][0];
                    cmd.Parameters["@p2"].Value = table.Rows[i][1];
                    cmd.Parameters["@p3"].Value = table.Rows[i][2];
                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception)
                    {

                        break;
                    }
                }
                //merge the data from within sql server
                mergeTable();
                //drop the temporary table
                dropTable();
            }
        }
    }


    private void createTable(){
        issueStatement("create table UMP_TMP(p1 varchar(50), p2 varchar(50), p3 varchar(50));");
    }
    private void dropTable()
    {
        issueStatement("drop table UMP_TMP;");
    }
    private void mergeTable()
    {
        issueStatement("insert into UMP select ump_tmp.p1,ump_tmp.p2,ump_tmp.p3 from UMP_TMP left join UMP on UMP_TMP.p1 = UMP.P1 and UMP_TMP.p2 = UMP.P2 and UMP_TMP.p3 = UMP.P3 WHERE ump.p1 is null and ump.p2 is null and ump.p3 is null");
    }
    private void issueStatement(string command)
    {
        using (SqlConnection con = new SqlConnection("MyConnectionStr "))
        {
            using (SqlCommand cmd = con.CreateCommand())
            {
                con.Open();
                cmd.CommandText = command;
                //add error handling
                cmd.ExecuteNonQuery();
            }
        }
    }

答案 1 :(得分:0)

扩展@Kirk的响应,解决问题的最终目标是在两个表上执行左联接操作。您将需要确定每个表上的哪些列连接数据,以及哪些列使行唯一。

您可以在a)Access,b)SQL,c).NET中使用的3种环境中的任何一种来执行此操作。

我会推荐SQL,这是它的最佳选择。 (加上您仅通过客户端传输一组数据(访问数据)),因此将所有数据放入SQL表中,然后执行SQL存储过程以进行左联接并更新SQL数据表。

您可以仅使用Management Studio,查询等来进行SQL工作。一旦构建了存储过程(以及其他可能需要的视图)。然后,您的.NET代码就是两个简单的部分,1)上传Access数据2)调用proc进行合并。

最后一点,如果您的.net客户端唯一的目的是此上传和合并,那么您根本不需要它。 SQL Server SSIS可以完成所有这一切,根据所涉及数据的大小,可能是更好的选择。