基于MIDAS的系统的数据库更新问题——解决马上给分 客户端用ACCESS,服务器用SQL Server。客户端需要时常更新数据库,即从远程服务器端下载几个新的数据库表到本地ACCESS(将旧表删除)。 客户端用的组件为SocketConnection、ClientDataSet。 如何有效地进行数据库的更新? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没人回答?我用下面的方法从服务器端导入access一个表,结果告诉我ODBC--调用失败ADOConnection1.Execute('SELECT * into CheckRule from a in [ODBC][ODBC; Driver = SQL Server;UID = sa;PWD =;Server = 192.168.0.45; DataBase = SBXT; ]'); 简单的办法就是客户端程序启动的时候,在启动画面的时候表示开始更新数据库把服务器端要更新过来的表记录保存为文件发送到客户端,客户端先删除old记录,然后load文件,再保存 你服务器端的要导过来的表用query打开,可以savetofile的,传到客户端的时候,等删除了原来表里面的数据后,再用loadfromfile出数据,然后保存起来不行吗 或者在服务器端根据数据就直接导出的文件为insert into table.. values...这样的语句为文本文件,客户端接收后直接将该文件内容放到query的sql里面,执行就可以了 没成功是指哪一块没成功????大概写一下吧,不过没有在delphi环境中试,参考吧方法一: (直接构建SQL ,到客户端执行即可)server :var ss : string; stringlist :Tstringlist;adoquery.close;adoquery.sql.text := 'select *From table'; //你要同步的表adoquery.open;if adoquery.recordcount > 0 thenbegin stringlist := TStringlist.create; try adoquery.first; while not adoquery.eof do begin ss := 'insert into table(...) values('+ adoquery.fieldbyname('...').asstring +...全部字段 +') '; stringlist.add(ss); adoquery.next; end; stringlist.savetofile('aaa.txt'); //存为aaa.txt文本文件,压缩随你 // 然后在将该文件传到客户端,用stringlist.loadfromfile出来 //客户端用一个adoquery.sql.text := stringlist.text,然后adoquery.execsql就将所有数据保存起来了 finally stringlist.free; end;end;方法二:直接在服务器端adoquery.close;adoquery.sql.text := 'select *From table';adoquery.open;adoquery.savetofile(...) //不记得该控件是否有savetofile和loadfromfile方法,好像adodataset有这个功能,自己看,用有这个功能的传到客户端后,客户端用adoquery.loadfromfile 然后再用一个adoquery来查询客户端的表,用过上面的这个循环给下面的这个插入即可 有没有方法直接连接远程服务器端的SQL Server数据库,然后将表导入到本地ACCESS?因为我要导入好几个表,而且有些表和表的字段都是不确定的 ADOConnection1.Execute('SELECT * into CheckRule from a in [ODBC][ODBC; Driver = SQL Server;UID = sa;PWD =;Server = 192.168.0.45; DataBase = SBXT; ]');我现在是想用类似上面的语句一句搞定的,不想用手动建表的方法.实在不行才用那样的办法.没答案只能这样了 遇到Image类型的字段该怎么做?其他类型的已经解决 text类型用备注类型字段image的话,转换为流(可通过内存流转换为字符流),字符流有个datastring属性(大概,记不清了),字段还是用备注类型,存下datastring(是字符串),到时候再反过来显示(没试过,不知道行不行) 你回答问题前先试试好不好?这样转换成datastring还是乱码,没起到作用。 唉,你想想好吧,是image类型的,你转换成乱码保存在数据库怎么不行?? 乱码和你有什么关系????你读取的时候只要不是用dbimage控件,而是再用流读取并转换就可以了,又不是让用户直接看这个数据库里面的记录,再说你看SQL SERVER,你在查询分析器中用sql语句查询难道能显示图片?? 只不过dbimage控件自己转换了而已 在查询分析器中用select语句的时候Image显示的是一串16进制数,并非乱码。而且乱码的化生成的Insert语句在客户端运行报错。 uses encddecdtype TForm1 = class(TForm) Button1: TButton; Image1: TImage; Memo1: TMemo; Button2: TButton; Button3: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);begin close;end;procedure TForm1.Button1Click(Sender: TObject);var ss : String; MeoStream : TMemoryStream; strStream : TStringStream;begin MeoStream := TMemoryStream.Create; strStream := TStringStream.Create(''); try // Image1.Picture.Bitmap.SaveToStream(MeoStream); MeoStream.LoadFromFile('E:\Working\ico\res\系统设置.bmp'); MeoStream.SaveToStream(strStream); Memo1.Text := EncodeString(strStream.DataString); finally MeoStream.Free; strStream.Free; end;end;procedure TForm1.Button3Click(Sender: TObject);var strstream : TStringStream;begin strstream := TStringStream.Create(DecodeString(Memo1.Text)); try Image1.Picture.Bitmap.LoadFromStream(strstream); finally strstream.Free; end;end;测试通过 uses encddecd使用encodestring()再保存到数据库因为乱码里面有' ',容易出现问题,所以使用的时候再decodestring() 问题是用了decodestring,insert语句还是没法运行。你就告诉我Image类型的字段该怎么用Insert语句插入,.我要在服务器端生成Insert语句,然后客户端运行. 我以前是用TSocketConnetion客户端不传Sql语句了直接调用中间层COM+方法传入Ole变体参数,执行成功后或得数据集直接赋给ClientDataSet.date,那么就可以直接当数据集遍历了。 procedure TForm1.Button1Click(Sender: TObject);var ss : String; MeoStream : TMemoryStream; strStream : TStringStream;begin MeoStream := TMemoryStream.Create; strStream := TStringStream.Create(''); try MeoStream.LoadFromFile('E:\Working\ico\res\系统设置.bmp'); MeoStream.SaveToStream(strStream); Memo1.Text := EncodeString(strStream.DataString); sql := 'insert into tables(fName,fImage) values('+QuotedStr('aaa')+','+QuotedStr(memo1.Text)+')'; memo2.Text := sql; finally MeoStream.Free; strStream.Free; end;end;procedure TForm1.btnCloseClick(Sender: TObject);begin Close;end;procedure TForm1.btnsaveClick(Sender: TObject);begin if trim(sql) <> '' then begin qryMain.Close; qryMain.SQL.Text := sql; qryMain.ExecSQL; showmessage('OK'); end;end;测试,可以保存 终于解决了,谢谢,我有个地方写错了.以后得多向你学习了,我接触Delphi不是太长. 求一递归创建菜单的算法 关于串口发送数据的问题,郁闷啊~~~~~ 请问怎样将一个TADODATASET对象复制给另外一个TADODATASET对象 怎样建立在delphi 下建立 ado的stream对象 dbgrid的列怎样显示成这种形式? 关于RadioGroup自动保存上次设置的值:是BUG吗?怎样解决 停靠窗口的浮动状态 在三层结构中动态创建(删除)表为什么会出错?帮看一下呀!!! 关于硬件接口编程问题 请问谁对在DELPHI多线程比较熟悉,我有一个非常非常简单的问题。 远程数据库中Image类型字段的导入问题 想学console编程,请大家给点资料,谢谢
我用下面的方法从服务器端导入access一个表,结果告诉我ODBC--调用失败
ADOConnection1.Execute('SELECT * into CheckRule from a in [ODBC][ODBC; Driver = SQL Server;UID = sa;PWD =;Server = 192.168.0.45; DataBase = SBXT; ]');
把服务器端要更新过来的表记录保存为文件发送到客户端,客户端先删除old记录,然后load文件,再保存
传到客户端的时候,等删除了原来表里面的数据后,再用loadfromfile出数据,然后保存起来不行吗
方法一: (直接构建SQL ,到客户端执行即可)
server :
var ss : string; stringlist :Tstringlist;adoquery.close;
adoquery.sql.text := 'select *From table'; //你要同步的表
adoquery.open;
if adoquery.recordcount > 0 then
begin
stringlist := TStringlist.create;
try
adoquery.first;
while not adoquery.eof do
begin
ss := 'insert into table(...) values('+ adoquery.fieldbyname('...').asstring +...全部字段 +') ';
stringlist.add(ss);
adoquery.next;
end; stringlist.savetofile('aaa.txt'); //存为aaa.txt文本文件,压缩随你
// 然后在将该文件传到客户端,用stringlist.loadfromfile出来
//客户端用一个adoquery.sql.text := stringlist.text,然后adoquery.execsql就将所有数据保存起来了
finally
stringlist.free;
end;
end;方法二:
直接在服务器端
adoquery.close;
adoquery.sql.text := 'select *From table';
adoquery.open;
adoquery.savetofile(...) //不记得该控件是否有savetofile和loadfromfile方法,好像adodataset有这个功能,自己看,用有这个功能的
传到客户端后,客户端用adoquery.loadfromfile
然后再用一个adoquery来查询客户端的表,用过上面的这个循环给下面的这个插入即可
因为我要导入好几个表,而且有些表和表的字段都是不确定的
我现在是想用类似上面的语句一句搞定的,不想用手动建表的方法.实在不行才用那样的办法.
没答案只能这样了
image的话,转换为流(可通过内存流转换为字符流),字符流有个datastring属性(大概,记不清了),字段还是用备注类型,存下datastring(是字符串),到时候再反过来显示(没试过,不知道行不行)
你读取的时候只要不是用dbimage控件,而是再用流读取并转换就可以了,又不是让用户直接看这个数据库里面的记录,再说你看SQL SERVER,你在查询分析器中用sql语句查询难道能显示图片?? 只不过dbimage控件自己转换了而已
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;procedure TForm1.Button1Click(Sender: TObject);
var
ss : String;
MeoStream : TMemoryStream;
strStream : TStringStream;
begin
MeoStream := TMemoryStream.Create;
strStream := TStringStream.Create('');
try
// Image1.Picture.Bitmap.SaveToStream(MeoStream);
MeoStream.LoadFromFile('E:\Working\ico\res\系统设置.bmp');
MeoStream.SaveToStream(strStream);
Memo1.Text := EncodeString(strStream.DataString);
finally
MeoStream.Free;
strStream.Free;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
var
strstream : TStringStream;
begin
strstream := TStringStream.Create(DecodeString(Memo1.Text));
try
Image1.Picture.Bitmap.LoadFromStream(strstream);
finally
strstream.Free;
end;end;
测试通过
因为乱码里面有' ',容易出现问题,所以使用的时候再decodestring()
你就告诉我Image类型的字段该怎么用Insert语句插入,.我要在服务器端生成Insert语句,然后客户端运行.
客户端不传Sql语句了
直接调用中间层COM+方法
传入Ole变体参数,执行成功后或得数据集
直接赋给ClientDataSet.date,
那么就可以直接当数据集遍历了。
var
ss : String;
MeoStream : TMemoryStream;
strStream : TStringStream;
begin
MeoStream := TMemoryStream.Create;
strStream := TStringStream.Create('');
try
MeoStream.LoadFromFile('E:\Working\ico\res\系统设置.bmp');
MeoStream.SaveToStream(strStream);
Memo1.Text := EncodeString(strStream.DataString); sql := 'insert into tables(fName,fImage) values('+QuotedStr('aaa')+','+QuotedStr(memo1.Text)+')';
memo2.Text := sql;
finally
MeoStream.Free;
strStream.Free;
end;
end;procedure TForm1.btnCloseClick(Sender: TObject);
begin
Close;
end;procedure TForm1.btnsaveClick(Sender: TObject);
begin
if trim(sql) <> '' then
begin
qryMain.Close;
qryMain.SQL.Text := sql;
qryMain.ExecSQL;
showmessage('OK');
end;
end;
测试,可以保存
以后得多向你学习了,我接触Delphi不是太长.