Вызов хранимой процедуры из c # возвращает «?????»в ответе varchar - PullRequest
0 голосов
/ 12 февраля 2019

Когда я вызываю хранимую процедуру на SQL-сервере из C #, используя ADO.NET, я получаю следующий ответ в свой выходной параметр:
enter image description here

Буквально ?????? как VarChar.

Моя хранимая процедура выглядит следующим образом:

ALTER Procedure [sp_getEncryptedPassword]
 (@PublicKey nvarchar(128), @UserId uniqueidentifier,  @PasswordClearText varchar(255) OUTPUT, @resOUT int OUTPUT, @rowsOUT int OUTPUT)

AS
    SET NOCOUNT On

    DECLARE @LinkIsValid bit = 0;
    set @rowsOUT=0

    while (@LinkIsValid=0)
    begin

        SELECT  CONVERT(nvarchar, DecryptByPassphrase(@PublicKey, UserpasswordEncrypted, 1, CONVERT(varbinary, @UserId)))  AS PassWordClearText
        Into #TEMP1
        from UserLogin  
        WHERE Userid = @UserId

        set @rowsOUT=@@ROWCOUNT

        SET @LinkIsValid=1

    end

    if @rowsOUT=0
        SET @resOUT=1 

    select 'RStestPwd' as 'PasswordClearText', @resOUT as 'resOUT', @rowsOUT as 'rowsOUT'

Я удалил несколько строк, но я надеюсь, что вы поняли.
Какчасть отладки, я жестко запрограммировал ответ - просто чтобы посмотреть, получу ли я что-нибудь.И я делаю:
enter image description here

Мой код C #:

SqlConnection con = new SqlConnection(connectionstring);

SqlCommand cmd = new SqlCommand(spName, con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter pubKey = cmd.Parameters.Add("@PublicKey", SqlDbType.UniqueIdentifier);
pubKey.Direction = ParameterDirection.Input;
pubKey.Value = publicKey;

SqlParameter IdIn = cmd.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier);
IdIn.Direction = ParameterDirection.Input;
IdIn.Value = userid;

SqlParameter pwdOUT = cmd.Parameters.Add("@PasswordClearText", SqlDbType.VarChar, 255);
pwdOUT.Direction = ParameterDirection.Output;

SqlParameter resOUT = cmd.Parameters.Add("@resOUT", SqlDbType.Int);
resOUT.Direction = ParameterDirection.Output;

SqlParameter rowsOUT = cmd.Parameters.Add("@rowsOUT", SqlDbType.Int);
rowsOUT.Direction = ParameterDirection.Output;

con.Open();
cmd.ExecuteNonQuery();
con.Close();

result.Password = pwdOUT.Value.ToString();

Является ли это частью форматирования между SQL-сервером и моим приложением?Это настройка на моем SQL-сервере, в моем экземпляре команды ADO.NET или в строке подключения?

РЕДАКТИРОВАТЬ: Спасибо за ваши комментарии.Я просмотрел свой код и изменил места с помощью (N) VarChar и т. Д.
Ни до, ни после этих модификаций я не получаю никаких исключений - только вопросительные знаки.Таким образом, SP работает, но теряет / изменяет данные между базой данных и приложением ...

...