怎么向SQL的一个字段存储一个Record结构(100分)

  • 主题发起人 主题发起人 Miros
  • 开始时间 开始时间
M

Miros

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TRecord = Packed Record
nIdx : Integer;
sName : string[20];
sAccount : string[20];
dPayMen : DWord;
end;

....

var
Rec: TRecord;

....
现在想把Rec存到SQL表的一个列中, 请教如何实现.
 
你上面的结构 没有动态数组和其他指针类 数据类型, 直接可以用 Tblodfieldstream 存到2进制字段里 若有指针类数据类型 则要先把结构write 进stream 然后把结构中指针所指的数据write进stream .然后才能写进数据库,取出同样!

-----天亮了 在网吧一夜了 不知道家里的人走了吗?
-----------一生都在奢求享受寂寞的人
 
Tblodfieldstream 如何用?
 
帮助里没有Tblodfieldstream
 
TMemorystream 也可以实现 它的子类型有 TADOblobstream 等 具体记不清拼写了 我在网吧!
function RecSavetostream :boolean
var
I,count;integer;
ms:TADOblobstream;
begin
result:=false;
ms:=TADOblobstream.create(Tbolobfield(adoset.fieldbyName('bolobfieldname')))
try
ms.write( Rec,sizeof (rec));
{若有指针类型 要写入指针所指数据,string 类由于实际结构为负指针,最好转换成
array of shortstring 否者 还原很麻烦。}
//以下假设结构中有 shortsts:array of shortstring
count:=high(shortsts);
ms.write( count,sizeof (count));//写入 动态数组数量 取时 -1则不取
if count=-1 then exit
for i:=0 to count do write(shortsts,256);

adoset.post;
result:= true;
finally
adoset.edit;
ms.free;
end;
end;
大概就是这样,在网吧现写的, 细节难免有错。原理就是这样了
 
呵呵 确实没有TADOblodStream 我还是看看其他方法吧 或者等别人给出个好方法.
 
數據庫定義image類型,前台字段就是TBlobField,然後裡面有stream的屬性,保存前把record寫入字段的stream,就可以保存了,取出時反過來
 
用IMage字段,用TStream读写结构体,具体代码全文检索一下,很多例子。
 
结构类型可以用Varchar类型进行存储,并规定格式与间隔符既可。
例如存储:
type
TRecord = Packed Record
nIdx : Integer;
sName : string[20];
sAccount : string[20];
dPayMen : DWord;
end;
可以用:
“nIdx|sName|sAccount|dPayMen”进行存储,如“00200|Johnny_du|0200100|3000”
 
是 TADOBlobstream 错了一个字母 不是TADOBlodstream 我已经改了
 
用binary字段,然后写用TField.SetData,读用TField.GetData
 
同意Johnny_du的说法,对于简单结构类型完全可以以字符串模式,各属性之间使用分隔符方式储存,存取都很简单......
 
这是我的Demo
将数据类型设为: binary
例如:
TPWD = record
ID: Integer;
pwd : string[15];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
MS : TMemoryStream;
tmp : TPWD;
id : integer;
pwd : string;
begin
tmp.ID := StrToInt(Trim(Edit1.Text));
tmp.pwd := Trim(Edit2.Text);

MS :=TMemoryStream.Create;
//存数据
...
MS.WriteBuffer(tmp , SizeOf(TPWD));
MS.Position:=0;
TBlobField(AdoQuery1.FieldByName('pwd')).LoadFromStream(MS);
MS.Position :=0;
...
//取数据
MS.Clear;
MS.SetSize(SizeOf(TPWD));
TBlobField(AdoQuery1.FieldByName('pwd')).SaveToStream(MS);
MS.Position := 0;
MS.Read(tmp,MS.Size);
ID := tmp.ID;
pwd := tmp.pwd;
end;
 
我用mzlsx的方法感觉很方便 但是每次插入数据后都得再Open一次 麻烦,不知道有什么好办法没
type
TA = packed record
Chr1: Char;
Chr2: Char;
Chr3: Char;
Chr4: Char;
nIndx: Integer;
wIdx : Word;

end;
const
S = '测试';
var
A: TA;
MS: TMemoryStream;
begin
A.Chr1 := S[1];
A.Chr2 := S[2];
A.Chr3 := S[3];
A.Chr4 := S[4];
A.nIndx := 123456;
A.wIdx := 255;

ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Insert Into Tabel1 (Idx, ChrName, ModDate) Values(111111, ''asdasdasd'', ''2006-09-09 15:41:32'')';
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Text := 'Select * From Tabel1 where Idx = 111111 and ChrName = ''asdasdasd''';
ADOQuery1.Open;
ADOQuery1.First;


AdoQuery1.Edit;
AdoQuery1.FieldByName('Data').SetData(@A);
AdoQuery1.Post;

FillChar(A, Sizeof(A), 0);
AdoQuery1.FieldByName('Data').GetData(@A);

ShowMessage(Format('%s%s%s%s[%d, %d]', [A.Chr1, A.Chr2, A.Chr3, A.Chr4, A.nIndx, A.wIdx]));
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
后退
顶部