2,498
社区成员
发帖
与我相关
我的任务
分享
procedure DbOperateSinger(Singer:SingerInfo);
var
Conn:TADOConnection;
Rs:TADOQuery;
Pic:TMemoryStream;
begin
try
Coinitialize(nil);
Conn:=TADOConnection.Create(nil);
Rs:=TADOQuery.Create(nil);
Pic:=TMemoryStream.Create;
Conn.ConnectionString:=Connstr;
Conn.LoginPrompt:=False;
Conn.Open();
Rs.Connection:=Conn;
rs.SQL.Add('select * from Singer');
Rs.LockType:=ltOptimistic;
Rs.CursorType:=ctDynamic;
Rs.Open;
Rs.Insert;
Rs.FieldByName('名字').AsString:=Singer.sName;
//中间添加其他数据、略
Rs.FieldByName('Blog').AsString:=Singer.Blog;
//获得图像
Pic.Position:=0;//照片字段类型、我设置为OLE对象
TBlobField(Rs.FieldByName('照片')).LoadFromStream(Pic);
Rs.Post;
Rs.Close;
Conn.Close;
finally
Conn.Free;
Rs.Free;
Pic.Free;
CoUninitialize;
end;
end;
定义:
InsertLock: TRTLCriticalSection;
初始化:
InitializeCriticalSection(InsertLock);
不需要使用(不会再调用那个线程)的时候删除,
DeleteCriticalSection(InsertLock);
使用:
EnterCriticalSection(InsertLock);
try
// 执行判断或者插入的代码
finally
LeaveCriticalSection(InsertLock);
end;
procedure DbOperateSinger(Singer:SingerInfo);
var
Conn:TADOConnection;
Rs:TADOQuery;
Pic:TMemoryStream;
begin
try
Randomize;
while DbOpening do
Sleep(1000 + Random(2000));{直到其他线程调用的结束、退出循环}
DbOpening:=True;
Coinitialize(nil);
Conn:=TADOConnection.Create(nil);
Rs:=TADOQuery.Create(nil);
Pic:=TMemoryStream.Create;
Conn.ConnectionString:=Connstr;
Conn.LoginPrompt:=False;
Conn.Open();
Rs.Connection:=Conn;
rs.SQL.Add('select * from Singer');
Rs.LockType:=ltOptimistic;
Rs.CursorType:=ctDynamic;
Rs.Open;
Rs.Insert;
Rs.FieldByName('名字').AsString:=Singer.sName;
//中间添加其他数据、略
Rs.FieldByName('Blog').AsString:=Singer.Blog;
//获得图像
Pic.Position:=0;//照片字段类型、我设置为OLE对象
TBlobField(Rs.FieldByName('照片')).LoadFromStream(Pic);
Rs.Post;
Rs.Close;
Conn.Close;
finally
Conn.Free;
Rs.Free;
Pic.Free;
CoUninitialize;
DbOpening:=False;
end;
end;
{可是这样竟然还是只有第一条记录录入成功、那么是否就说明我这个函数有问题呢?}
unit Unit2;
interface
uses
Classes, SysUtils, Unit1,
ComCtrls,Windows;
type
TrdGetSinger = class(TThread)
private
{ Private declarations }
public
SingerID:string;
protected
procedure Execute; override;
end;
var
DbAdd:TRTLCriticalSection;
implementation
{ TrdGetSinger }
uses Unit3,Unit4,UnitFunctions;
procedure TrdGetSinger.Execute;
begin
try
{这个线程的FreeOnTerminate=True}
InitializeCriticalSection(DbAdd);
{中间处理数据、略}
EnterCriticalSection(DbAdd);
try
DbOperateSinger(NewThreadGetInfo.sInfo);{这个函数是添加记录的、就是我前面贴的函数}
finally
LeaveCriticalSection(DbAdd);
end;
finally
DeleteCriticalSection(DbAdd);
end;
end;
end.