У меня есть 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)
};
}





Основываясь на небольшом поиске (т.е. я не пробовал), вы также должны объявить параметры хранимой процедуры с длиной, т.е.
ALTER PROCEDURE [dbo].[GetNextSms]
(
@SmsId UNIQUEIDENTIFIER OUTPUT,
@SmsContent NVARCHAR(1024) OUTPUT,
@ToNumber VARCHAR(50) OUTPUT,
@TimeAccepted DATETIME OUTPUT
)
Приносим извинения, если это не ответ, но попробовать стоит. Кажется, он согласен с документ MSDN, который утверждает, что длина по умолчанию для NVARCHAR / VARCHAR равна 1.