用存储过程修改数据库表里的一条记录里的一个字段,在线等,急!

时间:2022-11-01 05:59:48
想用存储过程UpdateStu把表stu里的记录stuid为1的stuname改为tom,
死活不行,stuname依旧为jack。请各位帮忙。谢谢!!!

表名为stu, 里面只有一条记录。
stuid stuname
--------------------
1 jack

存储过程为UpdateStu
create  PROCEDURE UpdateStu
@stuid char(10), 
@stuname char(10)
as
begin
    set NOCOUNT on
    UPDATE stu SET stuname = @stuname WHERE stuid = @stuid
    return 0
end
go

代码为:
    //准备dataset
    DataSet stuSet = new DataSet();
    DataTable table   = new DataTable("stu");
    DataColumnCollection columns = table.Columns;
    columns.Add("stuid", typeof(System.String));
    columns.Add("stuname", typeof(System.String));
    stuSet.Tables.Add(table);
    DataRow stuRow = stuSet.Tables["stu"].NewRow();
    stuRow["stuid"] = "1";
    stuRow["stuname"] = "tom";
    stuSet.Tables["stu"].Rows.Add(stuRow);
    stuSet.AcceptChanges();

    //准备dscommand
    SqlDataAdapter dsCommand = new SqlDataAdapter();
    dsCommand.TableMappings.Add("Table", "stu");
    string strConn = "server=.;User ID=sa;Password=pwd;database=mytest;Connection Reset=FALSE";
    SqlCommand updateCommand = new SqlCommand("UpdateStu", strConn);
    
    updateCommand.CommandType = CommandType.StoredProcedure;
    SqlParameterCollection sqlParams = updateCommand.Parameters;//准备参数
    sqlParams.Add(new SqlParameter("@stuid", SqlDbType.Char, 10));
    sqlParams.Add(new SqlParameter("@stuname", SqlDbType.Char, 10));
    sqlParams["@stuid"].SourceColumn = "stuid";//字段映射
    sqlParams["@stuname"].SourceColumn = "stuname";//字段映射
    
    dsCommand.UpdateCommand = updateCommand;
    dsCommand.Update(stuSet, "stu");//提交数据库
    stuSet.AcceptChanges();

20 个解决方案

#1


跟踪一下,看看生成的语句对不对

#2


to:dgrwang() 
请问如何才能查看到生成的语句?谢谢!

#3


上面的代码全部都编译通过了

#4


调试以下。

#5


//****用SQL事探器看一下,更新SQL语句是否正确.

#6


樓主把問題複雜化了。一個更新語句,不需要這麼復雜:

//定義初始變量
string strConn = "server=.;User ID=sa;Password=pwd;database=mytest;Connection Reset=FALSE";
SqlConnection conn=New SqlConnection(strConn);
SqlCommand updateCommand = new SqlCommand("UpdateStu @studid,@stuname", conn);
updateCommand.CommandType = CommandType.StoredProcedure;

//加入參數
SqlParameter param=New SqlParameter("@stuid", SqlDbType.Char, 10));
param.Value="1";
updateCommmand.Parameters.Add(param);

param=new SqlParameter("@stuname", SqlDbType.Char, 10));
param.Value="tom";
updateCommmand.Parameters.Add(param);

//更新數據
updateCommand.Connection.Open();
updateCommand.ExecuteNonQuery();
updateCommand.Connection.Close();
updateCommand.Dispose();

#7


to: kssys() 
首先谢谢您的回答!
其实我也不想负杂话。
上面我写的代码其实是把表现层、db访问层合并到一起了。
我原来的代码层和层之间是通过dataset来传递信息的,
所以会简单问题复杂化。

#8


to: kssys() 
用你的代码是可以解决问题,
但我那个还不行:)
郁闷的是不知道问题出在哪儿,
我也调试过了,但不知道重点看什么调试信息.

#9


看生成的SQL语句,,

#10


因為你的參數裡面沒有賦值

//在Add後面加上 
sqlParams["@stuid"].value=stuSet.Tables["stu"].Rows[0][0];
sqlParams["@stuname"].value=stuSet.Tables["stu"].Rows[0][1];

如果批量更新Table,應循環產生更新語句

#11


to: kssys() 
我已经构建好了stuSet,也就是说stuSet里已经有了数据
然后我又通过下面两句进行字段映射
    sqlParams["@stuid"].SourceColumn = "stuid";//字段映射
    sqlParams["@stuname"].SourceColumn = "stuname";//字段映射
所以sqlParams["@stuname"].value是不需要设置的

#12


Try it

#13


to: kssys() 
我试过了,在
sqlParams["@stuname"].SourceColumn = "stuname";//字段映射
后加了你说了那两句:
sqlParams["@stuid"].Value = "1";
sqlParams["@stuname"].Value = "tom";
但还是不行:(

#14


SqlCommand updateCommand = new SqlCommand("UpdateStu", strConn);

->

SqlCommand updateCommand = new SqlCommand("UpdateStu @studid,@stuname", strConn);

#15


to: kssys() 
按你说的做了,还是不行

#16


to: kssys() 
是不是我还缺点映射?好像映射方面出了问题

#17


不好意思,走开了。

不能更新的原因是因为运行Update()之前,调用了AcceptChanges()方法。

AcceptChanges();方法将把所有RowState设为Unchanged;因此将不更新数据库

#18


将不会调用UpdateCommand来执行更新。

#19


因此可以这样来写:
DataRow stuRow = stuSet.Tables["stu"].NewRow();
stuSet.Tables["stu"].Rows.Add(stuRow);
stuSet.AcceptChanges();
stuRow["stuid"] = "1";
stuRow["stuname"] = "tom";

#20


to:kssys()
问题已解决,真是太感谢你了!

#1


跟踪一下,看看生成的语句对不对

#2


to:dgrwang() 
请问如何才能查看到生成的语句?谢谢!

#3


上面的代码全部都编译通过了

#4


调试以下。

#5


//****用SQL事探器看一下,更新SQL语句是否正确.

#6


樓主把問題複雜化了。一個更新語句,不需要這麼復雜:

//定義初始變量
string strConn = "server=.;User ID=sa;Password=pwd;database=mytest;Connection Reset=FALSE";
SqlConnection conn=New SqlConnection(strConn);
SqlCommand updateCommand = new SqlCommand("UpdateStu @studid,@stuname", conn);
updateCommand.CommandType = CommandType.StoredProcedure;

//加入參數
SqlParameter param=New SqlParameter("@stuid", SqlDbType.Char, 10));
param.Value="1";
updateCommmand.Parameters.Add(param);

param=new SqlParameter("@stuname", SqlDbType.Char, 10));
param.Value="tom";
updateCommmand.Parameters.Add(param);

//更新數據
updateCommand.Connection.Open();
updateCommand.ExecuteNonQuery();
updateCommand.Connection.Close();
updateCommand.Dispose();

#7


to: kssys() 
首先谢谢您的回答!
其实我也不想负杂话。
上面我写的代码其实是把表现层、db访问层合并到一起了。
我原来的代码层和层之间是通过dataset来传递信息的,
所以会简单问题复杂化。

#8


to: kssys() 
用你的代码是可以解决问题,
但我那个还不行:)
郁闷的是不知道问题出在哪儿,
我也调试过了,但不知道重点看什么调试信息.

#9


看生成的SQL语句,,

#10


因為你的參數裡面沒有賦值

//在Add後面加上 
sqlParams["@stuid"].value=stuSet.Tables["stu"].Rows[0][0];
sqlParams["@stuname"].value=stuSet.Tables["stu"].Rows[0][1];

如果批量更新Table,應循環產生更新語句

#11


to: kssys() 
我已经构建好了stuSet,也就是说stuSet里已经有了数据
然后我又通过下面两句进行字段映射
    sqlParams["@stuid"].SourceColumn = "stuid";//字段映射
    sqlParams["@stuname"].SourceColumn = "stuname";//字段映射
所以sqlParams["@stuname"].value是不需要设置的

#12


Try it

#13


to: kssys() 
我试过了,在
sqlParams["@stuname"].SourceColumn = "stuname";//字段映射
后加了你说了那两句:
sqlParams["@stuid"].Value = "1";
sqlParams["@stuname"].Value = "tom";
但还是不行:(

#14


SqlCommand updateCommand = new SqlCommand("UpdateStu", strConn);

->

SqlCommand updateCommand = new SqlCommand("UpdateStu @studid,@stuname", strConn);

#15


to: kssys() 
按你说的做了,还是不行

#16


to: kssys() 
是不是我还缺点映射?好像映射方面出了问题

#17


不好意思,走开了。

不能更新的原因是因为运行Update()之前,调用了AcceptChanges()方法。

AcceptChanges();方法将把所有RowState设为Unchanged;因此将不更新数据库

#18


将不会调用UpdateCommand来执行更新。

#19


因此可以这样来写:
DataRow stuRow = stuSet.Tables["stu"].NewRow();
stuSet.Tables["stu"].Rows.Add(stuRow);
stuSet.AcceptChanges();
stuRow["stuid"] = "1";
stuRow["stuname"] = "tom";

#20


to:kssys()
问题已解决,真是太感谢你了!

#21