Я продолжаю возвращать указанный int result = myDataReader.GetInt32(0);
недействителен на int result = myDataReader.GetInt32(0);
при выполнении запроса с использованием параметра. Дело в том, что если я заменю @Reg текстом WM07 OGR, он отлично работает. Однако строка reg возвращает это так, почему ошибка?
string reg = RadComboBox1.SelectedValue;
//prepare sql statements
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = '@Reg')", conn);
Command.Parameters.AddWithValue("@Reg", OleDbType.WChar);
Command.Parameters["@Reg"].Value = reg;
myDataReader = Command.ExecuteReader();
if (myDataReader.Read())
{
int result = myDataReader.GetInt32(0);
Prev_Mileage.Text = result.ToString();
}
//cleanup objects
myDataReader.Close();
conn.Close();
Дело в том, что если я заменю @Reg текстом WM07 OGR, он отлично работает. Однако строка reg возвращает это так, почему ошибка?
Кажется, что вы получаете ошибку, если запрос возвращает null, потому что нет соответствующего TX_VEHNUMBER
, после чего TX_VEHNUMBER
в int
.
Поэтому вам нужно проверить, не имеет ли значение null:
int result = 0; // insert default
if(!myDataReader.IsDbNull(0))
result = myDataReader.GetInt32(0)
Кроме того, это не работает, потому что ваш параметр интерпретируется как значение, вы заключили его в апострофы здесь:
WHERE (Vehicle.TX_VEHNUMBER = '@Reg')
Вам просто нужно сделать это:
WHERE (Vehicle.TX_VEHNUMBER = @Reg)
Поскольку он попадает в нижний блок...
if (myDataReader.Read())
{
int result = myDataReader.GetInt32(0);
Prev_Mileage.Text = result.ToString();
}
Я полагаю, у вас есть запись. Я бы проверил DataType NO_ODOMETER_LAST
, так как это может быть varchar
или что-то другое, кроме int
. Если это случай, возможно, вам придется использовать TryParse
.
Попробуйте что-нибудь подобное.
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = @Reg)", conn);
Или
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = '?')", conn);
Или
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = ?)", conn);
Для получения дополнительной информации см. Следующие ссылки.
http://www.java2s.com/Code/CSharp/Database-ADO.net/PassparametertoOleDbCommand.htm