Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Внизпроблема с АДО и TFileStream Найти похожие ветки
← →
nika_ufc © (2004-04-13 21:29) [0]проблема с АДО и TFileStream.
у меня такая проблема.
С помощью АДО я хочу из базы сделать рапорт (из Oracle). рапорт должен бить в формате .txt. Connection делаю через АДО.
procedure TForm1.Button1Click(Sender: TObject);
var MyFileW:TFileStream;
i:integer;
begin
if not ADOConnection1.Connected then
begin
MessageDlg("Connect to Database.",mtInformation,[mbOK],0);
Exit;
end;
ADOQuery1.SQL.Add("Select F042,F002,F004,F049, From XXX.YYY");
ADOQuery1.SQL.Add("Where F002 like ""4%"" and AUDIT_RESULT<>800");
ADOQuery1.SQL.Add("Order By F042");
ADOQuery1.Prepared:=True;
ADOQuery1.Open;
MyFileW:=TFileStream.Create("MyFile.txt",fmCreate);
For i:=0 to ADOQuery1.FieldCount-1 do
begin
MyFileW.Write(PChar(ADOQuery1.Fields[i].FieldName)^,ADOQuery1.Fields[i].Size); //вот здесь все не так как надо
end;
end;
в Хелп написано это:
procedure caststring;
var
fs: TFileStream;
const
s: string = "Hello";
begin
fs := TFileStream.Create("temp.txt", fmCreate or fmOpenWrite);
fs.Write(s, Length(s)); // this will give you garbage
fs.Write(PChar(s)^, Length(s)); // this is the correct way
end;
сами видите что я делаю так же, но в файле записывается вот это : F042 0AF002 ÈLÈ ÈLÈ F04CCAACAUDAUD
думаю, дела в PChar, то есть в том что не знаю как корректно записать в фйле. (все поля типа VARCHAR2)
и еще одно (не забудте пожалуйста этот факт разъяснть) когда я закрываю приложение на экран появляется CPU Debugger. в эгзешнике все ОК, но в IDE после закрытия...
впрочем как уже говорил выскакивает CPU Debugger. вот и код при закрытие:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ADOQuery1.Active then
ADOQuery1.SQL.Clear;
ADOQuery1.Close;
if ADOConnection1.Connected then
ADOConnection1.Close;
end;
сапасибо за помощь заранее .
← →
nika_ufc © (2004-04-13 21:29) [0]проблема с АДО и TFileStream.
у меня такая проблема.
С помощью АДО я хочу из базы сделать рапорт (из Oracle). рапорт должен бить в формате .txt. Connection делаю через АДО.
procedure TForm1.Button1Click(Sender: TObject);
var MyFileW:TFileStream;
i:integer;
begin
if not ADOConnection1.Connected then
begin
MessageDlg("Connect to Database.",mtInformation,[mbOK],0);
Exit;
end;
ADOQuery1.SQL.Add("Select F042,F002,F004,F049, From XXX.YYY");
ADOQuery1.SQL.Add("Where F002 like ""4%"" and AUDIT_RESULT<>800");
ADOQuery1.SQL.Add("Order By F042");
ADOQuery1.Prepared:=True;
ADOQuery1.Open;
MyFileW:=TFileStream.Create("MyFile.txt",fmCreate);
For i:=0 to ADOQuery1.FieldCount-1 do
begin
MyFileW.Write(PChar(ADOQuery1.Fields[i].FieldName)^,ADOQuery1.Fields[i].Size); //вот здесь все не так как надо
end;
end;
в Хелп написано это:
procedure caststring;
var
fs: TFileStream;
const
s: string = "Hello";
begin
fs := TFileStream.Create("temp.txt", fmCreate or fmOpenWrite);
fs.Write(s, Length(s)); // this will give you garbage
fs.Write(PChar(s)^, Length(s)); // this is the correct way
end;
сами видите что я делаю так же, но в файле записывается вот это : F042 0AF002 ÈLÈ ÈLÈ F04CCAACAUDAUD
думаю, дела в PChar, то есть в том что не знаю как корректно записать в фйле. (все поля типа VARCHAR2)
и еще одно (не забудте пожалуйста этот факт разъяснть) когда я закрываю приложение на экран появляется CPU Debugger. в эгзешнике все ОК, но в IDE после закрытия...
впрочем как уже говорил выскакивает CPU Debugger. вот и код при закрытие:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ADOQuery1.Active then
ADOQuery1.SQL.Clear;
ADOQuery1.Close;
if ADOConnection1.Connected then
ADOConnection1.Close;
end;
сапасибо за помощь заранее .
← →
Jack128 © (2004-04-13 21:51) [1]
> yFileW.Write(PChar(ADOQuery1.Fields[i].FieldName)^,ADOQuery1.Fields[i].Size);
>
> s.Write(PChar(s)^, Length(s));
Это одно и тоже??
← →
Jack128 © (2004-04-13 21:51) [1]
> yFileW.Write(PChar(ADOQuery1.Fields[i].FieldName)^,ADOQuery1.Fields[i].Size);
>
> s.Write(PChar(s)^, Length(s));
Это одно и тоже??
← →
nika_ufc © (2004-04-13 21:58) [2]>Jack128 © (13.04.04 21:51) [1]
>Это одно и тоже??
да у них один и тот же тип -> String.
← →
nika_ufc © (2004-04-13 21:58) [2]>Jack128 © (13.04.04 21:51) [1]
>Это одно и тоже??
да у них один и тот же тип -> String.
← →
Jack128 © (2004-04-13 22:02) [3]
> [2] nika_ufc © (13.04.04 21:58)
У кого у них??? Ты что действительно не видишь, что ADOQuery1.Fields[i].Size и Length(s) нечего общего??
И вообще что бы хочешь сохранить то??? Имена полей??
← →
Jack128 © (2004-04-13 22:02) [3]
> [2] nika_ufc © (13.04.04 21:58)
У кого у них??? Ты что действительно не видишь, что ADOQuery1.Fields[i].Size и Length(s) нечего общего??
И вообще что бы хочешь сохранить то??? Имена полей??
← →
nika_ufc © (2004-04-13 22:14) [4]>И вообще что бы хочешь сохранить то??? Имена полей??
да. но я хочу что длина у этих полей (то есть под ним потом я хочу приписать значения, а эти значения, то есть их длина равен ADOQuery1.Fields[i].Size) был равен ADOQuery1.Fields[i].Size
← →
nika_ufc © (2004-04-13 22:14) [4]>И вообще что бы хочешь сохранить то??? Имена полей??
да. но я хочу что длина у этих полей (то есть под ним потом я хочу приписать значения, а эти значения, то есть их длина равен ADOQuery1.Fields[i].Size) был равен ADOQuery1.Fields[i].Size
← →
Jack128 © (2004-04-13 22:19) [5]Так и не понял, что те надо, но длинные строки нужно сохранять так
procedure WriteString(Stream: TStream; const s: string);
begin
Stream.WriteBuffer(Length(s), SizeOf(Integer));
Stream.WriteBuffer(PChar(s)^, Length(s));
end;
function ReadString(Stream: TStream): string;
var
len: Integer;
begin
Stream.ReadBuffer(len, SizeOf(Integer));
SetLength(Result, len);
Stream.ReadBuffer(PChar(Result)^, len);
end;
← →
Jack128 © (2004-04-13 22:19) [5]Так и не понял, что те надо, но длинные строки нужно сохранять так
procedure WriteString(Stream: TStream; const s: string);
begin
Stream.WriteBuffer(Length(s), SizeOf(Integer));
Stream.WriteBuffer(PChar(s)^, Length(s));
end;
function ReadString(Stream: TStream): string;
var
len: Integer;
begin
Stream.ReadBuffer(len, SizeOf(Integer));
SetLength(Result, len);
Stream.ReadBuffer(PChar(Result)^, len);
end;
← →
nika_ufc © (2004-04-13 23:21) [6]>Jack128 © (13.04.04 22:19) [5]
спосибо тебе все ок.
а как как насчет этого ?
>>
и еще одно (не забудте пожалуйста этот факт разъяснть) когда я закрываю приложение на экран появляется CPU Debugger. в эгзешнике все ОК, но в IDE после закрытия...
впрочем как уже говорил выскакивает CPU Debugger. вот и код при закрытие:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ADOQuery1.Active then
ADOQuery1.SQL.Clear;
ADOQuery1.Close;
if ADOConnection1.Connected then
ADOConnection1.Close;
end;
← →
nika_ufc © (2004-04-13 23:21) [6]>Jack128 © (13.04.04 22:19) [5]
спосибо тебе все ок.
а как как насчет этого ?
>>
и еще одно (не забудте пожалуйста этот факт разъяснть) когда я закрываю приложение на экран появляется CPU Debugger. в эгзешнике все ОК, но в IDE после закрытия...
впрочем как уже говорил выскакивает CPU Debugger. вот и код при закрытие:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ADOQuery1.Active then
ADOQuery1.SQL.Clear;
ADOQuery1.Close;
if ADOConnection1.Connected then
ADOConnection1.Close;
end;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c