使用存储过程更新命令

时间:2013-11-14 12:24:16

标签: c# sql sql-server winforms

我有一个更新查询(存储过程),当我执行它时,它在SQL Server中正常工作。

CREATE PROCEDURE updatestudenthws(@stdid nvarchar(50),@hwid int, @grade float)
AS
UPDATE Table_Exercise_Answer 
SET
ExAns_Grade = @grade
WHERE ExAns_Exercise = @hwid AND ExAns_Student = @stdid

但是当我运行程序时,它对我的​​表没有任何影响,而且我也没有任何错误。

     con.Open();
        SqlCommand cmd = new SqlCommand("updatestudenthws", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@hwid", SqlDbType.VarChar);
        cmd.Parameters.Add("@stdid", SqlDbType.VarChar);
        cmd.Parameters.Add("@grade", SqlDbType.VarChar);
        cmd.Parameters["@hwid"].Value = hwid;
        cmd.Parameters["@stdid"].Value = studentid;
        cmd.Parameters["@grade"].Value = grade;

        cmd.ExecuteNonQuery(); 
     con.Close();

我的错误是什么? 我应该怎么做这个工作?

3 个答案:

答案 0 :(得分:2)

使用AddWithValue(),因此您无需提供类型,这样就可以将varchar传递给int参数。

 con.Open();
    SqlCommand cmd = new SqlCommand("updatestudenthws", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@hwid", hwid);
    cmd.Parameters.AddWithValue("@stdid", studentid);
    cmd.Parameters.AddWithValue("@grade", grade);
    cmd.ExecuteNonQuery(); 
 con.Close();

答案 1 :(得分:2)

定义存储过程参数的ADO.NET代码是错误的,因为您没有使用正确的数据类型定义参数。

您的存储过程定义:

  • @stdid nvarchar(50) - >但您将其定义为varchar
  • @hwid int - >但您将其定义为varchar
  • @grade float - >但您将其定义为varchar

您需要将代码更改为:

SqlCommand cmd = new SqlCommand("updatestudenthws", con);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@hwid", SqlDbType.Int);   // this needs to be SqlDbType.Int 
cmd.Parameters.Add("@stdid", SqlDbType.NVarChar, 50);  // this should be SqlDbType.NVarChar and specify its proper length
cmd.Parameters.Add("@grade", SqlDbType.Float);  // this needs to be SqlDbType.Float

答案 2 :(得分:0)

当你使用 AddWithValue()时,你不必提供像varchar这样的类型传递给int参数。

 con.Open();
        SqlCommand cmd = new SqlCommand("updatestudenthws", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@hwid", hwid);
        cmd.Parameters.AddWithValue("@stdid", studentid);
        cmd.Parameters.AddWithValue("@grade", grade);
        cmd.ExecuteNonQuery(); 
     con.Close();