用了一个DataSet.Relations.add
ds.Relations.Add("admin",ds.Tables["stu"].Columns["name"],ds.Tables["stu"].Columns["name"]);
foreach()
{
   ...
}我用了这个语句后,第一次导入数据没问题,但是第二次导入的时候,就出错了。
提示:
名为“admin”的关系已经属于此 DataSet。如果我退出程序后再次运行就没问题,可是我现在不想退出啊,要连续导入数据。现在该怎么办啊??ds.dispose() 释放不了sos

解决方案 »

  1.   

    导入所有数据到dataset后,再设置relation
      

  2.   

    ds.Relations.Add("admin",ds.Tables["stu"].Columns["name"],ds.Tables["stu"].Columns["name"]);
    这段不是导入数据的啊,只是把两表建立关系,还有你导入数据在哪里啊.还有为什么两个表名都一样的.你把导入数据的代码贴出来啊.
      

  3.   

    ds.Relations.Add("admin",ds.Tables["stu"].Columns["name"],ds.Tables["stu"].Columns["name"]);
    这句在构造函数中执行,别放到按钮事件中,ds作为一个全局变量,初始化后就不要动了。
      

  4.   


    导数据的代码放在前面。然后再
    ds.Relations.Add("admin",ds.Tables["stu"].Columns["name"],ds.Tables["stu"].Columns["name"]);
      

  5.   

    下面我把代码贴出来算了:
                   //--------------把生产入库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();
                            }
                        }
                    }
      

  6.   

    我还真没写过这样的数据集,好绕啊。
    dr.Relations["Test"].ParentTable 和 dr 有什么区别?不是同一张表吗?
    主从表插入似乎没有必要写得那么麻烦,直接先处理主表再处理从表就好了,分开处理。
      

  7.   

    分开处理的话,我只能处理主表,因为主表的单号instock_id是唯一的。但是从不的话,有可能有完全相同的2条记录我之前是用if not exists(select top 1 * from 主表 where instock_id ='"+dr.Tables["pro_halfproinstock_head"].Rows[i]["instock_id"] +"')来处理主表的,但是处理从表的时候,这样就不行了,因为从表是有2条完全相同的记录,从表的主键是自增长列ID。。
      

  8.   

    其实很简单,有两种方式处理从表:
    方法一:就按照你原先使用的自增长主键(其实那种主键有无都没区别),每次更新从表时,删除所有对应主表单号下的所有记录,全新插入,对于特定数据库如Oracle来说,全新插入比更新效率更高。
    方法二:给从表设置联合主键,对于每个主表单号下,单独从0(或者1)开始编号,将主表的单号和自身的编号作为联合主键,这样就可以判断是否存在,是否需要更新了。
      

  9.   

    谢谢各位的回答,问题已经解决好了。原因是我把DataSet dr = new DataSet()放在全局变量了,把它放到局部变量就不会出现任何问题了。12楼分析的很有道理,就是先删除后插入,以后我会再测试一下看看。