TADOQuery и параметры запроса
От: _Oswald_ Украина  
Дата: 07.06.04 13:11
Оценка:
Столкнулся с такой вот проблемой, по поиску ответа не нашел, так что может кто знает помогите.
Вот так я делаю запрос к базе через компонент ADOQuery:

    Variant vParam;
    vParam = Variant(num_id);
    
    RQuery->Close();
    RQuery->Parameters->Clear();
    RQuery->SQL->Clear();

    RQuery->SQL->Add("SELECT TypeId FROM Meterings WHERE NumberId = :NumId");
    RQuery->Parameters->CreateParameter("NumId", ftInteger, Adodb::pdInput, sizeof(vParam), vParam);
    RQuery->Prepared = TRUE;
    RQuery->ExecSQL();

При попытке запуска вылетает с исключением "Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения".
БД — Oracle 9, MSDAC — 2.8.
Если задаю запрос и параметры в Disign-time, то все нормально. Чего ему не хватает?
O(.,.)O
Re: TADOQuery и параметры запроса
От: Romull  
Дата: 07.06.04 13:33
Оценка: 2 (1)
Попробуйте такой код:

Variant vParam;
vParam = Variant(num_id);
RQuery->SQL->Text = "SELECT TypeId FROM Meterings WHERE NumberId = :NumId";
RQuery->Parameters->ParseSQL(RQuery->SQL->Text, true);
query->Parameters->ParamValues["NumId"]=vParam;
RQuery->Open();


Если его надо запускать несколько раз, то лучше "приготовить" запрос и метод ParseSQL вызывать только один раз.
На мой взгляд sizeof(vParam) здесь вообще не в кассу:
RQuery->Parameters-> CreateParameter("NumId", ftInteger, Adodb::pdInput, sizeof(vParam), vParam);
Re[2]: TADOQuery и параметры запроса
От: _Oswald_ Украина  
Дата: 07.06.04 13:52
Оценка:
Здравствуйте, Romull, Вы писали:

R>Попробуйте такой код:

R>
R>Variant vParam;
R>vParam = Variant(num_id);
R>RQuery->SQL->Text = "SELECT TypeId FROM Meterings WHERE NumberId = :NumId";
R>RQuery->Parameters->ParseSQL(RQuery->SQL->Text, true);
R>query->Parameters->ParamValues["NumId"]=vParam;
R>RQuery->Open();
R>

Вы знаете, доктор, помогает .
Но теперь мне интересно чисто теоретически, почему не получается через CreateParameter?
В Билдере с АДО не работал практически, поэтому делал как когда-то с БДЕ-шной TQuery, так там с этим все нормально было.
А тут такое

R>На мой взгляд sizeof(vParam) здесь вообще не в кассу:

R>RQuery->Parameters-> CreateParameter("NumId", ftInteger, Adodb::pdInput, sizeof(vParam), vParam);
Ну не знаю, делал как в хелпе:

TParameter* __fastcall CreateParameter(const WideString Name, Db::TFieldType DataType, TParameterDirection Direction, int Size, const OleVariant &Value);

Size is an integer value indicating the maximum size of the parameter’s value.

Хотя проблема не в этом, потому как пробовал и так, например:
RQuery->Parameters-> CreateParameter("NumId", ftInteger, pdInput, 1, 0);
O(.,.)O
Re[3]: TADOQuery и параметры запроса
От: Romull  
Дата: 07.06.04 14:14
Оценка:
_O_>Ну не знаю, делал как в хелпе:
_O_>

_O_>TParameter* __fastcall CreateParameter(const WideString Name, Db::TFieldType DataType, TParameterDirection Direction, int Size, const OleVariant &Value);

_O_>Size is an integer value indicating the maximum size of the parameter’s value.

_O_>Хотя проблема не в этом, потому как пробовал и так, например:
_O_>RQuery->Parameters-> CreateParameter("NumId", ftInteger, pdInput, 1, 0);

Просто предложение "Size is an integer value indicating the maximum size of the parameter’s value." переводится как: Size — это целочисленое значение указывающее максимальный размер значения параметра. Размер значения, а не размер класса Variant. Т.е. в вашем случае, возможно надо было бы писАть 4, хотя это будет зависить от конкретной БД (врать не буду, наверняка сказать не могу, но скорее всего у разных БД размер Integer может быть и не равным 4 байтам).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.