100分! 急急急!!!!

FCU 2005-08-03 05:10:07
我做的软件是一个管理软件(C/S),服务器端: SQL-2000

客户端: 软件

本软件有一个工程备份和载入这个功能:

工程备份: 就是把一批数据需要从服务器(SQL中)提出放到客户端.
工程载入: 即把原来备份出来的数据再从客户端放入服务器(SQL)中.

注: 由于数据量不小,所以本人做过些尝试,虽功能实现了,但是太HAO资源.

要求: 效率,效率,还是效率!

--------------------------
我想这个问题高手们可能都有遇到过,您怎么解决的可否告之!
小弟不才,所以请您说的详细点儿,不盛感激! THS!!
...全文
138 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 2005-08-04
  • 打赏
  • 举报
回复
为什么要从SERVER备份到CLIENT?
winxkm 2005-08-04
  • 打赏
  • 举报
回复
procedure Tfrm_main.resotreToClentClick(Sender: TObject);
var
Conn:TADOConnection;
cmd:TADOCommand;
DataSet:TADODataSet;
cc:string;
begin
try
conn:=TADOConnection.Create(self);
cmd:=TADOCommand.Create(self);
DataSet:=TADODataSet.Create(self);
cmd.Connection:=conn;
conn.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source='+userinfo.GetLocalHostName;
conn.LoginPrompt:=false;
conn.Connected:=true;
with cmd do
begin
CommandText:='IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N''OFFICIAL'') CREATE DATABASE [OFFICIAL]';//self.RzMemo1.Text;
Execute;
end;
conn.Connected:=false;
conn.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=OFFICIAL;Data Source='+userinfo.GetLocalHostName;
conn.Connected:=True;

if not fileExists(ExtractFilePath(application.ExeName)+'DB_back\W'+FormatDateTime('yy-mm-dd',date)+'.bak') then
begin
MessageDlg('您今天没有完全备份数据库!请备份后使用该功能!',mtinformation,[MBOK],0);
exit;
end;

with cmd do
begin
DataSet.Connection:=conn;
DataSet.CommandText:='RESTORE FILELISTONLY FROM DISK = '''+ExtractFilePath(application.ExeName)+'DB_back\W'+FormatDateTime('yy-mm-dd',date)+'.bak'+'''';
DataSet.Active:=true;
CC:=ExtractFilePath(trim(DataSet.Fields[1].asstring));
if not DirectoryExists(CC) then
ForceDirectories(CC);
CommandText:='use master RESTORE DataBase Official FROM DISK = '''+ExtractFilePath(application.ExeName)+'DB_back\W'+FormatDateTime('yy-mm-dd',date)+'.bak'+'''';
execute;
end;
Conn.Close;
DataSet.Close;
DataSet.Free;
cmd.Free;
conn.Free;
MessageDlg('数据库被强制复制成功!',mtinformation,[MBOK],0);
except
on E:Exception do
begin
Conn.Close;
DataSet.Close;
DataSet.Free;
cmd.Free;
conn.Free;
MessageDlg('数据库被强制复制失败!',mtinformation,[MBOK],0);
end;
end;
end;
winxkm 2005-08-04
  • 打赏
  • 举报
回复
如果客户端有SQLServer的话!提供下列代码!
procedure Tfrm_main.backToClientClick(Sender: TObject);
var
Path:string;
begin
try
path:=ExtractFilePath(application.ExeName)+'DB_back\W'+FormatDateTime('yy-mm-dd',date)+'.bak';
with DM.cmd do
begin
CommandText:='BACKUP DATABASE official TO disk=''D:\official_001.bak''';
Execute;
end;
if not DirectoryExists(ExtractFilePath(application.ExeName)+'DB_back') then
CreateDir(ExtractFilePath(application.ExeName)+'DB_back');
userinfo.CreateDriver('Y:');
userinfo.NetFileCopy(path,'Y:\official_001.bak',self.RzProgressBar1);
DeleteFile('Y:\official_001.bak');
userinfo.DeleteDriver('Y:');
MessageDlg('数据库完全备份成功!',mtinformation,[MBOK],0);
except
On E:Exception do
begin
MessageDlg('数据库完全备份失败!'+e.message,mtinformation,[MBOK],0);
end;
end;
end;
上面使用的对象函数如下:
procedure TUserInfor.NetFileCopy(SourceFile,MoveToFile:string;P:TRzProgressBar);
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
AssignFile(FromF, MoveToFile);
Reset(FromF, 1); { Record size = 1 }

AssignFile(ToF,SourceFile); { Open output file }
Rewrite(ToF, 1); { Record size = 1 }

P.PartsComplete:=0;
P.TotalParts:=sizeof(FromF);
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
P.IncPartsByOne;
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
P.PartsComplete:=0;
end;
procedure TUserInfor.CreateDriver(DriverID: string);
var
NetSource:TNetResource;
B:dword;
begin
try
with NetSource do
begin
dwType:=RESOURCETYPE_ANY;
lpLocalName:=Pansichar(DriverID);
lpRemoteName:=Pchar('\\webserver\d$');
lpProvider:='';
end;

b:=WnetAddConnection2(netSource,Pchar('susuosoft'),Pchar('administrator'),CONNECT_UPDATE_PROFILE);
if not (b=NO_ERROR) then showmessage(SysErrorMessage(GetLastError));
except
// Exit;
ShowMessage('无法联接网络路径');
end;
end;

procedure TUserInfor.DeleteDriver(DriverID: string);
var
dwFlags: DWORD;
errCode: DWORD;
begin
dwFlags := CONNECT_UPDATE_PROFILE;
errCode := WNetCancelConnection2(PChar(DriverID), dwFlags, true);
if (errCode <> NO_ERROR) then
Application.MessageBox(PChar(SysErrorMessage(GetLastError)), '', MB_OK);
end;
备份完了之后在客户端恢复!:(未完待续!)
winxkm 2005-08-04
  • 打赏
  • 举报
回复
你的客户端有sQLserver吗?
FCU 2005-08-04
  • 打赏
  • 举报
回复
请问: clientdataset怎么用啊! 有例子么? 它可以让我把搜到的数据集一并插入到表中么?(而不用一条一条的插入到库中),谢谢!!
FCU 2005-08-04
  • 打赏
  • 举报
回复
to: winxkm(蹩脚的程序员),客户端没有SQL,十分谢谢您的热心!




我试图用ClientDataSet来解决问。,请问:


procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
ClientDataSet1.EnableControls;
ClientDataSet1.Close;
ClientDataSet1.SetProvider(DataSetProvider1); //连接一个表
ClientDataSet1.Open; //这时CDS中己有数据

ClientDataSet2.LoadFromFile('d:\xx.xml'); //导入已经创建好的XML文件
ClientDataSet1.AppendData(ClientDataSet2.Data,false); //记录已经成功追加(在GRID中可以看出)
ClientDataSet1.ApplyUpdates(0); //可是为什么提交不到表中呢!????
ClientDataSet1.DisableControls;

end;
Shiyl 2005-08-03
  • 打赏
  • 举报
回复
建议看看clientdataset的工作原理,可以学到点东东的,有些数据可以开始的时候去过去保存在客户端,后续操作可以直接对客户端保存的数据操作了。
LocustWei 2005-08-03
  • 打赏
  • 举报
回复
具体问题具体分析,一股方法:1、业务逻辑尽量在服务端实现,2、分解步骤
cumtbwxj 2005-08-03
  • 打赏
  • 举报
回复
关注先
Bluce4587 2005-08-03
  • 打赏
  • 举报
回复
可以做成胖客户端,在Client端保存一些数据,减少网络负载,同时提高了效率!
__Ray__ 2005-08-03
  • 打赏
  • 举报
回复
我做的软件是一个管理软件(C/S),服务器端: SQL-2000

客户端: 软件

C/S ????
hqhhh 2005-08-03
  • 打赏
  • 举报
回复
先关注
paranoia190 2005-08-03
  • 打赏
  • 举报
回复
帖代码看看呢~

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧