2015-01-15 196 views
1

当我尝试背后叫我的存储过程的代码的形式在我的网站,我得到这个错误。我一直停留相当长的一段时间了,因为我不知道的任何地方我转换或声明的值作为整数做。这是我的SQL语句:错误转换nvarchar的数据类型为int

create procedure GetRepPhoneID 
@Rep  nvarchar(100), 
@phoneID nvarchar(100) output 
as 
set @phoneID = (select concat(CustomerRepPh, '~', cast(RepID as nvarchar(100))) as 'PhoneAndID' 
from Reps 
where [email protected]) 
return @phoneID 
go 
从我的C#代码

那么后面我试图调用存储过程:

公共静态字符串GetRepPhone(字符串众议员) { 字符串连接= WebConfigurationManager.ConnectionStrings [ “JDC_DatabaseConnectionString”]的ConnectionString。 的SqlConnection的SqlConnection =新的SqlConnection(连接);

//This funciton will take all of the values and create them. 
    try 
    { 
     sqlConnection.Open(); 
    } 
    catch (Exception err) 
    { 
     Console.WriteLine(err.Message); 
    } 

    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = sqlConnection; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "GetRepPhoneID";   //getting the procedure created in SQL. 

    SqlParameter CustomerParam = new SqlParameter(); 
    CustomerParam.ParameterName = "Rep"; 
    CustomerParam.SqlDbType = SqlDbType.NVarChar; 
    CustomerParam.Value = Rep; 
    CustomerParam.Direction = ParameterDirection.Input; 

    //We are using an output parameter not a return one because it is a string. 
    SqlParameter ReturnParam = new SqlParameter("phoneID", SqlDbType.NVarChar, 100); 
    ReturnParam.Direction = ParameterDirection.Output; 

    cmd.Parameters.Add(CustomerParam); 
    cmd.Parameters.Add(ReturnParam); 

    cmd.ExecuteNonQuery(); 

    sqlConnection.Close(); 
    return ReturnParam.Value.ToString(); 
} 

我做同样的事情多次在我的代码,但他们都返回整数所以一直没有异常,所以我知道它应该工作的错误。错误正在cmd.ExecuteNonQuery()行中引发。确切的错误是:

Conversion failed when converting the nvarchar value '(111)222-6666~29' to data type int. 

我明白,我不能说字符串转换为整数,但我不认为在我的代码的任何地方,我宣布一个整数,或者我试图转换。

任何帮助将不胜感激。谢谢。

回答

3

你是一个OUTPUT参数混淆一个RETURN值。 RETURN是类型INT的可选状态码。将另一个参数声明为OUTPUT。

意义,这是在存储过程中无效:

return @phoneID 

相反,加@phoneID nvarchar(100) OUTPUT参数列表并删除DECLARE @PhoneID

CREATE PROCEDURE GetRepPhoneID 
(
    @Rep  NVARCHAR(100), 
    @phoneID NVARCHAR(100) OUTPUT 
) 
AS 
SET NOCOUNT ON; 

SELECT @phoneID = concat(CustomerRepPh, '~', RepID) 
FROM Reps 
WHERE CustomerRep = @Rep; 

上述表示整个 PROC。你不需要RETURNSET

然后在C#代码,您需要更改参数是如何规定:

SqlParameter ReturnParam = new SqlParameter("phoneID", SqlDbType.NVarChar, 100); 
ReturnParam.Direction = ParameterDirection.Output; 

然后删除此行,因为它没有必要的,因为该参数的值将保持连接关闭后:

string PhoneAndID = cmd.Parameters[1].Value.ToString(); 

并更改return是:

return ReturnParam.Value.ToString(); 

拉斯维加斯您可能需要更新输入参数的声明,如下所示:

SqlParameter CustomerParam = new SqlParameter("Rep", SqlDbType.NVarChar, 100); 
CustomerParam.Value = Rep; 
CustomerParam.Direction = ParameterDirection.Input; 
+0

感谢您的帮助。这摆脱了原来的错误,但现在是抛出'字符串[1]:Size属性有0.' – 2015-01-15 17:20:37

+0

@ChaseErnst我刚才编辑与帕拉姆声明C#部分的大小无效。 – 2015-01-15 17:23:22

+0

这使我回到原来的错误。我已将问题更新到我当前的代码。 – 2015-01-15 17:26:58

相关问题