2008-11-15 44 views
2

我有一個sproc和一些C#調用它。我的問題是這兩個(N)VARCHAR值只有返回的第一個字符。其他一切都很好。爲什麼只返回第一個字符?只返回第一個字符的Sproc參數

所以

Content = (string)cmd.Parameters["@SmsContent"].Value, 
ToNumber = (string) cmd.Parameters["@ToNumber"].Value, 

都只能拿到第1個字符返回。

這裏是我的存儲過程:

ALTER PROCEDURE [dbo].[GetNextSms] 
( 
    @SmsId UNIQUEIDENTIFIER OUTPUT, 
    @SmsContent NVARCHAR OUTPUT, 
    @ToNumber VARCHAR OUTPUT, 
    @TimeAccepted DATETIME OUTPUT 
) 
AS 
BEGIN TRANSACTION 
    -- 1. Get 1 row 
    SET ROWCOUNT 1 
     SELECT @SmsId = SmsId FROM SendQueue 
     WHERE ProcessingStarted = 0 
    SET ROWCOUNT 0 
    -- 2. Set as processing 
    UPDATE SendQueue 
     SET ProcessingStarted = 1 
     WHERE SmsId = @SmsId 
    -- 3. Return data 
    SELECT @SmsId = SmsId, 
     @SmsContent = SmsContent, 
     @ToNumber = ToNumber, 
     @TimeAccepted = TimeAccepted 
    FROM SendQueue 
    WHERE SmsId = @SmsId; 

COMMIT 

這裏是我的C#

connection.Open(); 
var cmd = new SqlCommand(@"GetNextSms", connection) {CommandType = CommandType.StoredProcedure}; 
SqlParameter param = cmd.Parameters.Add("@SmsId", SqlDbType.UniqueIdentifier); 
param.Direction = ParameterDirection.Output; 
param = cmd.Parameters.Add("@ToNumber", SqlDbType.VarChar,50); 
param.Direction = ParameterDirection.Output; 
param = cmd.Parameters.Add("@SmsContent", SqlDbType.NVarChar,1024); 
param.Direction = ParameterDirection.Output; 
param = cmd.Parameters.Add("@TimeAccepted", SqlDbType.DateTime); 
param.Direction = ParameterDirection.Output; 


if (cmd.ExecuteNonQuery() > 0) 
{ 
    sms = new Sms 
       { 
        SmsId = ((Guid) cmd.Parameters["@SmsId"].Value), 
        Content = (string)cmd.Parameters["@SmsContent"].Value, 
        ToNumber = (string) cmd.Parameters["@ToNumber"].Value, 
        TimeAccepted = ((DateTime) cmd.Parameters["@TimeAccepted"].Value) 
       }; 
} 

回答

8

基礎上有點搜索(即我還沒有嘗試過),你應該申報您的存儲過程的參數與長度也是,即

ALTER PROCEDURE [dbo].[GetNextSms] 
( 
    @SmsId UNIQUEIDENTIFIER OUTPUT, 
    @SmsContent NVARCHAR(1024) OUTPUT, 
    @ToNumber VARCHAR(50) OUTPUT, 
    @TimeAccepted DATETIME OUTPUT 
) 

道歉,如果這不是答案,但它是值得一試。它似乎同意the MSDN doc,表示NVARCHAR/VARCHAR的默認長度爲1.

相關問題