Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ado и Odac СРОЧНО!!!!!!!!!

286
25 апреля 2006 года
misha_turist
572 / / 28.11.2005
Доброго времени суток.
В своей программе я использовал сначала ADO потом odac, в обоих была одна и та-же ошибка....:x

В компоненте запрос обоих пакетов я строил ОБЫЧНЫЙ запрос на втавку с параметрами, заносил значения параметров, для этого искал параметр методом
 
Код:
Params.ParamByName(StringGridInOut.Cells[1,n]) для odac
и
Parameters.ParamByName(StringGridInOut.Cells[1,n]) для ADO

и при этом у меня на НЕКОТОРЫЕ параметры появляется ошибка, что они не найдены.
Но они там есть, т.к при разработке если я текст запроса заношу они появляются. Ошибки в их названии скорей всего то же нет т.к. название полей и параметров для запроса я беру из одного и того-же места
 
Код:
s:=s+':'+StringGridInOut.Cols[1][n];


Может кто встречал этот глук и как сним бороться???????????????

Напишите пожалуста поскорее МНЕ СРОЧНО НАДО!!!!!!!!!!!!!


Но всё таки если ни кто ни чего подсказать не может, то посоветуйте, чем эти пакеты заменить можно... мне всего один запрос нужен и всё....
929
25 апреля 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by misha_turist
Доброго времени суток.
В своей программе я использовал сначала ADO потом odac, в обоих была одна и та-же ошибка....:x

В компоненте запрос обоих пакетов я строил ОБЫЧНЫЙ запрос на втавку с параметрами, заносил значения параметров, для этого искал параметр методом
 
Код:
Params.ParamByName(StringGridInOut.Cells[1,n]) для odac
и
Parameters.ParamByName(StringGridInOut.Cells[1,n]) для ADO

и при этом у меня на НЕКОТОРЫЕ параметры появляется ошибка, что они не найдены.
Но они там есть, т.к при разработке если я текст запроса заношу они появляются. Ошибки в их названии скорей всего то же нет т.к. название полей и параметров для запроса я беру из одного и того-же места
 
Код:
s:=s+':'+StringGridInOut.Cols[1][n];


Может кто встречал этот глук и как сним бороться???????????????

Напишите пожалуста поскорее МНЕ СРОЧНО НАДО!!!!!!!!!!!!!


Но всё таки если ни кто ни чего подсказать не может, то посоветуйте, чем эти пакеты заменить можно... мне всего один запрос нужен и всё....


Мне кажется, дело вот в чем:
когда ты пишешь в дизайн-тайм, то оболочка автоматом добавляет описанные тобою параметры, а когда ты в ран-тайме заполняешь строку запроса, то у проги не хватает интеллекта это сделать.
Попробуй вместе с формированием строки запроса также добавлять параметры при помощи метода AddParameter

286
25 апреля 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by sp999
Мне кажется, дело вот в чем:
когда ты пишешь в дизайн-тайм, то оболочка автоматом добавляет описанные тобою параметры, а когда ты в ран-тайме заполняешь строку запроса, то у проги не хватает интеллекта это сделать.
Попробуй вместе с формированием строки запроса также добавлять параметры при помощи метода AddParameter



Но веть такая ошибка не на все парамеры возникает, причём у меня ошибка вылетела "после какого то параметра или номера параметра(точно не знаю)" т.е на том параметре, который после определённого стоит.

929
25 апреля 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by misha_turist
Но веть такая ошибка не на все парамеры возникает, причём у меня ошибка вылетела "после какого то параметра или номера параметра(точно не знаю)" т.е на том параметре, который после определённого стоит.


Может код покажешь? А то рассуждаем о возвышенном...

286
25 апреля 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by sp999
Может код покажешь? А то рассуждаем о возвышенном...


Код:
procedure TFormQueryInsert.BitBtnAddQueryClick(Sender: TObject);
var n, countRecord: integer;
begin
 countRecord:=0;

 DataModuleMain.OraQueryInsert.SQL.Clear;
 DataModuleMain.OraQueryInsert.SQL.AddStrings(MemoQuery.Lines);
 DataModuleMain.IBQueryTemp.First;

 if AfteTransaction
 then begin
       StatusBarMain.Panels[0].Text:='Запуск новой транзакции';
       StatusBarMain.Repaint;
       DataModuleMain.OraSession.StartTransaction;
      end;

 try
  DataModuleMain.OraQueryInsert.Prepared:=true;
  while DataModuleMain.IBQueryTemp.Eof=false do
  begin
   for n:=1 to StringGridInOut.RowCount-2 do
   OpenParam(
   DataModuleMain.OraQueryInsert.Params.ParamByName(StringGridInOut.Cells[1,n]),  //Ошибка сдесь.............
             DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]));

   DataModuleMain.IBQueryTemp.Next;

   if DataModuleMain.OraQueryInsert.Prepared
   then DataModuleMain.OraQueryInsert.ExecSQL;

   inc(countRecord);

   StatusBarMain.Panels[0].Text:='Перенос '+inttostr(countRecord)+' записи под номером '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+' из '+inttostr(DataModuleMain.IBQueryTemp.RecordCount)+' возможных';
   StatusBarMain.Repaint;
  end;
 except
  StatusBarMain.Panels[0].Text:='Ошибка при занесении изменений в таблицу на записи с номером '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+'. Все изменения отменены.';
  StatusBarMain.Repaint;

  ShowMessage('Ошибка при занесении изменений в таблицу на '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+' записи. Все изменения отменены.');

  if AfteTransaction
  then DataModuleMain.OraSession.Rollback;
  raise;
 end;

 if AfteTransaction
 then DataModuleMain.OraSession.Commit;
end;


Код:
Function TFormQueryInsert.CreateQuery : string;
var n: integer;
    s: string;
begin
 s:='insert into';
 s:=s+' '+TableName;
 s:=s+' (';
 for n:=1 to StringGridInOut.RowCount-2 do
 begin
  s:=s+StringGridInOut.Cols[1][n];
  if n<>StringGridInOut.RowCount-2 then s:=s+',';
 end;
 s:=s+')';
 s:=s+' values';
 s:=s+' (';
 for n:=1 to StringGridInOut.RowCount-2 do
 begin
  s:=s+':'+StringGridInOut.Cols[1][n];
  if n<>StringGridInOut.RowCount-2 then s:=s+',';
 end;
 s:=s+')';

 CreateQuery:=s;
end;

 
Код:
function OpenParam(paramin: TOraParam; paramout: TField) : boolean;
begin
 OpenParam:=true;
 try
  paramin.AssignFieldValue(paramout,paramout.Value);
 except
  OpenParam:=false;
 end;
end;


Переред BitBtnAddQueryClick выполняется OraQueryInsert.text:=CreateQuery;

Но я тебе тоно скажу, что ошибка эта не на все поля возникает. а только на некоторые.....
929
25 апреля 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by misha_turist
Код:
procedure TFormQueryInsert.BitBtnAddQueryClick(Sender: TObject);
var n, countRecord: integer;
begin
 countRecord:=0;

 DataModuleMain.OraQueryInsert.SQL.Clear;
 DataModuleMain.OraQueryInsert.SQL.AddStrings(MemoQuery.Lines);
 DataModuleMain.IBQueryTemp.First;

 if AfteTransaction
 then begin
       StatusBarMain.Panels[0].Text:='Запуск новой транзакции';
       StatusBarMain.Repaint;
       DataModuleMain.OraSession.StartTransaction;
      end;

 try
  DataModuleMain.OraQueryInsert.Prepared:=true;
  while DataModuleMain.IBQueryTemp.Eof=false do
  begin
   for n:=1 to StringGridInOut.RowCount-2 do
   OpenParam(
   DataModuleMain.OraQueryInsert.Params.ParamByName(StringGridInOut.Cells[1,n]),  //Ошибка сдесь.............
             DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]));

   DataModuleMain.IBQueryTemp.Next;

   if DataModuleMain.OraQueryInsert.Prepared
   then DataModuleMain.OraQueryInsert.ExecSQL;

   inc(countRecord);

   StatusBarMain.Panels[0].Text:='Перенос '+inttostr(countRecord)+' записи под номером '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+' из '+inttostr(DataModuleMain.IBQueryTemp.RecordCount)+' возможных';
   StatusBarMain.Repaint;
  end;
 except
  StatusBarMain.Panels[0].Text:='Ошибка при занесении изменений в таблицу на записи с номером '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+'. Все изменения отменены.';
  StatusBarMain.Repaint;

  ShowMessage('Ошибка при занесении изменений в таблицу на '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+' записи. Все изменения отменены.');

  if AfteTransaction
  then DataModuleMain.OraSession.Rollback;
  raise;
 end;

 if AfteTransaction
 then DataModuleMain.OraSession.Commit;
end;


Код:
Function TFormQueryInsert.CreateQuery : string;
var n: integer;
    s: string;
begin
 s:='insert into';
 s:=s+' '+TableName;
 s:=s+' (';
 for n:=1 to StringGridInOut.RowCount-2 do
 begin
  s:=s+StringGridInOut.Cols[1][n];
  if n<>StringGridInOut.RowCount-2 then s:=s+',';
 end;
 s:=s+')';
 s:=s+' values';
 s:=s+' (';
 for n:=1 to StringGridInOut.RowCount-2 do
 begin
  s:=s+':'+StringGridInOut.Cols[1][n];
  if n<>StringGridInOut.RowCount-2 then s:=s+',';
 end;
 s:=s+')';

 CreateQuery:=s;
end;

 
Код:
function OpenParam(paramin: TOraParam; paramout: TField) : boolean;
begin
 OpenParam:=true;
 try
  paramin.AssignFieldValue(paramout,paramout.Value);
 except
  OpenParam:=false;
 end;
end;


Переред BitBtnAddQueryClick выполняется OraQueryInsert.text:=CreateQuery;

Но я тебе тоно скажу, что ошибка эта не на все поля возникает. а только на некоторые.....


Попробуй перед кодом, выдающим ошибку, вывести все параметры и содержимое стринг-грида.

286
25 апреля 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by sp999
Попробуй перед кодом, выдающим ошибку, вывести все параметры и содержимое стринг-грида.



То есть ты предпологаеш, что там параметр не создаётся, или кривой получается..... может быть...., но с какой стати и почему тогда у обоих пакетв, ошибки веть обсолюдно одинаковые и на один параметр.... а в StringGrid всё верно, программа у меня кучу раз выполнялась нормально... только вот сейчас эта пакость вылезла....

А на счёт прогу посмотреть, так у меня сейчас не получится....

303
26 апреля 2006 года
makbeth
1.0K / / 25.11.2004
Цитата:
Originally posted by misha_turist
То есть ты предпологаеш, что там параметр не создаётся, или кривой получается..... может быть...., но с какой стати и почему тогда у обоих пакетв, ошибки веть обсолюдно одинаковые и на один параметр.... а в StringGrid всё верно, программа у меня кучу раз выполнялась нормально... только вот сейчас эта пакость вылезла....

А на счёт прогу посмотреть, так у меня сейчас не получится....


Скорее всего ошибка в следующем: тип праметра - ftUnknown (при создании праметров в runtime так и есть), а его значение передается как Null. VCL не позволяет такого, причем эта фича зашита в базовых классах VCL, от которых унаследованы классы и ADO, и ODAC. Я сам пропарился с этой фигней довольно долго и ошибка вылезла тоже через некоторое время :(
Решение, в общем, уже предлагалось - явное создание параметра и обязательное указание его типа.

286
26 апреля 2006 года
misha_turist
572 / / 28.11.2005
Спасибо всем за помощь!!)))))))))))))
Но я уже сам разобрался, там такая хер... оказалась................... а я ради неё вчера до позна на работе сидел...
Но у меня другая проблема ...
Сейчас на ODAC делаю, и не получается передавать сразу много значений в параметре т.е. что бы в одних параметрах сразу передавались данные не для одной строки , а для многих
вод код, но она говорит, что у неё ошибка в длине массива.
Код:
procedure TFormQueryInsert.BitBtnAddQueryClick(Sender: TObject);
type TArrey=array of variant;
var
  n,i: integer;
  ArrField: TArrey;
  RecCount: integer;
begin
 FormProcStatus.Show;
 FormProcStatus.Animate1.Active:=true;
 try
 i:=0;
 DataModuleMain.IBQueryTemp2.SQL.Text:='select count(*) from '+TableName;
 DataModuleMain.IBQueryTemp2.Open;
 RecCount := DataModuleMain.IBQueryTemp.Fields[0].Value;

 DataModuleMain.IBQueryTemp.First;
 SetLength(ArrField, StringGridInOut.RowCount-1);

 DataModuleMain.OraSQLInsert.SQL.Clear;
 DataModuleMain.OraSQLInsert.SQL.AddStrings(MemoQuery.Lines);

 for n:=0 to StringGridInOut.RowCount-2 do
 ArrField[n] := VarArrayCreate([0, RecCount-1], varVariant); // explict creating array

 if AfteTransaction
 then begin
       StatusBarMain.Panels[0].Text:='Запуск новой транзакции';
       StatusBarMain.Repaint;
       DataModuleMain.OraSession.StartTransaction;
      end;

 try
  DataModuleMain.OraSQLInsert.Prepared:=true;

  while {DataModuleMain.IBQueryTemp.Eof=false}i<RecCount do
  begin
   for n := 1 to StringGridInOut.RowCount-2 do begin
     ArrField[DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]).Index] := DataModuleMain.IBQueryTemp.Fields.fieldByName(StringGridInOut.Cells[0,n]).Value;
   end;
   DataModuleMain.IBQueryTemp.Next;
   inc(i);
  end;

  for n := 1 to StringGridInOut.RowCount-2 do begin
   DataModuleMain.OraSQLInsert.ParamByName(StringGridInOut.Cells[1,n]).Length:=RecCount;
   DataModuleMain.OraSQLInsert.ParamByName(StringGridInOut.Cells[1,n]).DataType:=DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]).DataType;
   DataModuleMain.OraSQLInsert.ParamByName(StringGridInOut.Cells[1,n]).Value:= ArrField[DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]).Index];
  end;


   if DataModuleMain.OraSQLInsert.Prepared
   then DataModuleMain.OraSQLInsert.Execute(RecCount); //Вот тутвот заявляет!!!!!!!!!!!!

 except
  StatusBarMain.Panels[0].Text:='Ошибка при занесении изменений в таблицу на записи с номером '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+'. Все изменения отменены.';
  StatusBarMain.Repaint;

  ShowMessage('Ошибка при занесении изменений в таблицу на '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+' записи. Все изменения отменены.');

  if AfteTransaction
  then DataModuleMain.OraSession.Rollback;
  raise;
 end;

 if AfteTransaction
 then DataModuleMain.OraSession.Commit;
 finally
  FormProcStatus.Animate1.Active:=false;
  FormProcStatus.Close;
 end;
end;


TableName - имя таблицы в которую вставляем.

Подскажите если не сложно...
929
27 апреля 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by misha_turist
Спасибо всем за помощь!!)))))))))))))
Но я уже сам разобрался, там такая хер... оказалась................... а я ради неё вчера до позна на работе сидел...
Но у меня другая проблема ...
Сейчас на ODAC делаю, и не получается передавать сразу много значений в параметре т.е. что бы в одних параметрах сразу передавались данные не для одной строки , а для многих
вод код, но она говорит, что у неё ошибка в длине массива.
Код:
procedure TFormQueryInsert.BitBtnAddQueryClick(Sender: TObject);
type TArrey=array of variant;
var
  n,i: integer;
  ArrField: TArrey;
  RecCount: integer;
begin
 FormProcStatus.Show;
 FormProcStatus.Animate1.Active:=true;
 try
 i:=0;
 DataModuleMain.IBQueryTemp2.SQL.Text:='select count(*) from '+TableName;
 DataModuleMain.IBQueryTemp2.Open;
 RecCount := DataModuleMain.IBQueryTemp.Fields[0].Value;

 DataModuleMain.IBQueryTemp.First;
 SetLength(ArrField, StringGridInOut.RowCount-1);

 DataModuleMain.OraSQLInsert.SQL.Clear;
 DataModuleMain.OraSQLInsert.SQL.AddStrings(MemoQuery.Lines);

 for n:=0 to StringGridInOut.RowCount-2 do
 ArrField[n] := VarArrayCreate([0, RecCount-1], varVariant); // explict creating array

 if AfteTransaction
 then begin
       StatusBarMain.Panels[0].Text:='Запуск новой транзакции';
       StatusBarMain.Repaint;
       DataModuleMain.OraSession.StartTransaction;
      end;

 try
  DataModuleMain.OraSQLInsert.Prepared:=true;

  while {DataModuleMain.IBQueryTemp.Eof=false}i<RecCount do
  begin
   for n := 1 to StringGridInOut.RowCount-2 do begin
     ArrField[DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]).Index] := DataModuleMain.IBQueryTemp.Fields.fieldByName(StringGridInOut.Cells[0,n]).Value;
   end;
   DataModuleMain.IBQueryTemp.Next;
   inc(i);
  end;

  for n := 1 to StringGridInOut.RowCount-2 do begin
   DataModuleMain.OraSQLInsert.ParamByName(StringGridInOut.Cells[1,n]).Length:=RecCount;
   DataModuleMain.OraSQLInsert.ParamByName(StringGridInOut.Cells[1,n]).DataType:=DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]).DataType;
   DataModuleMain.OraSQLInsert.ParamByName(StringGridInOut.Cells[1,n]).Value:= ArrField[DataModuleMain.IBQueryTemp.FieldByName(StringGridInOut.Cells[0,n]).Index];
  end;


   if DataModuleMain.OraSQLInsert.Prepared
   then DataModuleMain.OraSQLInsert.Execute(RecCount); //Вот тутвот заявляет!!!!!!!!!!!!

 except
  StatusBarMain.Panels[0].Text:='Ошибка при занесении изменений в таблицу на записи с номером '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+'. Все изменения отменены.';
  StatusBarMain.Repaint;

  ShowMessage('Ошибка при занесении изменений в таблицу на '+inttostr(DataModuleMain.IBQueryTemp.RecNo)+' записи. Все изменения отменены.');

  if AfteTransaction
  then DataModuleMain.OraSession.Rollback;
  raise;
 end;

 if AfteTransaction
 then DataModuleMain.OraSession.Commit;
 finally
  FormProcStatus.Animate1.Active:=false;
  FormProcStatus.Close;
 end;
end;


TableName - имя таблицы в которую вставляем.

Подскажите если не сложно...


Сразу что увидел:

 
Код:
DataModuleMain.IBQueryTemp2.SQL.Text:='select count(*) from '+TableName;
 DataModuleMain.IBQueryTemp2.Open;
 RecCount := DataModuleMain.IBQueryTemp.Fields[0].Value;

Т.е. высчитываешь количество в IBQueryTemp2, а значение берешь из IBQueryTemp.
Если допоздна сидел на работе, то иногда все же полезно бывает поспать ;-)
286
27 апреля 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by sp999
Сразу что увидел:
 
Код:
DataModuleMain.IBQueryTemp2.SQL.Text:='select count(*) from '+TableName;
 DataModuleMain.IBQueryTemp2.Open;
 RecCount := DataModuleMain.IBQueryTemp.Fields[0].Value;

Т.е. высчитываешь количество в IBQueryTemp2, а значение берешь из IBQueryTemp.
Если допоздна сидел на работе, то иногда все же полезно бывает поспать ;-)



Спасибо!!!!!!!!!!!
Но я уже сам разобрался... но от этого варианта я отказался, в нем BLOB переносить нельзя, а это надо....

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог