2008-11-15 43 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.

相关问题