用了一个DataSet.Relations.add
ds.Relations.Add("admin",ds.Tables["stu"].Columns["name"],ds.Tables["stu"].Columns["name"]);
foreach()
{
...
}我用了这个语句后,第一次导入数据没问题,但是第二次导入的时候,就出错了。
提示:
名为“admin”的关系已经属于此 DataSet。如果我退出程序后再次运行就没问题,可是我现在不想退出啊,要连续导入数据。现在该怎么办啊??ds.dispose() 释放不了sos
ds.Relations.Add("admin",ds.Tables["stu"].Columns["name"],ds.Tables["stu"].Columns["name"]);
foreach()
{
...
}我用了这个语句后,第一次导入数据没问题,但是第二次导入的时候,就出错了。
提示:
名为“admin”的关系已经属于此 DataSet。如果我退出程序后再次运行就没问题,可是我现在不想退出啊,要连续导入数据。现在该怎么办啊??ds.dispose() 释放不了sos
这段不是导入数据的啊,只是把两表建立关系,还有你导入数据在哪里啊.还有为什么两个表名都一样的.你把导入数据的代码贴出来啊.
这句在构造函数中执行,别放到按钮事件中,ds作为一个全局变量,初始化后就不要动了。
导数据的代码放在前面。然后再
ds.Relations.Add("admin",ds.Tables["stu"].Columns["name"],ds.Tables["stu"].Columns["name"]);
//--------------把生产入库Head和Body做关联,如果Head中单号没有,就同时插入2个表,否则相反---------------- //为dr创建一个关系 格式为 dr.relations.add("关系名",父表列,子表列)
dr.Relations.Add ("Test",dr.Tables["pro_halfproinstock_head"].Columns["instock_id"],dr.Tables["pro_halfproinstock_body"].Columns["instock_id"]);
//历遍父表中所有的行
foreach (DataRow adr in dr.Relations["Test"].ParentTable.Rows)
{
string Head_id = (adr["instock_id"]).ToString();
int a = Convert.ToInt16(new SqlCommand("select count(instock_id) from pro_halfproinstock_head where instock_id ='" + Head_id + "'", conn).ExecuteScalar());
if (a <= 0)
{
new SqlCommand("insert into pro_halfproinstock_head(InStock_ID,Produce_type,Warehouse_ID,WarehouseMan_ID,InStock_Date,is_consignation,memo,EditMan_ID,is_Check,Pos_id,is_hide,iscwaudit) values('" + adr["InStock_ID"] + "','" + adr["Produce_type"] + "','" + adr["Warehouse_ID"] + "','" + adr["WarehouseMan_ID"] + "','" + Convert.ToDateTime(adr["InStock_Date"]) + "',(case '" + adr["is_consignation"] + "' when 'true' then 1 else 0 end),'" + adr["memo"] + "','" + adr["EditMan_ID"] + "',(case '" + adr["is_check"] + "' when 'true' then 1 else 0 end),'" + adr["Pos_id"] + "',(case '" + adr["is_hide"] + "' when 'true' then 1 else 0 end),'" + adr["IsCWAudit"] + "')", conn).ExecuteNonQuery(); //历遍和dr相关子表所有的行赋值给cdr
foreach (DataRow cdr in adr.GetChildRows(dr.Relations["Test"]))
{
new SqlCommand("insert into pro_halfproinstock_body(InStock_ID,Good_id,batchbill,Grade,quantity,dictate_id,memo,plance_id,Sequence,Context,Tenor_ID,RecordBill_ID,ZJY,JJR,JHR,QX) values('" + cdr["InStock_ID"] + "','" + cdr["Good_id"] + "','" + cdr["batchbill"] + "','" + cdr["Grade"] + "','" + cdr["quantity"] + "','" + cdr["dictate_id"] + "','" + cdr["memo"] + "','" + cdr["plance_id"] + "','" + cdr["Sequence"] + "','" + cdr["Context"] + "','" + cdr["Tenor_ID"] + "','" + cdr["RecordBill_ID"] + "','" + cdr["ZJY"] + "','" + cdr["JJR"] + "','" + cdr["JHR"] + "','" + cdr["QX"] + "')", conn).ExecuteNonQuery();
}
}
}
dr.Relations["Test"].ParentTable 和 dr 有什么区别?不是同一张表吗?
主从表插入似乎没有必要写得那么麻烦,直接先处理主表再处理从表就好了,分开处理。
方法一:就按照你原先使用的自增长主键(其实那种主键有无都没区别),每次更新从表时,删除所有对应主表单号下的所有记录,全新插入,对于特定数据库如Oracle来说,全新插入比更新效率更高。
方法二:给从表设置联合主键,对于每个主表单号下,单独从0(或者1)开始编号,将主表的单号和自身的编号作为联合主键,这样就可以判断是否存在,是否需要更新了。