您的位置:首页 > 数据库

对于不返回任何键列信息的SelectCommand,不支持UpdateCommand 的动态SQL生成

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

string connectionString = "Data Source=127.0.0.1;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=1234";

string commandString = "SELECT * FROM tbl_Option";

SqlConnection con = new SqlConnection(connectionString);

SqlCommand cmd = con.CreateCommand();

cmd.CommandType = CommandType.Text;

cmd.CommandText = commandString;

SqlDataAdapter dataAdapter = new SqlDataAdapter();//构造SqlDataAdapter

dataAdapter.SelectCommand = cmd;//与sql命令对象绑定,这个必不可少

SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);

DataSet ds = new DataSet();

dataAdapter.Fill(ds, "Option1");

con.Close();

ds.Tables["Option1"].Rows[0][1]="张三";

dataAdapter.Update(ds, "Option1");

运行这段代码,竟然出现了“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成”错误。

网上查了一下资料说是没有定义主键,可如果数据库表有很多个,那数据库中表就需要改动的地方太多了,有没有其它方法呢

网上给了一个方法,我这边测试是成功的

关键代码如下:

……………………

DataSet ds = new DataSet();

SqlCommand upCmd = new SqlCommand("update tbl_Option set OptionName=@OptionName where OptionID=@OptionID", con);

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

upCmd.Parameters.Add("@OptionName", SqlDbType.NVarChar, 50, "OptionName");

dataAdapter.DeleteCommand = upCmd;

dataAdapter.Fill(ds, "Option1");

con.Close();

ds.Tables["Option1"].Rows[0][1]="张三";

dataAdapter.Update(ds, "Option1");

……………………

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

1. 修改表的定义,定义一个主键;
2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);

3. 其它方法(在网上搜了一下,发现有位网名“蓝色理想”的朋友给出了一个解决方案(http://www.blueidea.com/tech/program/2004/1761.asp),应该是没有问题的,本人小菜,还没弄明白,望高手给予解答。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐