批量更新,插入,删除的处理!望指教

时间:2020-12-01 00:37:20
这个是批量上传一个DataTable的方法,如果导入的数据存在就更新,如果不存在就是插入,但是如果我传入的DataTable与查询出来的数据集合比较不存在如何删除呢?
例如我传入的DataTable里面有3条数据.而数据库查询出来的有4条,那么多出的那条如何删除呢?
这里写了dbAdapter.DeleteCommand = autoCmds.GetDeleteCommand();如何让他使用起来

public bool UpdateDataTable(string strSql, DataTable dataTable)
        {
            DataTable dtTemp = new DataTable();
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                try
                {
                    conn.Open();
                    SqlDataAdapter dbAdapter = new SqlDataAdapter(strSql, connection);
 
                    dbAdapter.FillSchema(dtTemp, SchemaType.Mapped);

                    dbAdapter.Fill(tempTable);
                    dtTemp.Merge(dataTable);
 
                    SqlCommandBuilder autoCmds = new SqlCommandBuilder(dbAdapter);
                    dbAdapter.InsertCommand = autoCmds.GetInsertCommand();
                    dbAdapter.UpdateCommand = autoCmds.GetUpdateCommand();
                    dbAdapter.DeleteCommand = autoCmds.GetDeleteCommand();

                    dbAdapter.Update(tempTable);
                    return true;
                }
                catch (Exception e)
                {
                    e.ToString();
                }
                finally
                {
                    conn.Close();
                }
            }
        }


7 个解决方案

#1


我不太喜欢用批量方法
因为如果有事务的话,假如中间有一条有问题,整个过程都不执行
但有时,我们却是需要有问题的不执行,没有问题的执行
所以我还是用循环处理的方法

#2


两个表的数据都取到内存中,用linq做处理,判断找出多出的记录,做出标记位,或删除都可以

#3


至于删除,这个是看你业务需求的。
如果是全新的数据要覆盖原来的数据,那就直接根据条件删除原来所有的,直接把新数据插入,这样也不会有所谓的存在就更新了,全部是插入

#4


哎  你直接把上传的数据类型的数据删除掉 然后在重新插入一次不就可以了吗 郁闷

#5


顶3楼的

#6


感谢回答linq却是可以办到但是速度太慢啊

#7


我有个很好的办法,在数据库里面操作,
一个存储过程搞定,参数为XML
将table里面的数据拼成XML


例如 参数:
<Root>
<Pri StartDate=\"{0}\" ExpirationDate=\"{1}\" />
<Pri StartDate=\"{0}\" ExpirationDate=\"{1}\" />
</Root>

存储过程
解析XML
将数据插入到 新建临时表,然后再操作临时表想怎么操作怎么操作。

#1


我不太喜欢用批量方法
因为如果有事务的话,假如中间有一条有问题,整个过程都不执行
但有时,我们却是需要有问题的不执行,没有问题的执行
所以我还是用循环处理的方法

#2


两个表的数据都取到内存中,用linq做处理,判断找出多出的记录,做出标记位,或删除都可以

#3


至于删除,这个是看你业务需求的。
如果是全新的数据要覆盖原来的数据,那就直接根据条件删除原来所有的,直接把新数据插入,这样也不会有所谓的存在就更新了,全部是插入

#4


哎  你直接把上传的数据类型的数据删除掉 然后在重新插入一次不就可以了吗 郁闷

#5


顶3楼的

#6


感谢回答linq却是可以办到但是速度太慢啊

#7


我有个很好的办法,在数据库里面操作,
一个存储过程搞定,参数为XML
将table里面的数据拼成XML


例如 参数:
<Root>
<Pri StartDate=\"{0}\" ExpirationDate=\"{1}\" />
<Pri StartDate=\"{0}\" ExpirationDate=\"{1}\" />
</Root>

存储过程
解析XML
将数据插入到 新建临时表,然后再操作临时表想怎么操作怎么操作。