2016-03-03 51 views
1

我試圖開始使用存儲過程。那麼,我現在有一個查詢只是返回一個字符串的單個值。我似乎無法看到我在這裏錯誤地做了什麼。轉換參數和存儲過程不起作用

的SQL低於:

BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

Declare @ReturnVal Varchar(20) 

-- Insert statements for procedure here 
set @ReturnVal = (select a.AccBCPublicId from [MyTable Goes Here] a where a.AccId = @ACCId) 

return @ReturnVal 

END

using (SqlCommand sqlCommand = new SqlCommand("[dbo].[My Stored Procedure]", sqlConnection) { CommandType = CommandType.StoredProcedure }) 
    { 
    //clean the starting 0's before sending. Originally had leading zeros 
    sqlCommand.Parameters.Add(new SqlParameter("@ACCId", strAccId.TrimStart(Convert.ToChar("0")))); 
    SqlParameter returnParam = new SqlParameter("@ReturnVal", SqlDbType.NVarChar, 20) {Direction = ParameterDirection.ReturnValue }; 
    sqlCommand.Parameters.Add(returnParam); 

    sqlCommand.ExecuteNonQuery(); 

    string bcAccount = (string)returnParam.Value; 
} 

我不斷收到以下錯誤。我明白爲什麼它看作爲int值類型。

Conversion failed when converting the varchar value 'bc:99988' to data type int. 
+0

聽起來像是你的'AccId'是'int'類型,但你提供它'BC:99988'爲字符串。 –

+0

放一個斷點並檢查你的TrimStart是否有效......它似乎不是那麼誠實。 – Veljko89

+0

這就是我想的,但它發送在不同的價值。所有int。 bc:值是返回的PCPublicId。 – Casey

回答

1

RETURN T-SQL statement傳遞只能是一個整數表達式的值,則不能傳回的字符串。看來,最簡單的選擇是使用的ExecuteScalar

BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

select a.AccBCPublicId from [MyTable Goes Here] a where a.AccId = @ACCId 

並在代碼中使用

using (SqlCommand sqlCommand = new SqlCommand(.....)) 
{ 
    sqlCommand.Parameters.Add(.....) 
    object result = sqlCommand.ExecuteScalar(); 
    if(result != null) 
     string bcAccount = result.ToString(); 
    .... 
} 
+0

我沒有說這個,那個解釋它。謝謝。 – Casey

+1

完美工作。謝謝,現在我會記住這一點。 – Casey