对于存储过程,我收到以下异常/错误。
“将varchar值
AL-DMK2_1
转换为数据类型int时转换失败。”
存储过程:
ALTER PROCEDURE dbo.sp_generateNewRequestId
(
@Customer varchar(50),
@Network_Type varchar(25),
@Market_Name varchar(50),
@NewRequestId varchar(50) OUTPUT
)
AS
Begin
Declare @MarketCode as varchar(10);
Declare @CustomerPrefix as varchar(10);
SET @MarketCode = (select Market_Code from Customer_Market_Details where Customer = @Customer and Network_Type = @Network_Type and Market_Name = @Market_Name);
SET @CustomerPrefix = (select Customer_Prefix from Customer_Market_Details where Customer = @Customer and Network_Type = @Network_Type and Market_Name = @Market_Name);
Declare @RequestIDPrefix as varchar(20);
SET @RequestIdPrefix = @CustomerPrefix + @MarketCode + '_';
-- Count how many requests you already have with the same request ID Prefix.
Declare @RequestCount as int;
SET @RequestCount = (Select count (*) from request_details where request_id like @RequestIdPrefix + '%');
SET @NewRequestId = @RequestIdPrefix + CAST ((@RequestCount + 1) AS varchar);
While (Exists (Select * from request_details where request_id = @NewRequestId ) )
Begin
SET @RequestCount = @RequestCount + 1;
SET @NewRequestId = @RequestIdPrefix + CAST ((@RequestCount + 1) AS varchar);
end
RETURN @NewRequestId;
END
调用存储过程:
using (SqlConnection connection = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["dbString"].ConnectionString))
{
using (SqlCommand command = new SqlCommand("dbo.sp_generateNewRequestId", connection))
{
command.Parameters.AddWithValue("@Customer", customer);
command.Parameters.AddWithValue("@Network_Type", technology);
command.Parameters.AddWithValue("@Market_Name", market);
command.Parameters.Add("@NewRequestId", SqlDbType.VarChar).Direction = ParameterDirection.Output;
command.Parameters["@NewRequestId"].Size = 50;
command.CommandType = CommandType.StoredProcedure;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
}
观察:
当输出参数设置为@RequestCount时,该过程成功返回@RequestCount。
但是,如果尝试输出任何其他varchar
值,则抛出上述错误的异常。行command.ExecuteNonQuery()
处的执行失败。
在线提供的解决方案均无法解决此错误。 感谢您的帮助!
谢谢!
答案 0 :(得分:5)
如果您从存储过程返回任何内容,则必须将其转换为int
,因为SqlCommand.ExecuteNonQuery()
的返回类型为int
(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx)并且SQL Server存储过程中的RETURN
语句只能用于返回整数值(http://msdn.microsoft.com/en-us/library/ms174998.aspx),因此ExecuteNonQuery
的返回类型为int
,否则会是object
。
你几乎就在那里,只是摆脱存储过程中的return语句,所以它看起来像这样:
ALTER PROCEDURE dbo.sp_generateNewRequestId
(
@Customer varchar(50),
@Network_Type varchar(25),
@Market_Name varchar(50),
@NewRequestId varchar(50) OUTPUT
)
AS
Begin
Declare @MarketCode as varchar(10);
Declare @CustomerPrefix as varchar(10);
SET @MarketCode = (select Market_Code from Customer_Market_Details where Customer = @Customer and Network_Type = @Network_Type and Market_Name = @Market_Name);
SET @CustomerPrefix = (select Customer_Prefix from Customer_Market_Details where Customer = @Customer and Network_Type = @Network_Type and Market_Name = @Market_Name);
Declare @RequestIDPrefix as varchar(20);
SET @RequestIdPrefix = @CustomerPrefix + @MarketCode + '_';
-- Count how many requests you already have with the same request ID Prefix.
Declare @RequestCount as int;
SET @RequestCount = (Select count (*) from request_details where request_id like @RequestIdPrefix + '%');
SET @NewRequestId = @RequestIdPrefix + CAST ((@RequestCount + 1) AS varchar);
While (Exists (Select * from request_details where request_id = @NewRequestId ) )
Begin
SET @RequestCount = @RequestCount + 1;
SET @NewRequestId = @RequestIdPrefix + CAST ((@RequestCount + 1) AS varchar);
end
END
将C#代码修改为:
string newRequestID = "";
using (SqlConnection connection = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["dbString"].ConnectionString))
{
using (SqlCommand command = new SqlCommand("dbo.sp_generateNewRequestId", connection))
{
command.Parameters.AddWithValue("@Customer", customer);
command.Parameters.AddWithValue("@Network_Type", technology);
command.Parameters.AddWithValue("@Market_Name", market);
command.Parameters.Add("@NewRequestId", SqlDbType.VarChar).Direction = ParameterDirection.Output;
command.Parameters["@NewRequestId"].Size = 50;
command.CommandType = CommandType.StoredProcedure;
connection.Open();
command.ExecuteNonQuery();
newRequestID = (string)command.Parameters["@NewRequestId"].Value;
connection.Close();
}
}