Столкнулся с такой вот проблемой, по поиску ответа не нашел, так что может кто знает помогите.
Вот так я делаю запрос к базе через компонент 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, то все нормально. Чего ему не хватает?
Попробуйте такой код:
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);
Здравствуйте, 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_>_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 байтам).