Указанный состав недействителен. SQL-параметр

Я продолжаю возвращать указанное приведение недействительно в строке 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();

person user552769    schedule 21.05.2014    source источник
comment
Прокомментируйте, что не уверен на 100%, но требуется ли '' вокруг параметра @Reg в командной строке?   -  person    schedule 21.05.2014
comment
Какой тип имеет NO_ODOMETER_LAST в базе данных?   -  person Tim Schmelter    schedule 21.05.2014


Ответы (3)


Дело в том, что если я заменю @Reg текстом «WM07 OGR», все будет работать нормально. Однако строка reg возвращает это, так почему ошибка?

Кажется, вы получаете сообщение об ошибке, если запрос возвращает null, потому что нет соответствия TX_VEHNUMBER, тогда приведение к int завершается неудачно.

Итак, вы должны проверить, является ли он нулевым:

int result = 0; // insert default
if(!myDataReader.IsDbNull(0))
    result = myDataReader.GetInt32(0)

Кроме того, это не работает, потому что ваш параметр интерпретируется как значение, вы завернули его в апострофы здесь:

WHERE (Vehicle.TX_VEHNUMBER = '@Reg')

Вам просто нужно сделать это:

WHERE (Vehicle.TX_VEHNUMBER = @Reg)
person Tim Schmelter    schedule 21.05.2014
comment
!Спасибо.. Аааа, чертовы апострофы меня достали.. Всем спасибо - person user552769; 21.05.2014

Попробуйте что-нибудь вроде этого.

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);

Or

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);

Or

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

http://blogs.msdn.com/b/wriju/archive/2008/01/24/ado-net-oledbcommand-parameterized-query-sequence-rule.aspx

person Jalpesh Vadgama    schedule 21.05.2014

Поскольку он попадает в нижний блок...

if (myDataReader.Read())
        {
            int result = myDataReader.GetInt32(0);
            Prev_Mileage.Text = result.ToString();
        }

... Я полагаю, у вас есть запись. Я бы проверил DataType NO_ODOMETER_LAST, так как это может быть varchar или что-то другое, кроме int. Если это так, вам может понадобиться использовать TryParse.

person christiandev    schedule 21.05.2014