Не удается передать guid как уникальный идентификатор в storedprocedure

#c# #sql-server #uniqueidentifier

#c# #sql-сервер #уникальный идентификатор

Вопрос:

У меня есть хранимая процедура, которая принимает uniqueidentifier в качестве параметра.

Предполагается, что это работает так (я этого не писал):

 SqlCommand command = new SqlCommand("[CheckActivation]", Conn)
{
    CommandType = CommandType.StoredProcedure
};
command.Parameters.AddWithValue("@key", key);
return (bool)command.ExecuteScalar();
  

где ключ — это строка, но это не так. Я всегда получаю исключение «Указанное приведение недопустимо».

Поэтому я переписал его на:

 Guid guid = new Guid(key);
using (var command = Conn.CreateCommand())
{
    command.CommandText = "[CheckActivation]";
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@key", SqlDbType.UniqueIdentifier);
    command.Parameters["@key"].Value = guid;

    return (bool)command.ExecuteScalar();
}
  

guid — это объект Guid с соответствующим значением, но я все равно получаю то же исключение.

Что здесь происходит не так?

Решение: Проблема заключалась в приведении в инструкции return. sp возвращает значение int, которое не может быть приведено к bool:

команда return ((int).ExecuteScalar() == 1);

Комментарии:

1. почему у вас в коде есть @key и @activationkey? и можете ли вы показать sp?

2. Вы проверили, правильно ли создан экземпляр guid из вашей ключевой строки? Ключ не пуст?

3. вместо того, чтобы принимать SqlDbType. UniqueIdentifier принимает это как строку и проверяет, я думаю, это должно сработать

4. Пожалуйста, добавьте код вашей хранимой процедуры, он предоставит больше информации

Ответ №1:

ExecuteScalar() не возвращает тип bool:

Тип: System.Объект

Первый столбец первой строки в результирующем наборе или нулевую ссылку (ничего в Visual Basic), если результирующий набор пуст. Возвращает максимум 2033 символа.

Кроме того, вы создаете параметр с именем «@key», а затем используете другое имя в этой строке:

  command.Parameters["@activationkey"].Value = guid;
  

Ответ №2:

Я думаю, вы имеете в виду @key вместо @activationkey . Затем вы можете добавить параметр, подобный этому:

 command.Parameters.Add(new SqlParameter 
  {
     ParameterName = "@key",
     SqlDbType = SqlDbType.UniqueIdentifier,
     Value = new Guid(key)
  });
  

Ответ №3:

‘Указанное приведение недопустимо’ означает, что вы приводите неправильно, и это единственное место, где вы это делаете:

 return (bool)command.ExecuteScalar();
  

Проверьте это значение. Либо это DBNull, либо другой тип данных. Попробуйте отладить его, чтобы узнать тип данных.

Ответ №4:

Вы указываете параметр "@key" в качестве типа уникального идентификатора,

затем вы устанавливаете guid параметр "@activationkey" to, который не был объявлен.

Я думаю, что вам следует вместо того, чтобы устанавливать значение в "@activationkey" , оно должно быть key

command.Parameters["@key"].Value = guid;