Odac загрузка

friz777
Дата: 10.05.2011 15:37:05
Хоть убейте, не врубаюсь в чем проблема..
procedure TForm1.Button1Click(Sender: TObject);
var i,k,j,rowcount:integer;
    xmlSource: DOMDocument;
    xmlStylesheet: DOMDocument;
    Start, Finish: Int64;
    TableName,XmlHome:string;

begin
Start := GetTickCount;
k:=0;
 TableName:='';
ProgressBar1.Position:=0;
ProgressBar1.Properties.Max:=FileList.Count - 1 ;
for I := 0 to FileList.Count - 1 do
begin
Application.ProcessMessages;
xml := IXMLDOMDocument(CreateOleObject('msxml.domdocument'));

//Блок xslt трансформации
xmlSource := CoDOMDocument.Create;
xmlStylesheet := CoDOMDocument.Create;
xmlSource.load(FileList[i]);
xmlStylesheet.load('c:\temp\test\test.xsl'); //шаблон
xml.loadXML(xmlSource.transformNode(xmlStylesheet));
//

//Получаем таблицы оракла
OraQuery1.SQL.Text:='select LoadBufView from CFG_BUFFERTABLE';
OraQuery1.Open;
OraQuery1.First;
//Проходим по всем таблицам
while not OraQuery1.Eof do
begin
    TableName:=OraQuery1.FieldByName('LoadBufView').AsString;

    rowcount:=0;
      //Получаем список полей и типов для данной таблицы
      OraQuery2.sql.Text:=' select column_name as Field,substr(data_type,1,1) as Type'+
                          ' from user_tab_columns where table_name = '''+TableName+'''';
      OraQuery2.Open;
      OraQuery2.First;

        //загружаем поля в массив
        SetLength(FieldsArray,OraQuery2.RecordCount+1);
        while not OraQuery2.eof do
          begin
          inc(k);
          FieldsArray[k,1]:=OraQuery2.FieldByName('Field').AsString;
          FieldsArray[k,2]:=OraQuery2.FieldByName('Type').AsString;
          OraQuery2.Next;
          end;
     
   //Получаем количество записей xml для таблицы
   rowcount:=xml.documentElement.selectNodes('//'+uppercase(TableName)).length;

   For j:=1 to rowcount do
   begin
      //Блок разбора xml файла и заполнение массива значениеми поля
      for k := 1 to length(FieldsArray)  do
      begin
        try
          FieldsArray[k,3]:=xml.documentElement.selectSingleNode(uppercase('//'+TableName+'/'+(FieldsArray[k,1]))).text;
        except
          showmessage(FieldsArray[k,1]);
        end;

      end;

      //блок загрузки массива в оракл
      OraSession1.Connect;
      OraLoader1.Columns.Clear; //чистим поля
      OraLoader1.TableName:=TableName;  !!!!!!!!!!!!!!!!! ТУТ ВЫЛАЗИТ ACCESS VIOLATION AT ADDRESS .....
      OraLoader1.Load;


   end;
OraQuery1.Next;
end;

//
xmlSource:=nil;
xmlStylesheet:=nil;
xml:=nil;
ProgressBar1.Position:=ProgressBar1.Position+1;
end;

Finish := GetTickCount;
Label1.Caption := 'Time: ' + FloatToStr((Finish - Start) / 1000) + ' sec. FILE:'+inttostr(FileList.Count);
end;

Пытался в ручную вписывать имя таблицы и все равно хрень... хотя в чистом проекте данная схема прокатывает на ура :\
friz777
Дата: 10.05.2011 15:54:26
такую же ошибку выбивает если ввести несуществующею таблицу... но это таблица 100% есть, и паблик синонимы прописаны и т.п.
devart
Дата: 10.05.2011 16:24:40
friz777,

Попробуйте скачать последнюю версию ODAC, может быть это решит Вашу проблему.

В последних версиях ODAC при присвоении несуществующей таблицы OraLoader-у Вы должны получать корректное сообщение -
"ORA-00942: Таблица или представление пользователя не существует", а не Access violation
friz777
Дата: 10.05.2011 17:23:57
косяк в том что в таблице 300 полей (проектировщику базы руки бы оторвать) и поэтому odac не успевает определить поля, вставка delay помогла но это не кул :\
defecator
Дата: 10.05.2011 17:37:58
friz777
косяк в том что в таблице 300 полей (проектировщику базы руки бы оторвать)


Тут, кажись, не только руки отрывать, но и все выступающие части его тушки.
А потом возить по городам в клетке, типа, "праздник к нам приходит, праздник к нам приходит..."

Это ж надо - 300 (триста) полей в таблице !