对于“不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题的解决

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

用SqlCommandBuilder更新DataSet,遇到“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题,关键代码如下(C#):

........

string emailSql="select email,validFlag from emailMe";

DataSet emailAdd=new DataSet();

SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);

SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);

emailAdapter.Fill(emailAdd,"address");

myConn.Close();

......//修改myDs数据

emailAdapter.Update(emailAdd,"address");

emailMe的结构是这样的:

email nvarchar 100

validFlag int

运行这段代码,竟然出现了“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”错误。想了一下,是因为emailMe表中没有定义主键字段,所以SqlCommandBuilder无法为SqlDataAdapter自动生成需要的UpdateCommand。修改表的定义,将email字段定义为主键问题当然可以解决,但是因为库里表太多了,逐一修改几乎不可能,有没有其他办法呢?

在网上搜了一下,发现有位网名“蓝色理想”的朋友给出了一个解决方案(http://www.blueidea.com/tech/program/2004/1761.asp),赶紧试一下:

........

string emailSql="select email,validFlag from emailMe";

DataSet emailAdd=new DataSet();

SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);

SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);

emailAdapter.Fill(emailAdd,"address");

myConn.Close();

DataTable myDt=emailAdd.Tables["address"];

myDt.PrimaryKey=new DataColumn[]{myDt.Columns["email"]};

......//修改myDs数据

emailAdapter.Update(emailAdd,"address");

结果还是同样的问题!不知道是为什么(还在继续研究中)。无奈翻阅MSDN,发现了定义UpdateCommand的方法,结果,问题就是这样解决的:

........

string emailSql="select email,validFlag from emailMe";

DataSet emailAdd=new DataSet();

SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);

SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);

SqlCommand upCmd=new SqlCommand("update ["+strTableName+"] set validFlag=@validFlag where email=@email",myConn);

upCmd.Parameters.Add("@validFlag",SqlDbType.Int,8,"validFlag");

upCmd.Parameters.Add("@email",SqlDbType.NVarChar,100,"email");

emailAdapter.UpdateCommand=upCmd;

emailAdapter.Fill(emailAdd,"address");

myConn.Close();

......//修改myDs数据

emailAdapter.Update(emailAdd,"address");

总结一下,对这样的问题,解决方法两种:

1. 修改表的定义,定义一个主键;

2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);

3. 我还不知道的其他方法,蓝色理想朋友的文章怎么看都有道理,代码也很有道理,或许我还不明白?继续学习!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航