C# - ExecuteNonQuery不执行存储过程

时间:2016-05-09 15:55:39

标签: c# sql-server stored-procedures executenonquery

我正在尝试使用如下所示的参数运行存储过程:

存储过程:

CREATE PROCEDURE [dbo].[spPurchase]
     @commodityName VARCHAR(10),
     @startdate DATE,  
     @enddate DATE,
     @tonnes FLOAT,
     @lots INT,
     @value FLOAT,
     @ccy VARCHAR(3),
     @clientref VARCHAR(50),
     @clientid INT,
     @userid INT
AS
BEGIN
    ........
    ........
    ........
END

执行此存储过程的C#代码:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["InventoryConnectionString"].ConnectionString);

SqlCommand cmd = new SqlCommand("spPurchase", conn);

cmd.Parameters.Add("@commodityName", SqlDbType.VarChar, 10).Value = ddlMetals.SelectedValue;
cmd.Parameters.Add("@startdate", SqlDbType.Date).Value = startDate.Value;
cmd.Parameters.Add("@enddate", SqlDbType.Date).Value = endDate.Value;
cmd.Parameters.Add("@tonnes", SqlDbType.Float).Value = Convert.ToDouble(tbQuantity.Value);
cmd.Parameters.Add("@lots", SqlDbType.Int).Value = DBNull.Value;
cmd.Parameters.Add("@value", SqlDbType.Float).Value = DBNull.Value;
cmd.Parameters.Add("@ccy", SqlDbType.VarChar, 3).Value = DBNull.Value;
cmd.Parameters.Add("@clientref", SqlDbType.VarChar, 50).Value = "EigerTest";
cmd.Parameters.Add("@clientid", SqlDbType.Int).Value = Convert.ToInt32(Utils.LoggedInUserId);
cmd.Parameters.Add("@userid", SqlDbType.Int).Value = Convert.ToInt32(Utils.LoggedInUsersAccountId);

cmd.CommandType = CommandType.StoredProcedure;

try
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
    throw new Exception(ex.Message, ex);
}
finally
{
    cmd.Connection.Close();
}

存储过程从SQL Server运行良好,C#代码成功连接到数据库。但是,它不执行存储过程,也不会产生任何异常或错误。

查看我的数据库中的最近查询,看起来我的C#代码可能只是尝试创建存储过程而不是执行它。

谁能看到我做错了什么?

1 个答案:

答案 0 :(得分:0)

在调试类似问题时,我发现问题出在我的存储过程中。默认情况下,它不会引发任何SQL错误。因此,我添加了RAISEERROR语句,但即使这样也没有引起问题。我不得不将RAISEERROR的严重性更改为> 10,然后才能浮现为C#。

之后,调试非常简单。我在C#中传递的参数类型不匹配,这导致IF语句在过程中失败。没有RAISEERROR的话,调试起来确实很费劲。