我使用Adapter.Update直接把DataTable里的记录插入到数据库里,但如果DataTable里的主键和数据库原来的记录主键重复,就会出错,后面所有的记录都不能插入了,能不能做到:
排除主键重复的记录,其他不重复的记录仍然可以插入到数据库里 /// <summary>
/// 大批量添加数据ds.Tables[0] 表名strTblName(数据库表名称)
/// </summary>
/// <param name="ds"></param>
/// <param name="strTblName"></param>
/// <returns>受影响的行数</returns>
public int BulkInsert(DataTable dt, string strTblName)
{
int affect = 0;
try
{
using (OleDbConnection conn = new OleDbConnection(AccessHelper.ConnectionStringLocalTransaction))
{
OleDbCommand myCommand = new OleDbCommand("select top 1 * from " + strTblName, conn);
OleDbDataAdapter myAdapter = new OleDbDataAdapter(myCommand);
OleDbCommandBuilder myCommandBuilder = new OleDbCommandBuilder(myAdapter);
myAdapter.InsertCommand = myCommandBuilder.GetInsertCommand();
//foreach (DataRow dr in dt.Rows)
//{
// if (dr.RowState != DataRowState.Added)
// dr.SetAdded();
//} conn.Open();
affect = myAdapter.Update(dt);
}
}
catch
{
return 0;
}
return affect;
}
foreach (DataRow dr in dt.Rows)
{
if (dr.RowState != DataRowState.Added)
try
{
dr.SetAdded();
}
catch
{
}
}
这个我也没有试过,但是并不是使用foreach来一条一条插入记录的,是使用myAdapter.Update(dt);来批量增加的,不知道你说的方法行不行,我一会试试
DataTable中新增在行,在Update时才是Insert楼主可以从DataRowState入手解决问题。
不知道用sql的Insert触发器是不是能行,至少是一条一条添加的!!
没搞过!提个思路!看看楼下怎么说!!
if(a != 0)
{
c = a;
}
好比 substring
判断是必须有的 。 你必须前置判断。
很多东西你必须提前让待处理的数据处于【绝对不可能非法】的状态(逻辑上)。所以,解决你这个 问题就是前置数据清理了 ...批量导入是为了提高效率,降低数据库并发压力。 为此,你应该确保数据的正确性。
1、我的DataTable的数据并不是从数据库里来,是为了批量插入而且构造的
2、我的表里有一个自动编号字段,但这个字段不是主键,主键是另外一个字段,我在构造DataTable时可以排除主键重复的记录,但adapter.Update时怎么保证DataTable的主键和数据库中的主键不重复呢?
3、难道真的要把数据库的记录先放到另外一个DataTable,然后和批量插入的DataTable做比较?
表结构:
ID:自动编号
URL:文本型 长度255 主键我要采集CSDN论坛的帖子保存到数据库,我昨天采集了10000个帖子,今天又继续采集了20000个帖子放在一个DataTable里,现在要把这个DataTable保存到数据库里,DataTable里的20000个URL肯定和昨天采集的10000个URL有重复的,怎么排除掉重复的URL,保存不重复的URL