将varchar值'AL-DMK2_1'转换为数据类型int时转换失败

时间:2013-05-23 15:34:54

标签: c# sql-server stored-procedures

对于存储过程,我收到以下异常/错误。

  

“将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()处的执行失败。

在线提供的解决方案均无法解决此错误。 感谢您的帮助!

谢谢!

1 个答案:

答案 0 :(得分:5)

如果您从存储过程返回任何内容,则必须将其转换为int,因为SqlCommand.ExecuteNonQuery()的返回类型为inthttp://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();
     }
}