Ado.Net и BigInteger приводят к недопустимому исключению приведения к Int64

1

У меня есть простой SQL-запрос для выполнения в Ado.Net. Он имеет один параметр - BigInteger.

public int MyMethod(BigInteger executionId)
{
    int status = -1;
    using (var connection = new SqlConnection(this.ConnectionString))
    {
        connection.Open();
        var command = new SqlCommand("select ... where execution_id=@execution_id", connection) { CommandType = CommandType.Text };
        var parameterExecutionId = new SqlParameter("@execution_id", executionId) { SqlDbType = SqlDbType.BigInt };
        command.Parameters.Add(parameterExecutionId);
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                status = Convert.ToInt32(reader["status"]);
            }
        }
        connection.Close();
    }
    return status;    
}

Когда я запускаю этот код, у меня на ExecuteReader это исключение:

An exception of type 'System.InvalidCastException' 
occurred in System.Data.dll but was not handled in user code

Additional information: Failed to convert parameter 
value from a BigInteger to a Int64.

База данных действительно есть execution_id набор столбцов для BigInt.

Что не так?

  • 1
    Какое значение вы отправляете с этим параметром? Какой тип выполнения?
  • 0
    Где декларируется executionId ? Что это за тип?
Показать ещё 1 комментарий
Теги:
ado.net
biginteger
.net-4.0

2 ответа

3
Лучший ответ

BigInt не соответствует BigInteger. Это соответствует long/Int64. Вероятно, вы должны удалить все используемые BigInteger коды из своего бизнес-кода и использовать их long. ADO.NET не понимает BigInteger.

  • 0
    Спасибо @usr, это настолько не интуитивно понятно, что BigInt и BigInteger не соответствуют. Это работает с тех пор, как вы упомянули. Спасибо
  • 0
    Да. Название BigInt относится к тем временам, когда SQL Server не был предназначен для .NET (потому что он не существовал). BigInteger был добавлен в .NET 4 и представляет собой целое число в математическом стиле. Теперь вы хотя бы знаете исторический контекст.
Показать ещё 1 комментарий
1

Ваш BigInteger является сложным типом в System.Numerics, это не относится к SQL BigInt. Как правило, обычно при сопоставлении типов С# с типами SQL DB используется базовый тип, такой как long, int, int64, string... в этом случае ваше вторичное сообщение об ошибке предлагает Int64. Если вы решите сохранить BigInteger в качестве параметра, который вы проходите, вы должны перевести его в длинный внутри своего метода. Вы также можете указать тип SQL в экземпляре SqlParameter.

public int MyMethod(BigInteger executionId)
{
    int status = -1;
    using (var connection = new SqlConnection(this.ConnectionString))
    {
        connection.Open();
        var command = new SqlCommand("select ... where execution_id=@execution_id", connection)     { CommandType = CommandType.Text };

        //BigInteger to Int64 conversion long and Int64 is the same type
        long execId = (long) executionId;

        var parameterExecutionId = new SqlParameter("@execution_id", SqlDbType.BigInt, execId);
        command.Parameters.Add(parameterExecutionId);
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                status = Convert.ToInt32(reader["status"]);
            }
        }
        connection.Close();
    }
    return status;    
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню