Параметр Sproc, возвращающий только первый символ - PullRequest
3 голосов
/ 15 ноября 2008

У меня есть sproc и некоторые C #, вызывающие его. Моя проблема заключается в том, что оба значения (N) VARCHAR возвращают только первый символ. Все остальное в порядке. Почему возвращается только 1-й символ?

Так

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)
              };
}

1 Ответ

11 голосов
/ 15 ноября 2008

Основываясь на небольшом поиске (т. Е. Я не пробовал), вы также должны объявлять параметры хранимой процедуры с длиной, т. Е.

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

Извините, если это не ответ, но стоит попробовать. Кажется, он согласен с документом MSDN , в котором указано, что длина по умолчанию для NVARCHAR / VARCHAR равна 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...