Извините, пожалуйста, меня за мои знания.
Я пытался самостоятельно найти информацию в сети и читал документацию MyDAC, но рабочего кода я к сожалению не составил.
Подскажите, пожалуйста, как грамотно записать динамический массив чисел и строку в поле BLOB и затем прочитать эти данные.
Могут ли возникнуть какие-либо проблемы на 32/64 разрядных системах или мой код будет работать и там и там?
Создаю таблицу.
Код: Выделить всё
Form1.MyConnection1.ExecSQL('create table if not exists GR (n_id INTEGER NOT NULL AUTO_INCREMENT,'
+'t_id BLOB,'
+'primary key (n_id))'
+ 'ENGINE = INNODB', []); // INNODB для поддержки транзакций
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);var
i: integer;
Matrix: array of integer;
Stream: TMemoryStream;
begin
SetLength(Matrix,10);
for i:=0 to 9 do begin
Matrix[i]:=i;
end;
Stream:= TMemoryStream.Create;
try
Stream.Size:= Length(Matrix) * SizeOf(integer);
Stream.Position := 0;
Stream.Write(Matrix[0], Stream.Size);
Form1.MyQuery1.SQL.Text := 'INSERT INTO gr (t_id) VALUES (:t_id)';
Form1.MyQuery1.Prepare;
if not Form1.MyConnection1.InTransaction then
Form1.MyConnection1.StartTransaction;
try
for i:=0 to 4 do begin
Form1.MyQuery1.ParamByName('t_id').LoadFromStream(Stream, ftBlob);
Form1.MyQuery1.Execute;
end;
Form1.MyConnection1.Commit;
except
Form1.MyConnection1.Rollback;
raise;
end;
finally
Stream.free;
Matrix:=nil;
end;
end;
А с этим кодом не знаю что делать, пытаюсь прочитать BLOB.
Ошибка [dcc32 Error] Unit1.pas(80175): E2003 Undeclared identifier: 'SaveToStream'
Так же не могу понять в как поменять размер массива в который будет идти запись.
Код: Выделить всё
Stream:= TMemoryStream.Create;
Form1.MyQuery1.SQL.Text:= 'select * from gr where n_id=:dname';
Form1.MyQuery1.ParamByName('dname').AsInteger :=1;
Form1.MyQuery1.Open;
while not Form1.MyQuery1.Eof do
begin
Form1.MyQuery1.FieldByName('t_id').SaveToStream(Stream);
Form1.MyQuery1.Next;
end;
Form1.MyQuery1.Close;
Stream.free;
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);var
i: integer;
s: string;
Stream: TMemoryStream;
begin
s:='HELLO WORLD'
Stream:= TMemoryStream.Create;
try
Stream.Write(s[1],Length(s)* SizeOf(char));
Form1.MyQuery1.SQL.Text := 'INSERT INTO gr (t_id) VALUES (:t_id)';
Form1.MyQuery1.Prepare;
if not Form1.MyConnection1.InTransaction then
Form1.MyConnection1.StartTransaction;
try
for i:=0 to 4 do begin
Form1.MyQuery1.ParamByName('t_id').LoadFromStream(Stream, ftBlob);
Form1.MyQuery1.Execute;
end;
Form1.MyConnection1.Commit;
except
Form1.MyConnection1.Rollback;
raise;
end;
finally
Stream.free;
end;
end;