以前问过这个问题 还不是很清楚。
  我想在某个表中保存一些参数,保存前需要判断该记录是否存在,如果不存在则插入一条记录,
  如果存在,则更新这条记录。
  表结构ExtrInfo如下  int varchar(50) varchar(50) varchar(50) varchar(50) varchar(50)
  Id    Header     SubItem1    SubItem2    SubItem3    SubItem4
    
  以前ADO的时候,直接用下面操作就可以了
  查询索引 sql="select * from extrainfo where header='标志'
  _RecordsetPtr pRst;
  pRst.CreateInstance(__uuidof(Recordset));
  pRst->Open((_variant_t)sql,_variant_t((IDispatch*)连接实例,true),adOpenStatic,adLockOptimistic,adCmdText);
  if(pRst->adoEOF)
  pRst->AddNew();
  pRst->PutCollect("Header",_variant_t(sFlag));
  pRst->PutCollect("SubItem1",_variant_t(str1));
  pRst->PutCollect("SubItem2",_variant_t(str2));
  pRst->PutCollect("SubItem3",_variant_t(str3));
  pRst->PutCollect("SubItem4",_variant_t(str4));
  pRst->Update();
  pRst->Close(); 我想也是用上面的方式 操作记录集,请问有什么办法??
 判断记录是否存在 不存在则插入能否一次操作数据就完成???
 
 用  SqlConnection conn = database.GetConnect();
       conn.Open();
      SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
      SqlCommandBuilder CB = new SqlCommandBuilder(sda);
       DataSet ds = new DataSet();
      sda.Fill(ds, "test");        DataTable dt = ds.Tables["test"];
        if (dt.Rows.Count > 0)
                    {
                        DataRow dr = ds.Tables["test"].Rows[0];
                        dr.BeginEdit();                        dr["SubItem1"] = “内容1”;
                        dr["SubItem2"] = “内容2”;
                        dr.EndEdit();
                    }
                    else
                    {                        DataRow dr = ds.Tables["test"].NewRow();
                        dr["SubItem1"] = “内容1”;
                        dr["SubItem2"] = “内容2”;
                        ds.Tables["list"].Rows.Add(dr);
                    }              int errorNum = sda.Update(ds, "test");   
 用SqlCommand操作的时候,如果表没有主键,则提示SelectComand不支持UpdateCommand的动态Sql语句生成。
请问有其它办法没有实现。

解决方案 »

  1.   

    首先搞清楚为什么不能。因为DataTable只是从数据库查询出的数据构成的表,和数据库没有关系。如果没有主键,那么ADO.NET不能确定你要更新的是哪一条记录。因为数据库里面完全可能存在重复的数据,而DataTable并没有和数据库记录的映射关系。为什么你的ADO可以呢?因为使用的是服务器端的游标,因此有个指针指向当前的记录。知道了这些,解决方案就有了,一个是使用 DataAdapter,另一个就是在表里面增加主键。
    事实上,设计数据库表的时候,为每个表都设计主键是一种最佳时间,相反,没有主键是不良的设计陋习。
      

  2.   


    多谢 道理明白了 
    但是使用DataAdapter也必须用主键,否则也不能更新
      

  3.   

    可以用原始的ADO.NET 执行插入啊
      

  4.   

    ADO.Net应当在asp.Net之前就要了解的
    个人觉得