■■■500元现金加分数求解决问题--delphi+libmysql.dll连接MySQL。■■■ (45分)

  • 主题发起人 主题发起人 swhl
  • 开始时间 开始时间
S

swhl

Unregistered / Unconfirmed
GUEST, unregistred user!
实现在delphi中不用BDE、ADO、ODBC只用libmysql.dll直接连接MySql,将一个表中(此表有blob字段)的数据复制到另一个相同结构的表中。
感兴趣的请与我联系:zsw@lgq.gov.cn
 
大把支持MySql+BLOB的PAS源码, 呵呵, 绝对可以.
 
有一个控件组可以解决这个问题的呀,不过我现在手头上没有资料,在单位了,明天帮你看看
 
简单撒,应该不复杂,用dbexpress
 
不用任何组件只用libmysql.dll。方法我知道,只是调试程序不过啊,已经折腾了两个星期了。
程序不是想像出来的,是调试出来来。
 
呵呵,
现在有好多控件,均能实现这个功能的呀
TMySQL : http://www.productivity.org/projects/tmysql/
 
控件是要花钱的!
 
不花钱的大把, 呵呵, 即使花钱的, 也未必要500大元啊, 呵呵,
 
希望有源程序!
 
用MySQLDAC到处有
 
用控件也都是用libmysql.dll的,那还不如直接用libmysql.dll还可以实现更多的功能,用起来更灵活一些!
而且访问的速度最最快啊!
没有人对此感兴趣,不想试试吗???
 
用MySQLDAC吧,我刚用它写了一个程序,这个控件是完全调用libmysql.dll的,
这个组件还带有源代码,你如果有决心的话,就慢慢研究(我打包票,你看不完就
会放弃,呵呵)。
 
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
因为做项目没有太多的时间研究,且不会用需注册的第三方控件的。
问题的难点在于:要把blob字段读出来生成sql语句再插入到另一库中。sql语句中不能
含有二进制数据需mysql_escape_string先进行转换。
用row:=mysql_fetch_row(presultsServer);返回查询结果
用row取blob字段时应其中包含二进制数据(如',等字符)而不能取得全部的字段内容。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 
var
AStream : TMemoryStream; // 全局变量


procedure TForm1.OpenData(ID: string);
var
ws : string;
begin
OpenMID := MID;
ws := 'select BlobField from Table1 where ID=' + '''' + ID + '''';
With ADODataSet1 do
begin
if active then
close;
CommandText := Ws;
Open;
if (TBlobField(FieldByName('BlobField')).isNull) then
exit;
TBlobField(FieldByName('BlobField')).SaveToStream(AStream);
Close;
end;
end;

procedure TForm1.SaveData(ID: string);
var
ws : string;
begin
OpenMID := MID;
ws := 'select BlobField from Table1 where ID=' + '''' + ID + '''';
With ADODataSet2 do
begin
if active then
close;
CommandText := Ws;
Open;
Edit;
AStream.Position := 0;
TBlobField(FieldByName('BlobField')).LoadFromStream(AStream);
Post;
Close;
end;
end;


使用AStream前先create: AStream := TMemoryStream.Create;
其他的你应该能看懂,有问题给我mail:nicklung@mail.sc.cninfo.net
 
用过libmysql.dll高手请帮忙, mysql_escape_string出错!
程序:
procedure TForm1.Button1Click(Sender: TObject);
type

PArrinteger=PMYSQL_LENGTHS;
var
presultsLocal: PMYSQL_RES; //results structure *pointer
presultsServer: PMYSQL_RES; //results structure *pointer
i, j,n: Integer; //Counter vars
query1,query2: String;
row :PMYSQL_ROW;
num_fields:integer;
pmyfield:PMYSQL_FIELD;
plengths:PArrinteger;
tempStr:pchar;
ttt:longword;
retval: Integer;

BinStream:TMemoryStream;
StrStream:TStringStream;
s: string;


begin
mysql_connect(@mysqlrecServer, '18.1.1.2', 'easyweb', 'easyweb');
mysql_connect(@mysqlrecLocal, 'localhost', 'easyweb', 'easyweb');
retval:= mysql_select_db(@mysqlrecServer, 'test');
retval:= mysql_select_db(@mysqlrecLocal, 'test');

BinStream:=TMemoryStream.Create;
StrStream := TStringStream.Create(s);


query1:= 'SELECT * FROM image order by id'; //Query text
presultsServer:= nil;
try

mysql_real_query(@mysqlrecServer, pchar(query1),Length(query1)); //Send Query to server
presultsServer:= mysql_store_result(@mysqlrecServer); //Store results locally
//num_fields:= mysql_num_fields(results_Server);


for i:= 0 to presultsServer.row_count-1 do begin
row:=mysql_fetch_row(presultsServer);

plengths:=PArrinteger(mysql_fetch_lengths(presultsServer));
BinStream.Clear;
BinStream.Write(row[4]^,plengths[4]);
BinStream.SaveToFile(row[1]);//保存到文件

BinStream.SaveToStream(StrStream);
StrStream.Seek(0, soFromBeginning);
ttt:= plengths[4];
mysql_escape_string(tempStr,pchar(StrStream.Datastring),StrStream.size);


query2:='insert into image(filename,filetype,filesize,filedata)values(''' + row[1] + ''',''' + row[2] + ''',''' + row[3] + ''',''' + StrStream.DataString + ''')';
mysql_real_query(@mysqlrecLocal,pchar(query2),length(query2));


end; // i

finally
BinStream.Free;
StrStream.Free;
//mysql_free_result(presultsLocal); //release the stored results from memory
mysql_free_result(presultsServer);
end;

end;

程序执行到mysql_escape_string时出错。
 
带特殊字符的字符串不要组成sql语句以字符串的方式传给数据库,不然会出错的,
直接post上去!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
875
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部