数码冲印数码照片网上冲印
站内搜索: 分类: 关键字:
您的位置:首页网站设计ASP学院 → 对于“不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题的解决
对于“不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”问题的解决
日期:2005-9-28 23:10:07 人气:     [ ]
数码冲印 网上冲印

用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.    我还不知道的其他方法,蓝色理想朋友的文章怎么看都有道理,代码也很有道理,或许我还不明白?继续学习!

出处:世纪开元网上冲印搜集整理 作者:未知
评论人 评论内容摘要(共 条,查看完整内容) 得分 发表时间
本类热点
01.ADO连接数据库字符串大全(VP,Excel,文本,Sybase..
02.#include file 和 #include virtual的区别(菜鸟..
03.对于“不返回任何键列信息的 SelectCommand 不支..
04.utf-8乱码title作怪
05.如何正确显示数据库中的图片
06.基于WEB系统的多语言支持--ASP国际化多语言详细方..
07.关于编译器失败,错误代码为 128。的解决方案
08.base64编码、解码函数
09.ASP实现多语言支持
10.实现无刷新DropDownList联动效果。
本类推荐
网上数码冲印专用QQ:71086443  网上数码冲印专用MSN:photo36588@hotmail.com 网上冲印热线电话:0531-82678928
http://www.36588.com.cn 世纪开元数码照片网上冲印©2001 - 2008
网站地图 | 冲印知识 | 会员利益 | 服务价格 | 质量承诺 | 服务条款 | 隐私政策 | 商业合作 | 关于我们