C#-ExecuteNonQuery是';不执行存储过程

C#-ExecuteNonQuery是';不执行存储过程,c#,sql-server,stored-procedures,executenonquery,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),

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

存储过程:

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
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();
}
执行此存储过程的C#代码:

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
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代码似乎只是试图创建存储过程,而不是执行它


有人知道我做错了什么吗?

调试类似问题时,我发现问题出在我的存储过程上。默认情况下,它不会引发任何SQL错误。所以我添加了一个
RAISEERROR
语句,但即使这样也没有引起问题。我必须将我的
RAISEERROR
更改为使用>10的严重性,然后它才会显示为C


之后,就可以直接调试了。我在C#中传递的参数中存在类型不匹配,这导致过程中IF语句失败。如果没有
RAISEERROR
,调试起来真的很麻烦。

在调试类似的问题时,我发现问题出在我的存储过程上。默认情况下,它不会引发任何SQL错误。所以我添加了一个
RAISEERROR
语句,但即使这样也没有引起问题。我必须将我的
RAISEERROR
更改为使用>10的严重性,然后它才会显示为C


之后,就可以直接调试了。我在C#中传递的参数中存在类型不匹配,这导致过程中IF语句失败。如果没有
RAISEERROR
的话,调试真的很麻烦。

存储的进程在做什么?只是更新各种表。
lots
在代码中是
float
,但在db中是
int
<代码>值在代码中是
int
,但在db中是
float
;这会导致问题吗?只需打开Sql profiler,看看会发生什么。当您说SP未执行且没有错误时,.Net正在向SP发送参数,但内部查询没有执行任何操作;您是否尝试过使用
SQL Server探查器
。您可以看到SP及其传递给SQL Server的实际参数。从探查器中取出它并尝试从ssms调试存储的进程在做什么?只是更新各种表。
lots
在代码中是
float
,但在db中是
int
<代码>值在代码中是
int
,但在db中是
float
;这会导致问题吗?只需打开Sql profiler,看看会发生什么。当您说SP未执行且没有错误时,.Net正在向SP发送参数,但内部查询没有执行任何操作;您是否尝试过使用
SQL Server探查器
。您可以看到SP及其传递给SQL Server的实际参数。将其从探查器中取出,并尝试从SSMS进行调试