如何将如下的记录类型存入sql server数据库?(300分)

  • 主题发起人 主题发起人 tiger
  • 开始时间 开始时间
T

tiger

Unregistered / Unconfirmed
GUEST, unregistred user!

记录类型如下:
type
cstype=array[1..2]of string;
sltype=array[1..5,1..12]of SmallInt;
sytype=record
djxh:string[10];
csdata:cstype;
sldata:sltype;
end;
syda=array[1..15]of sytype;

以下分别如何实现?
1。把syda当作一个字段来存储
2。把syda当作一张表来存储
3。如何从数据库读出后还原成record类型?

先敬上300分,请笑纳.
先感谢
 
1 用一个大二进制(blob)字段存放。
2 表有1+2+5*12个字段,共有15条记录。
3 无论是1还是2的存放方式,还原操作都是一样的:怎样写进数据库,怎样将其读出来。
blob的方式可以以流的形式来操作,以固定长度对blob字段进行分割操作。表的形式就是直接select,一条记录形成syda的一个record。
 
你把这些东西想办法拼成一个字符串,写进库里。
读出时再把串解析出来。
 
这还不简单,
 用 XML ,存成 image 字段
 
想了想没必要存成一张表.还原起来太麻烦.
armyjiang和强@子的方法我都想到了,不过向这样处理起来太麻烦了.
DouZhen能否再说详细点,最好是有示例.
谢谢


 
存成BLOB型数据就可以了
 
哪种数据库?若是Oracle,可自定义存储的类型。可以定义成和你的结构一模一样的,然后存储用syda.djxh就可以存入。
若是MSSQL,把你的结构体存成一个文件,再存为BLOB也可以,需要打包与解析,
我想还可以仔细分析数据的结构,将结构转化为表之间的关联。一维数组实际就是一个字段的表,二维数组就是二个字段的的表。
或干脆就是一张表的各个字段。(这种方法有冗余字段,如sltype1...sltype60,sltype60存的实际是sltype[5][12]的值)
取的时候就顺序取出表中的字段候赋给对应结构的属性值就可以了。
否则关系统数据库的能力并不能完全发挥。
 
// 字段类型为varbinary
// 保存记录
procedure SaveRec(var ds:TDataSet;rec:sytype);
var
ms:TMemoryStream;
begin
with ds do begin
ms:=TMemoryStream.Create;
try
ms.Write(rec,sizeof(sytype));
ms.Position:=0;
ds.Insert;
TBlobField(ds.Fields[0]).LoadFromStream(ms);
Post;
finally
ms.Free;
end;
end;
end;

// 读取记录
procedure LoadRec(var ds:TDataSet;rec:sytype);
var
ms:TMemoryStream;
begin
with ds do begin
ms:=TMemoryStream.Create;
try
TBlobField(ds.Fields[0]).SaveToStream(ms);
ms.Position:=0;
ms.Read(rec,sizeof(sytype));
finally
ms.Free;
end;
end;
end;
 
同意楼上。。。。。。。。。。。
 
惭愧。。再问一句。。
在哪里声明函数?
因为sytype是在后面定义的(implementation里)。。。
 
在implementation下面直接写函数体即可,不用申明。
 
hi,xujunjie,乘你还在。
因为用的ado
SaveRec(var ds:TDataSet;rec:sytype)中的tdataset换成TADoDataSet,
出现运行错误,invalid class typecast.
 
Sorry,字段类型不能是varbinary,应该为image,否则会出上述错误。[:D]
 
hi,xujunjie,
已经可以正常存储了。
不过,无法正常还原了。。读出来的数据变样了,字符都变乱码。
 
cstype是一个二维字符串数组吗?如果是,在定义的时候要给出其长度,例如

cstype=array[1..2]of string[100];

再试试看!
 
实际上所有string都已经定义长度。
该record类型比较复杂,其中还有real,byte,real数组,word 等数据类型。
会有其他原因吗?

能留下email或qq号吗?
 
呵呵,又露掉了一个地方,把LoadRec定义改为:
procedure LoadRec(var ds:TDataSet;var rec:sytype);

掉了一个var,结果相差万里:)

我的E-MAIL:xujunjie@96001.net QQ:10621540
 
:)终于ok了
谢谢xujunjie的耐心指导:)


 
多人接受答案了。
 
不用客气,我有个毛病就是丢三落四。 [:D]
 

Similar threads

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