发现一个奇怪的问题,DATASET.Table.Rows.Count=0时,里头居然还有数据 这个dataset的维护是一边插一边删除的,删除是用rows.remove方法,当写入数据的时候我是先判断dataset.table.rows.count是不是为0,如果是为0就不写数据进去.但是实际发现当为0时,写数据进去会报键列重复,只好通过判断rows.count=0时ds.table.clear方法清空后再写入解决问题.这是怎么回事呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没太明白你的意思是向DataSet中插DataTable吗? 是向dataset.datatable插入行,删除行 搂主dataset的删除,其实并不是真的删除他还存在的,只是NET内置有一个标识,标识他是删除的行.另外,每一行都有他的version的... 不是说rows.delete是标志删除,rows.remove是直接从表里删除吗即rows.delete+tables.acceptchanges=rows.remove吗? 这是建立数据行的过程if(ds.Tables["_tbmo"].Rows.Count==0){ //要不是靠这个clear,偶尔会报大概是主键重复的错误,因为在初始化ds的时候我定义了一个primary列的 //ds.Tables["_tbmo"].Rows.Clear(); using (SqlConnection db = new SqlConnection(_sqlConnString)) { try { SqlDataAdapter _damo =new SqlDataAdapter("select top 100 * from cp_sp_syn_mo with(nolock) order by Id", db); _damo.Fill(ds, "_tbmo");................这是删除数据行的过程DataRow dr_mo=ds.Tables["_tbmo"].Rows[0];DataRow dr=ds.Tables["_tbmo"].Rows.Find(sId);if(dr!=null){ if(dr.RowState!=DataRowState.Deleted) { ds.Tables["_tbmo"].Rows.Remove(dr); }}............. 补充:cp_sp_syn_mo表的id列是自增列,肯定不会有重复 if(ds.Tables["_tbmo"].Rows.Count==0) { //要不是靠这个clear,偶尔会报大概是主键重复的错误,因为在初始化ds的时候我定义了一个primary列的 //ds.Tables["_tbmo"].Rows.Clear(); using (SqlConnection db = new SqlConnection(_sqlConnString)) { try { SqlDataAdapter _damo =new SqlDataAdapter("select top 100 * from cp_sp_syn_mo with(nolock) order by Id", db); _damo.Fill(ds, "_tbmo"); 这是删除数据行的过程 DataRow dr_mo=ds.Tables["_tbmo"].Rows[0]; DataRow dr=ds.Tables["_tbmo"].Rows.Find(sId); if(dr!=null) { if(dr.RowState!=DataRowState.Deleted) { ds.Tables["_tbmo"].Rows.Remove(dr); } } 好象Remove是直接从集合中删除,不标记删除的,所以也不要用AcceptChanges方法吧 楼主的删除和插入操作是不是在不同的线程中进行处理,如果是这样,那需要对DataSet进行lock,保证原子化操作。 这是因为一个DataSet对象可以包含多个DataTable对象,而一个DataTable对象里面才有多个DataRow对象 抓包后自动顶贴子是什么原理呢! 支付宝的登陆密码和支付密码怎么自动填上去? C#撤销和前进怎么写 如何添加事件? 如何把SKIN文件,转换成XML格式 用DateTime.addDays(-1)时,每到一个月的第一天时就出错,怎么办啊? e.Cancel = this.CheckUpdates(); 怎么将16进制,转换成10进制阿? 存储过程的优势,静态方法,静态类,静态属性的优势??? 如何在打包工程中在菜单中加入一个卸载快捷方式 拖动flash VC2005的编译环境问题
你的意思是向DataSet中插DataTable吗?
dataset的删除,其实并不是真的删除
他还存在的,只是NET内置有一个标识,标识他是删除的行.另外,每一行都有他的version的...
{
//要不是靠这个clear,偶尔会报大概是主键重复的错误,因为在初始化ds的时候我定义了一个primary列的
//ds.Tables["_tbmo"].Rows.Clear();
using (SqlConnection db = new SqlConnection(_sqlConnString))
{
try
{
SqlDataAdapter _damo =new SqlDataAdapter("select top 100 * from cp_sp_syn_mo with(nolock) order by Id", db);
_damo.Fill(ds, "_tbmo");................
这是删除数据行的过程DataRow dr_mo=ds.Tables["_tbmo"].Rows[0];
DataRow dr=ds.Tables["_tbmo"].Rows.Find(sId);
if(dr!=null)
{
if(dr.RowState!=DataRowState.Deleted)
{
ds.Tables["_tbmo"].Rows.Remove(dr);
}
}
.............
{
//要不是靠这个clear,偶尔会报大概是主键重复的错误,因为在初始化ds的时候我定义了一个primary列的
//ds.Tables["_tbmo"].Rows.Clear();
using (SqlConnection db = new SqlConnection(_sqlConnString))
{
try
{
SqlDataAdapter _damo =new SqlDataAdapter("select top 100 * from cp_sp_syn_mo with(nolock) order by Id", db);
_damo.Fill(ds, "_tbmo");
这是删除数据行的过程 DataRow dr_mo=ds.Tables["_tbmo"].Rows[0];
DataRow dr=ds.Tables["_tbmo"].Rows.Find(sId);
if(dr!=null)
{
if(dr.RowState!=DataRowState.Deleted)
{
ds.Tables["_tbmo"].Rows.Remove(dr);
}
}
好象Remove是直接从集合中删除,不标记删除的,所以也不要用AcceptChanges方法吧