Ado и Odac СРОЧНО!!!!!!!!!
В своей программе я использовал сначала ADO потом odac, в обоих была одна и та-же ошибка....:x
В компоненте запрос обоих пакетов я строил ОБЫЧНЫЙ запрос на втавку с параметрами, заносил значения параметров, для этого искал параметр методом
и
Parameters.ParamByName(StringGridInOut.Cells[1,n]) для ADO
и при этом у меня на НЕКОТОРЫЕ параметры появляется ошибка, что они не найдены.
Но они там есть, т.к при разработке если я текст запроса заношу они появляются. Ошибки в их названии скорей всего то же нет т.к. название полей и параметров для запроса я беру из одного и того-же места
Может кто встречал этот глук и как сним бороться???????????????
Напишите пожалуста поскорее МНЕ СРОЧНО НАДО!!!!!!!!!!!!!
Но всё таки если ни кто ни чего подсказать не может, то посоветуйте, чем эти пакеты заменить можно... мне всего один запрос нужен и всё....
Доброго времени суток.
В своей программе я использовал сначала ADO потом odac, в обоих была одна и та-же ошибка....:x
В компоненте запрос обоих пакетов я строил ОБЫЧНЫЙ запрос на втавку с параметрами, заносил значения параметров, для этого искал параметр методом
и
Parameters.ParamByName(StringGridInOut.Cells[1,n]) для ADO
и при этом у меня на НЕКОТОРЫЕ параметры появляется ошибка, что они не найдены.
Но они там есть, т.к при разработке если я текст запроса заношу они появляются. Ошибки в их названии скорей всего то же нет т.к. название полей и параметров для запроса я беру из одного и того-же места
Может кто встречал этот глук и как сним бороться???????????????
Напишите пожалуста поскорее МНЕ СРОЧНО НАДО!!!!!!!!!!!!!
Но всё таки если ни кто ни чего подсказать не может, то посоветуйте, чем эти пакеты заменить можно... мне всего один запрос нужен и всё....
Мне кажется, дело вот в чем:
когда ты пишешь в дизайн-тайм, то оболочка автоматом добавляет описанные тобою параметры, а когда ты в ран-тайме заполняешь строку запроса, то у проги не хватает интеллекта это сделать.
Попробуй вместе с формированием строки запроса также добавлять параметры при помощи метода AddParameter
Мне кажется, дело вот в чем:
когда ты пишешь в дизайн-тайм, то оболочка автоматом добавляет описанные тобою параметры, а когда ты в ран-тайме заполняешь строку запроса, то у проги не хватает интеллекта это сделать.
Попробуй вместе с формированием строки запроса также добавлять параметры при помощи метода AddParameter
Но веть такая ошибка не на все парамеры возникает, причём у меня ошибка вылетела "после какого то параметра или номера параметра(точно не знаю)" т.е на том параметре, который после определённого стоит.
Но веть такая ошибка не на все парамеры возникает, причём у меня ошибка вылетела "после какого то параметра или номера параметра(точно не знаю)" т.е на том параметре, который после определённого стоит.
Может код покажешь? А то рассуждаем о возвышенном...
Может код покажешь? А то рассуждаем о возвышенном...
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;
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;
begin
OpenParam:=true;
try
paramin.AssignFieldValue(paramout,paramout.Value);
except
OpenParam:=false;
end;
end;
Переред BitBtnAddQueryClick выполняется OraQueryInsert.text:=CreateQuery;
Но я тебе тоно скажу, что ошибка эта не на все поля возникает. а только на некоторые.....
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;
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;
begin
OpenParam:=true;
try
paramin.AssignFieldValue(paramout,paramout.Value);
except
OpenParam:=false;
end;
end;
Переред BitBtnAddQueryClick выполняется OraQueryInsert.text:=CreateQuery;
Но я тебе тоно скажу, что ошибка эта не на все поля возникает. а только на некоторые.....
Попробуй перед кодом, выдающим ошибку, вывести все параметры и содержимое стринг-грида.
Попробуй перед кодом, выдающим ошибку, вывести все параметры и содержимое стринг-грида.
То есть ты предпологаеш, что там параметр не создаётся, или кривой получается..... может быть...., но с какой стати и почему тогда у обоих пакетв, ошибки веть обсолюдно одинаковые и на один параметр.... а в StringGrid всё верно, программа у меня кучу раз выполнялась нормально... только вот сейчас эта пакость вылезла....
А на счёт прогу посмотреть, так у меня сейчас не получится....
То есть ты предпологаеш, что там параметр не создаётся, или кривой получается..... может быть...., но с какой стати и почему тогда у обоих пакетв, ошибки веть обсолюдно одинаковые и на один параметр.... а в StringGrid всё верно, программа у меня кучу раз выполнялась нормально... только вот сейчас эта пакость вылезла....
А на счёт прогу посмотреть, так у меня сейчас не получится....
Скорее всего ошибка в следующем: тип праметра - ftUnknown (при создании праметров в runtime так и есть), а его значение передается как Null. VCL не позволяет такого, причем эта фича зашита в базовых классах VCL, от которых унаследованы классы и ADO, и ODAC. Я сам пропарился с этой фигней довольно долго и ошибка вылезла тоже через некоторое время :(
Решение, в общем, уже предлагалось - явное создание параметра и обязательное указание его типа.
Но я уже сам разобрался, там такая хер... оказалась................... а я ради неё вчера до позна на работе сидел...
Но у меня другая проблема ...
Сейчас на ODAC делаю, и не получается передавать сразу много значений в параметре т.е. что бы в одних параметрах сразу передавались данные не для одной строки , а для многих
вод код, но она говорит, что у неё ошибка в длине массива.
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 - имя таблицы в которую вставляем.
Подскажите если не сложно...
Спасибо всем за помощь!!)))))))))))))
Но я уже сам разобрался, там такая хер... оказалась................... а я ради неё вчера до позна на работе сидел...
Но у меня другая проблема ...
Сейчас на ODAC делаю, и не получается передавать сразу много значений в параметре т.е. что бы в одних параметрах сразу передавались данные не для одной строки , а для многих
вод код, но она говорит, что у неё ошибка в длине массива.
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.Open;
RecCount := DataModuleMain.IBQueryTemp.Fields[0].Value;
Т.е. высчитываешь количество в IBQueryTemp2, а значение берешь из IBQueryTemp.
Если допоздна сидел на работе, то иногда все же полезно бывает поспать ;-)
Сразу что увидел:
DataModuleMain.IBQueryTemp2.Open;
RecCount := DataModuleMain.IBQueryTemp.Fields[0].Value;
Т.е. высчитываешь количество в IBQueryTemp2, а значение берешь из IBQueryTemp.
Если допоздна сидел на работе, то иногда все же полезно бывает поспать ;-)
Спасибо!!!!!!!!!!!
Но я уже сам разобрался... но от этого варианта я отказался, в нем BLOB переносить нельзя, а это надо....