2,497
社区成员
发帖
与我相关
我的任务
分享
unit fmDataModule;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
MidasLib, System.SyncObjs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.ERROR,
FireDAC.UI.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, duTypes, FireDAC.Stan.Async,
Data.DBXCommon, FireDAC.Phys, FireDAC.VCLUI.Wait, Data.DB, FireDAC.Comp.Client,
Data.SqlExpr, Data.DBXMySQL, Data.DBXMSSQL, Data.FMTBcd, Datasnap.DBClient,
Datasnap.Provider, FireDAC.Phys.MSSQLDef, FireDAC.Phys.ODBCBase, FireDAC.Phys.MSSQL,
FireDAC.Phys.Intf, FireDAC.ConsoleUI.Wait, FireDAC.Stan.Param, FireDAC.DatS,
FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Phys.MySQLDef, FireDAC.Phys.MySQL,
FireDAC.Comp.DataSet;
type
TLockMySQLDataModule = class(TDataModule)
FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink;
FDManager1: TFDManager;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
oParams: TStringList;
protected
{ Private declarations }
public
function GetDate(ASql: string; AClientDataSet: TClientDataSet; var AErrStr: string): Boolean;
function ExecSQL(ASql: string; var AErrStr: string): Boolean;
function ExecSqlList(ASqlList: TStrings; var AErrStr: string): Boolean;
function DBConnectedTest(var AErrStr: string): Boolean;
procedure WriteHttpLog(Aurl, AContent, ARemoteIP, AErrMsg: string);
procedure WriteTCPLog(Aurl, AContent, ARemoteIP, AErrMsg: string);
end;
var
G_DataModule: TLockMySQLDataModule;
implementation
{%CLASSGROUP 'System.Classes.TPersistent'}
{$R *.dfm}
uses
duGlob, duTConfigClass;
procedure TLockMySQLDataModule.WriteHttpLog(Aurl, AContent, ARemoteIP, AErrMsg: string);
var
ASql: string;
AErrStr: string;
begin
if Length(AErrMsg) > 200 then
AErrMsg := Copy(AErrMsg, 1, 200);
ASql := 'insert into httpErrList (' + 'url,content,errMsg,remoteIP,serverIP,createTime' + ')' + ' values(' + QuotedStr(Aurl) + ',' + QuotedStr(AContent) + ',' + QuotedStr(AErrMsg) + ',' + QuotedStr(ARemoteIP) + ',' + QuotedStr(G_ConfigClass.LocalIP) + ',' + QuotedStr(FormatDateTime('YYYY-MM-DD HH:MM:SS', Now)) + ')';
if not G_DataModule.ExecSQL(ASql, AErrStr) then
begin
WriteStr('写入数据库日志失败:' + ASql);
WriteStr('写入数据库失败原因:' + AErrStr);
end;
end;
procedure TLockMySQLDataModule.WriteTCPLog(Aurl, AContent, ARemoteIP, AErrMsg: string);
var
ASql: string;
AErrStr: string;
begin
if Length(AErrMsg) > 200 then
AErrMsg := Copy(AErrMsg, 1, 200);
ASql := 'insert into tcpErrList (' + 'url,content,errMsg,remoteIP,serverIP,createTime' + ')' + ' values(' + QuotedStr(Aurl) + ',' + QuotedStr(AContent) + ',' + QuotedStr(AErrMsg) + ',' + QuotedStr(ARemoteIP) + ',' + QuotedStr(G_ConfigClass.LocalIP) + ',' + QuotedStr(FormatDateTime('YYYY-MM-DD HH:MM:SS', Now)) + ')';
if not G_DataModule.ExecSQL(ASql, AErrStr) then
begin
WriteStr('写入数据库日志失败:' + ASql);
WriteStr('写入数据库失败原因:' + AErrStr);
end;
end;
procedure TLockMySQLDataModule.DataModuleCreate(Sender: TObject);
begin
// FDConnection1.LoginPrompt := False;
// FDGUIxWaitCursor1.Provider := 'Console'; // 此属性的值必须是控制台
FDPhysMySQLDriverLink1.VendorLib := 'libmysql.dll'; // MYSQL FOR WINDOWS驱动
//*****初始化*****
oParams := TStringList.Create;
//********* 连接池
oParams.Add('DriverID=MySQL');
oParams.Add('CharacterSet=utf8');
oParams.Add('Server=' + G_ConfigClass.DBHost);
oParams.Add('Port=' + G_ConfigClass.DBPort);
oParams.Add('Database=btlock');
oParams.Add('User_Name=' + G_ConfigClass.DBUser);
oParams.Add('Password=' + G_ConfigClass.DBPass);
// 毫秒
oParams.Add('POOL_CleanupTimeout=36000');
// 毫秒
oParams.Add('POOL_ExpireTimeout=600000');
//最多连接数
oParams.Add('POOL_MaximumItems=500');
oParams.Add('Pooled=True');
// //*******
FDManager1.Close;
FDManager1.AddConnectionDef('MySQL_Pooled', 'MySQL', oParams);
FDManager1.Active := True;
end;
procedure TLockMySQLDataModule.DataModuleDestroy(Sender: TObject);
begin
oParams.Free;
end;
function TLockMySQLDataModule.DBConnectedTest(var AErrStr: string): Boolean;
var
AConn: TFDConnection;
begin
Result := False;
// FSQLConnection.DriverName := 'MySQL';
// with FSQLConnection.Params do
// begin
// Clear();
// // Add('DriverUnit=Data.DBXMySQL');
// // Add('DriverPackageLoader=TDBXDynalinkDriverLoader,DbxCommonDriver240.bpl');
// // Add('DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxCommonDriver,Version=18.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b');
// // Add('MetaDataPackageLoader=TDBXMySqlMetaDataCommandFactory,DbxMySQLDriver240.bpl');
// // Add('MetaDataAssemblyLoader=Borland.Data.TDBXMySqlMetaDataCommandFactory,Borland.Data.DbxMySQLDriver,Version=18.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b');
// // Add('GetDriverFunc=getSQLDriverMYSQL');
// // Add('LibraryName=dbxmys.dll');
// // Add('LibraryNameOsx=libsqlmys.dylib');
// // Add('VendorLib=LIBMYSQL.dll');
// Add('VendorLibWin64=libmysql.dll');
// // Add('VendorLibWin64='+ExtractFilePath(Application.ExeName) + 'libmysql.dll');
// Add('VendorLibOsx=libmysqlclient.dylib');
// Add('HostName=' + G_ConfigClass.DBHost);
// Add('Port=' + G_ConfigClass.DBPort);
// Add('Database=' + 'lock');
// Add('User_Name=' + G_ConfigClass.DBUser);
// Add('Password=' + G_ConfigClass.DBPass);
// Add('MaxBlobSize=-1');
// Add('LocaleCode=0000');
// Add('Compressed=False');
// Add('Encrypted=False');
// Add('BlobSize=-1');
// Add('ErrorResourceFile=');
// Add('ServerCharSet=' + 'utf8');
// end;
AConn := TFDConnection.Create(nil);
AConn.ConnectionDefName := 'MySQL_Pooled';
try
try
AConn.Connected := True;
Result := AConn.Connected;
except
on e: Exception do
begin
AErrStr := e.Message;
Result := False;
end;
end;
finally
AConn.Free;
end;
end;
function TLockMySQLDataModule.GetDate(ASql: string; AClientDataSet: TClientDataSet; var AErrStr: string): Boolean;
var
AStart: DWORD;
AQuery: TFDQuery;
AConn: TFDConnection;
ADataSetProvider: TDataSetProvider;
begin
AStart := GetTickCount;
AConn := TFDConnection.Create(nil);
AConn.ConnectionDefName := 'MySQL_Pooled';
AQuery := TFDQuery.Create(nil);
ADataSetProvider := TDataSetProvider.Create(nil);
ADataSetProvider.DataSet := AQuery;
AQuery.Connection := AConn;
AClientDataSet.Active := False;
AClientDataSet.SetProvider(ADataSetProvider);
try
try
AConn.Connected := True;
if not AConn.Connected then
begin
AErrStr := '数据库连接失败!';
Exit;
end;
except
AErrStr := '数据库连接失败,原因:' + AErrStr;
Result := False;
Exit;
end;
try
AQuery.SQL.Add(ASql);
AClientDataSet.Active := True;
Result := True;
except
on e: Exception do
begin
AErrStr := e.Message;
Result := False;
end;
end;
finally
ADataSetProvider.Free;
AQuery.Free;
AConn.free;
end;
//WriteStr('SQL=' + ASql + '耗时=' + IntToStr(GetTickCount - AStart));
end;
function TLockMySQLDataModule.ExecSqlList(ASqlList: TStrings; var AErrStr: string): Boolean;
var
AStart: DWORD;
AQuery: TFDQuery;
AConn: TFDConnection;
ATran: TFDTransaction;
begin
AStart := GetTickCount;
AConn := TFDConnection.Create(nil);
AConn.ConnectionDefName := 'MySQL_Pooled';
ATran := TFDTransaction.Create(nil);
AConn.Transaction := ATran;
AQuery := TFDQuery.Create(nil);
AQuery.Connection := AConn;
try
try
AConn.Connected := True;
if not AConn.Connected then
begin
AErrStr := '数据库连接失败!';
Exit;
end;
except
AErrStr := '数据库连接失败,原因:' + AErrStr;
Result := False;
Exit;
end;
AConn.StartTransaction;
try
AQuery.SQL.Text := ASqlList.Text;
AQuery.ExecSQL;
AConn.Commit;
Result := True;
except
on e: Exception do
begin
AConn.Rollback;
AErrStr := e.Message;
Result := False;
end;
end;
finally
ATran.Free;
AQuery.Free;
AConn.free;
end;
// WriteStr('SQL=' + ASqlList.Text + '耗时=' + IntToStr(GetTickCount - AStart));
end;
function TLockMySQLDataModule.ExecSQL(ASql: string; var AErrStr: string): Boolean;
var
ASqlList: TStringList;
begin
ASqlList := TStringList.Create;
ASqlList.Add(ASql);
try
Result := ExecSqlList(ASqlList, AErrStr);
finally
ASqlList.Free;
end;
end;
initialization
finalization
G_DataModule.Free;
end.