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

C# 大家好。我想从access数据库将值导入sql,但以前从access添加的记录除外,c#,.net,C#,.net,将值从我的access数据库获取到DataTable 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(accesscon

将值从我的access数据库获取到
DataTable

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数据库获取到
数据表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);
    }
}
现在,我想从access数据库将值导入sql数据库,但之前从access数据库添加的记录除外。我该怎么做

//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;
            }
        }
    }
}
//问题出在这里
使用(SqlConnection con=newsqlconnection(“MyConnectionStr”))
{
使用(SqlCommand cmd=new SqlCommand())
{
cmd.CommandText=“插入UMP值(@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
我的建议是获取所有访问数据并将其插入临时表中

然后根据左联接插入数据,执行插入

你的代码看起来像这样

    //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();
            }
        }
    }
//来自access的数据
私有void insertValues(数据表)
{
使用(SqlConnection con=newsqlconnection(“MyConnectionStr”))
{
使用(SqlCommand cmd=con.CreateCommand())
{
createTable();
//注意:已将insert更改为tmp表格。
cmd.CommandText=“插入UMP_TMP值(@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
通过扩展@Kirk的响应,您解决问题的最终目标是对两个表执行左联接操作。您需要确定每个表上哪些列连接数据,哪些列使行唯一

您可以在a)Access、b)SQL、c).NET中的3种环境中的任意一种环境中执行此操作

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

一旦构建了存储过程(以及其他可能需要的视图),就可以使用ManagementStudio、查询等来完成SQL工作。NET代码是两个简单的部分,1)上载访问数据2)调用进程合并它


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

我正在努力理解您的问题,您能否更具体一点?正如@AlexRiabov之前所指出的,我们需要更多信息。我看到的只是一堵代码墙。请添加有关您要执行的操作、预期输出和一些测试数据的信息。这是一个好主意,我尝试过,但得到的错误是System.data.SqlClient.SqlException:'附近的语法不正确';'到cmd.ExecuteNonQuery();我添加了错误处理。哎呀,对不起,我的错误更新了上面的代码。创建表方法不正确。它现在可以工作了。我在考虑比较2数据表和添加第三个数据表,但最好避免使用数据表。这更有用。谢谢。太好了,很高兴它有帮助。