У меня есть простой 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.
Что не так?
BigInt
не соответствует BigInteger
. Это соответствует long
/Int64
. Вероятно, вы должны удалить все используемые BigInteger
коды из своего бизнес-кода и использовать их long
. ADO.NET не понимает BigInteger
.
Ваш 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;
}
executionId
? Что это за тип?