如何将一个数据库的所有记录通过CLIENTSOCKET/SERVERSOCKET传到另一个数据库中去???高分(100分)

  • 主题发起人 主题发起人 fili
  • 开始时间 开始时间
F

fili

Unregistered / Unconfirmed
GUEST, unregistred user!
有什么办法??
 
苯办法一个:
客户端备份压缩,把备份文件以文件流的方式传递,服务器端接收再解压恢复.
 
做的到,不过可能速度很慢呀
在一端传送,另一端接受,在传送方:将数据库中的字段的值取出通过winsock传送出去,另外一端接受
将值写到另一个数据库的字段中
 
你再详细描述一下,看不太明白!
 
好的,我具体说一下
问题是:客户端从数据库中读取记录发送到服务器端,注:客户端的数据库结构和服务器端
是一样的。现在想用CLIENTSOCKET/SERVERSOCKET,从客户端读取相关记录发送到服务器端
必须要通过CLIENTSOCKET/SERVERSOCKET,因为就是要测试一下这个的性能。现在的情况
是,我在客户端定义了一个动态的记录数组,记录结构就是数据库的结构,多条记录就组成
一动态的数组,然后通过CLIENTSOCKET/SERVERSOCKET发送到服务器端,请问如何实现??
如还有不明的地方可以问,我想多加几分,有谁能回答???
 
定义一个参数:
var
A: Variant;
begin
A := VarArrayCreate([0, 4], varVariant);
A[0] := 1;
A[1] := 1234.5678;
A[2] := 'Hello world';
A[3] := True;
A[4] := VarArrayOf([1, 10, 100, 1000]);
WriteLn(A[2]); { Hello world }
WriteLn(A[4][2]); { 100 }
end;
 
拜托,能具体点吗?
 
就是在客户端定义一个上面所说的参数嘛。
当然在服务器端的接口中也得有这样一个参数来接收呀,
比如这是我服务器端的接口:procedure MediaBaseInfo(Option: Shortint; var MediaInfodata: OleVariant;out Ifsucceed: WideString); safecall;
MediaInfodata这是我在服务器端的要接收的数组参数。
这是我在客户端定义的变量:levelprice:=vararraycreate([0,levelcount],varvariant);
再给定义好的这个参数赋值比如:for Icount:=0 to levelcount-1 do
begin
levelprice[Icount]:=tsgrid1.Cell[2,Icount+1];
end;
然后再调用服务器端的接口,将这个参数传进去就行了。
我这个是一维数组的, 二维数组的也一样。
 
有列子吗?我在这上面花了很多时间了,给了列子吧,我可以多加分!!!!!!!!!!
 
我的代码写得很丑的,不敢拿出来献丑的,不过如果真的对你有帮助的话,我也不怕丑了。:)
服务器端的接口://***********************************************************
//媒体时段信息与时段价格存贮
//接口名:Mediaoftime
//参数:
//输入:Option 类型:Shortint
// 说明:操作类型:1表示插入,2表示删除
//输入:Meoftimedata 类型:OleVariant(可变类型,应该输入一个数组)
// 说明:数据元素为一维数组,9个元素,
// 从1至7分别表示:
// 0 :媒体名称
// 1: 执行时间
// 2: 时段
// 3:起始播出时间
// 4:结束播出时间
// 5:长度
// 6:说明
// 7:播出按排
// 8: 时段类型
//输入:LevelCount 类型:OleVariant(可变类型)
// 说明:根据播出等级数目确定下面两个数组的长度。
//输入:LevelName 类型:OleVariant(可变类型,应该输入一个数组)
// 说明:根据前台所做的所做的播出等级确定数组的长度,
// 每一个数组元素表示一个播出等级。
//输入:LevelPrice 类型:OleVariant(可变类型,应该输入一个数组)
// 说明:根据前台所做的所做的播出等级确定数组的长度,
// 每一个数组元素表示对应的播出等级的价格。
//输出:Ifsucceed 类型:string
// 说明:字符1表示存贮成功,0表示存贮失败
// 2表示要增加的时段已经存在
//调试通过
//时间:
//***********************************************************
procedure TUserInfoData.Mediaoftime(Option: Shortint;
var Meoftimedata: OleVariant; LevelCount: Shortint; var levelname,
LevelPrice: OleVariant; out Ifsucceed: WideString);
var
Ptpid: integer; //时段价格ID
MdId: integer; //媒体名称ID
Icount: integer;
PtiId: integer; //媒体时段ID
PtoId: integer; //播出级别ID
Tablename: string;
Fieldname: string;
Fieldnamename: string;
Fieldnamevalue: string;
begin
case option of

1:begin
Tablename:='Media_Period_Of_Time_Information';
Fieldname:='Pti_pot';
Fieldnamevalue:=Meoftimedata[2];
if not Estimate(Tablename,Fieldname,Fieldnamevalue) then
begin
Tablename:='Period_Of_Time_And_Price';
Fieldname:='Ptp_id';
Ptpid:=ProdurePreID(Tablename,Fieldname);
Tablename:='Media_Period_Of_Time_Information';
Fieldname:='Pti_id';
PtiId:=ProdurePreID(Tablename,Fieldname);
Tablename:='Media_Name';
Fieldname:='MDA_N_ID';
Fieldnamename:='Mda_name';
Fieldnamevalue:=Meoftimedata[0];
MdId:=Getid(Tablename,Fieldname,Fieldnamename,Fieldnamevalue);
try
ADOUserInfoConnect.BeginTrans;
with Query1 do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO Media_Period_Of_Time_Information( ');
SQL.Add('Pti_id,');
SQL.Add('Pti_imp_date,');
SQL.Add('Mda_n_id,');
SQL.Add('Pti_pot,');
SQL.Add('Pti_use,');
SQL.Add('Pti_marker,');
SQL.Add('Mps_id) VALUES(');
SQL.Add(':Ptiid,');
SQL.Add(':Ptiimpdate,');
SQL.Add(':Mdinid,');
SQL.Add(''+quotedstr(Meoftimedata[2])+',');
SQL.Add(':Ptiuse,');
SQL.Add(':Ptimarker,');
SQL.Add(''+quotedstr(Meoftimedata[8])+')');
Parameters.ParamByName('Ptiid').DataType:=ftInteger;
Parameters.ParamByName('Ptiid').Value:=Ptiid;
Parameters.ParamByName('Ptiimpdate').DataType:=ftDateTime;
Parameters.ParamByName('Ptiimpdate').Value:=Meoftimedata[1];
Parameters.ParamByName('Mdinid').DataType:=ftInteger;
Parameters.ParamByName('Mdinid').Value:=MdId;
Parameters.ParamByName('Ptiuse').DataType:=ftstring;
Parameters.ParamByName('Ptiuse').Value:='1';
Parameters.ParamByName('Ptimarker').DataType:=ftBoolean;
Parameters.ParamByName('Ptimarker').Value:=1;
ExecSQL;
end;
with Query2 do
begin
for Icount:=0 to LevelCount-1 do
begin
Tablename:='Period_Of_Time_Order';
Fieldname:='Pto_id';
Fieldnamename:='Pto_order';
Fieldnamevalue:=LevelName[Icount];
PtoId:=Getid(Tablename,Fieldname,Fieldnamename,Fieldnamevalue);
Close;
SQL.Clear;
SQL.Add('INSERT INTO Period_Of_Time_And_Price( ');
SQL.Add('Ptp_id,');
SQL.Add('Pti_id,');
SQL.Add('Play_deploy,');
SQL.Add('Play_begin,');
SQL.Add('pto_id,');
SQL.Add('Ptp_price,');
SQL.Add('ptp_time,');
SQL.Add('play_end,');
SQL.Add('Ptp_marker) VALUES(');
SQL.Add(':Ptpid,');
SQL.Add(':Ptiid,');
SQL.Add(''+quotedstr(Meoftimedata[7])+',');
SQL.Add(':Playbegin,');
SQL.Add(':ptoid,');
SQL.Add(':price,');
SQL.Add(''+quotedstr(Meoftimedata[5])+',');
SQL.Add(':Playend,');
SQL.Add(':Ptpmarker)');
Parameters.ParamByName('Ptpid').DataType:=ftInteger;
Parameters.ParamByName('Ptpid').Value:=Ptpid;
Parameters.ParamByName('Ptiid').DataType:=ftInteger;
Parameters.ParamByName('Ptiid').Value:=PtiId;
Parameters.ParamByName('Playbegin').DataType:=ftTime;
Parameters.ParamByName('Playbegin').Value:=Meoftimedata[3];
Parameters.ParamByName('Ptoid').DataType:=ftInteger;
Parameters.ParamByName('Ptoid').Value:=PtoId;
Parameters.ParamByName('price').DataType:=ftCurrency;
Parameters.ParamByName('price').Value:=LevelPrice[Icount];
Parameters.ParamByName('Playend').DataType:=ftTime;
Parameters.ParamByName('Playend').Value:=Meoftimedata[4];
Parameters.ParamByName('Ptpmarker').DataType:=ftBoolean;
Parameters.ParamByName('Ptpmarker').Value:=1;
ExecSQL;
Ptpid:=Ptpid+1;
end;
end;
ADOUserInfoConnect.CommitTrans;
Ifsucceed:='1';
Except
ADOUserInfoConnect.RollbackTrans;
Ifsucceed:='0';
end;
end
else
begin
Ifsucceed:='2';
end;
end;

2:begin //删除
with query1 do
begin
try
Close;
SQL.Clear;
SQL.Add('Update Media_Period_Of_Time_Information set Pti_marker=:Ptimarker where Pti_pot=:Ptipot');
Parameters.ParamByName('Ptimarker').DataType:=ftinteger;
Parameters.ParamByName('Ptimarker').Value:=2;
Parameters.ParamByName('Ptipot').DataType:=ftstring;
Parameters.ParamByName('Ptipot').Value:=Meoftimedata[2];
ExecSQL;
Ifsucceed:='1';
except
Ifsucceed:='0';
end;
end;
end;
end;
end;
客户端的调用:
procedure TfrmPerTimePrice.btSaveClick(Sender: TObject);
var
Icount: integer;
strPlan: string;
Option: integer;
Medperprice: variant;
levelcount: integer;
levelname: variant;
levelprice: variant;
Ifsucceed: string;
begin
//保存媒体的时段价格信息
//自动时段编号和编码
try
//strPlan := IntToStr(ord(cbWeek1.))+IntToStr(ord(cbWeek2.checked))+
// IntToStr(ord(cbWeek3.checked))+IntToStr(ord(cbWeek4.checked))+
// IntToStr(ord(cbWeek5.checked))+IntToStr(ord(cbWeek6.checked))+
// IntToStr(ord(cbWeek7.checked));
strPlan:=getplan(fcButtonGroup1fcShapeBtn1.Down,fcButtonGroup1fcShapeBtn2.Down,fcButtonGroup1fcShapeBtn3.Down,
fcButtonGroup1fcShapeBtn4.Down,fcButtonGroup1fcShapeBtn5.Down,fcButtonGroup1fcShapeBtn6.Down,
fcButtonGroup1fcShapeBtn7.Down);
Option:=1;
Medperprice:=vararraycreate([0,8],varvariant);
MedperPrice[0]:=DBLookupcombobox1.Text;
MedperPrice[1]:=dtDate.Date;
MedperPrice[2]:=edtperTime.Text;
MedperPrice[3]:=medtTime.Time;
MedperPrice[4]:=medtendTime.Time;
MedperPrice[5]:=edtLong.Text;
MedperPrice[6]:=meMemo.Text;
MedperPrice[7]:=strPlan;
MedperPrice[8]:=DBLookupcombobox1.KeyValue;
levelcount:=tsgrid1.Rows-1;
levelname:=vararraycreate([0,levelcount],varvariant);
levelprice:=vararraycreate([0,levelcount],varvariant);
for Icount:=0 to levelcount-1 do
begin
levelname[Icount]:=tsgrid1.Cell[1,Icount+1];
end;
for Icount:=0 to levelcount-1 do
begin
levelprice[Icount]:=tsgrid1.Cell[2,Icount+1];
end;
DataModulemedinfo.SocketConnection1.AppServer.Mediaoftime(Option,Medperprice,levelcount,levelname,levelprice,Ifsucceed);
case strtoint(Ifsucceed) of

1:
showmessage('数据插入成功!');
0:
showmessage('数据插入失败!');
2:
showmessage('新插入的数据,在数据库中已经存在!请重新输入数据!');
end;
edtPerTime.SetFocus;
//btAdd.Enabled := true;
btSave.Enabled := false;
except
//btAdd.Enabled := false;
btSave.Enabled := true;

end;
end;
 
发送部分呢。。。我要的关键怎么没有呀
 
我不明白你所说的发送是什么意思?
这段程序就是从客户端数据到中间层,
然后再到数据库的。
 
发送就是从客户端把记录读出来以一定的格式发到服务器端
 
上面不是有吗?给动态数组赋值就是得到客户端的数据呀,
调用中间层的接口就是将数据传到服务器呀!执行接口就是将数据送到数据库呀。
 
别急,让我再想想。
 
后退
顶部