Отправьте и прочитайте параметр InputOutput для хранимой процедуры - PullRequest
0 голосов
/ 20 апреля 2020

Я сохранил процедуру в моей SQL серверной базе данных, которая принимает несколько параметров, один из которых является входным и выходным параметром.

Это код, который я использую:

using (SqlConnection sqlConnection = new SqlConnection(globals))
using (var sqlCommand = new SqlCommand("addNewOrder", sqlConnection))
{
    sqlCommand.CommandType = CommandType.StoredProcedure;

    sqlCommand.Parameters.Add("@SomeDataA", SqlDbType.Int).Value = _someDataA;
    sqlCommand.Parameters.Add("@SomeDataB", SqlDbType.Int).Value = _someDataB;
    sqlCommand.Parameters.Add("@SomeDataC", SqlDbType.Float).Value = _someDataC;
    sqlCommand.Parameters.Add("@InputAndOutput", SqlDbType.VarChar).Value=_inputAndOutput; 
    sqlCommand.Parameters["@InputAndOutput"].Direction = ParameterDirection.InputOutput;

    using (var sqlAdapter = new SqlDataAdapter(sqlCommand))
        try
        {
            sqlConnection.Open();
            sqlCommand.ExecuteNonQuery();

            if (!DBNull.Value.Equals(sqlCommand.Parameters["@InputAndOutput"].Value))
            {
                _inputAndOutput = sqlCommand.Parameters["@InputAndOutput"].Value.ToString();
            }
            else
            {
                _inputAndOutput = "N/A";
            }
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
        catch (Exception exx)
        {
            MessageBox.Show(exx.Message);
        }
    }

    return _inputAndOutput;
}

На SQL сервере в хранимой процедуре параметр @InputAndOutput объявляется как @InputAndOutput varchar(36) = NULL OUTPUT.

Когда хранимая процедура получает данные, она вставляется в базу данных и возвращает Uniqueidentifier в этом @InputAndOutput параметр.

Это все работает, если я ничего не отправляю с @InputAndOutput.

Например, это будет прекрасно работать:

sqlCommand.Parameters.Add("@InputAndOutput", SqlDbType.UniqueIdentifier).Direction = ParameterDirection.Output;

Проблема в том, что я отправляю 1 символ хранимой процедуры, он вернет только 1 символ из 36 символов. Если я отправлю 2, он вернет 2 и так далее ...

Пример:

_inputAndOutput= "2" -> SP
(SP insert into DB, and returns "D00896A4-69D5-4FAC-B249-9409A643966A") -> _inputAndOutput
_inputAndOutput = "D"

В случае, если я отправлю 22, он получит "D0"

1 Ответ

3 голосов
/ 20 апреля 2020

Определите размер параметра при его объявлении

sqlCommand.Parameters.Add("@InputAndOutput", SqlDbType.VarChar,36).Value=_inputAndOutput; 

Без него движок создаст параметр достаточно большой, чтобы вместить ваше входное значение, и этот размер не изменяется движком Sql для размещения вашего более длительного возвращаемого значения.

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