📄 ufunoasql.~pas
字号:
unit uFunOASQL;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 所有 SQL 尽在此处 生成 SQL 灵活的关键
* 复杂度 要自己控制 符林
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
interface
uses
SysUtils,Graphics,IniFiles,Messages,StdCtrls,Controls,ComCtrls,Forms,Windows,
Classes,FileCtrl,CheckLst,Registry,ExtCtrls,Mask,ShellApI,ShlObj,ComObj,Db;
{..............................................................................}
{***********************************函数定义***********************************}
{..............................................................................}
function FCreateInSertOneSQLA(arrFields:array of String; //字段列表
arrValues:array of String; //对应的值列表
arrNo:array of Integer; //字符的字段序号
sTableName:String):String; //表名
function FCreateInSertOneSQLB(arrFields:array of String; //字段列表
arrValues:array of String; //对应的值列表
arrNo:array of Integer; //字符的字段序号
sTableName:String):String; //表名
function FCreateInSertOneSQLC(DBDataSet:TDataSet;sTableName:String):String;
Function FUpdateOneSQLA(arrFieldAndValue:array of String;
arrFields:array of String;
arrValues:array of String;
arrNo:array of Integer;
sTableName:String):String;
Function FUpdateOneSQLB(arrFieldAndValue:array of String;
arrFields:array of String;
arrValues:array of String;
arrNo:array of Integer;
sTableName:String):String;
Function FTransactionSQL(sSQL:String):Boolean;
{..............................................................................}
{******************************************************************************}
{..............................................................................}
implementation
{..............................................................................}
uses
uFunSys,uDataOA;
{******************************************************************************}
{..............................................................................}
{*******************************************************************************
产生SQL语句,用于单条记录的插入
A: SQL Server
B: Orace
*******************************************************************************}
function FCreateInSertOneSQLA(arrFields:array of String; //字段列表
arrValues:array of String; //对应的值列表
arrNo:array of Integer; //字符的字段序号
sTableName:String):String; //表名
var
Str,Str1,Str2:string;
I,K:integer;
label AAA,BBB;
begin
if High(arrFields) <> High(arrValues) then begin
DlgWarningA('Call MySaveData CanShu Error');
Result:='';
Exit;
end;
Str1:= ' Insert Into '+sTableName+' ('+arrFields[0];
for i:=1 to High(arrFields) do begin
Str1:=Str1+','+arrFields[i];
end;
Str1:=Str1+')'+' Values (';
Str2:='';
for I:=0 to High(arrValues) do
begin
for K:=0 to High(arrNo) do //是否是时间 字段 是加 ‘’
begin
if I =arrNo[k] then goto AAA;
end;
if Trim(arrValues[i]) = '' then Str2:=Str2+'null'
else Str2:=Str2+arrValues[i];
GoTo BBB;
AAA:
if Trim(arrValues[i]) = '' then Str2:=Str2+'null'
else Str2:=Str2+''''+arrValues[I]+'''';
BBB:
if I <> High(arrValues) then Str2:=Str2+',';
end;
Str:=Str1+Str2+')';
Result:=Str;
end;
function FCreateInSertOneSQLB(arrFields:array of String; //字段列表
arrValues:array of String; //对应的值列表
arrNo:array of Integer; //字符的字段序号
sTableName:String):String; //表名
begin
Result:=FCreateInSertOneSQLA(arrFields,arrValues,arrNo,sTableName)+';';
end;
{*************************************************************************
* 用于更改单条的记录;
*************************************************************************}
Function FUpdateOneSQLA(arrFieldAndValue:array of String;
//长度必有2 1 为关键字段 2 关键字段的值 取是字符型
arrFields:array of String;//字段列表
arrValues:array of String;//字段的值列表
arrNo:array of Integer; //时字符列
sTableName:String):String;//字符;
var
Str,Str1:string;
I,K:integer;
label AAA,BBB;
begin
Str1:=' Update '+ sTableName+' Set ';
Str:='';
for I:=0 to High(arrFields) do
begin
Str:=Str+arrFields[I]+' = ';
for k:=0 to High(arrNo) do //是否是字符 字段 是加 ‘’
begin
if I =arrNo[k] then goto AAA;
end;
if Trim(arrValues[i]) = '' then Str:=Str+'null'
else Str:=Str+arrValues[i];
goto BBB;
AAA:
if Trim(arrValues[i]) = '' then Str:=Str+'null'
else Str:=Str+''''+arrValues[i]+'''';
BBB:
if I <> High(arrValues) then Str:=Str+',';
end;
Str:=Str1+Str+' Where '+arrFieldAndValue[0]
+ ' = '+''''+arrFieldAndValue[1]+'''';
ReSult:=Str;
end;
Function FUpdateOneSQLB(arrFieldAndValue:array of String;
//长度必有2 1 为关键字段 2 关键字段的值 取是字符型
arrFields:array of String;//字段列表
arrValues:array of String;//字段的值列表
arrNo:array of Integer; //时字符列
sTableName:String):String;//字符;
begin
Result:=FUpdateOneSQLA(arrFieldAndValue,arrFields,arrValues,arrNo,sTableName)+';'
end;
{*************************************************************************
* 用于事务 一次执行多条SQL语句 查看事务是否执行 或 回滚
* FZID 可以解决多用户冲突 控件 StoredProc 总不稳定
*oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 主键重复 没有语法错误 Oracle 已经测试过了 看来 这个想法是好的
* 原来想通过 存储过程 动态执行SQL 不过应该比这样快不了多少
* 这样慢的关键就是 附加的查询慢了些 在频繁写入数据的表中不
* 应该建立索引和 主键 20030411 fulin
*************************************************************************}
Function FTransactionSQL(sSQL:String):Boolean;
var
sMainSQL,sFZID:String;
begin
sFZID:=GetFZID10();
if bSYSDBORCorSQL then
sMainSQL:=sStoreProcForSQLServerBeginTran
+sSQL+' '
+sStoreProcForSQLServerEndTran
else
sMainSQL:='Begin '
+sSQL+
' Insert Into TSY60000_Transaction (FZID,CFZID) Values('
+''''+sFZID+''''+','+''''+sSYSUserFZID+''''+')'+';'+
' Commit; Exception When Others Then RollBack; End;';
//DM.CDSSys.Close;
//DM.CDSSys.CommandText:=sMainSQL;
//DeBebugSpy(nil,'FTransactionSQL',sMainSQL);
try
//DM.CDSSys.Execute;
Except
Result:=False;
DlgWarningA('保存数据没有成功,可能是主键重复');
Exit;
end;
{** 20030526 测试结果 SQL 语句主见 重复 是上面的的语法报错*****
** 测试的是 SQL Server 数据库***Oracle 有待测试**********符林}
if bSYSDBORCorSQL then begin
Result:=True;
Exit;
end;
{ooooooooooooooooooo检查是否回滚ooooooooooooooooooooo}
{******************以最快的速度查询出来**************}
if bSYSDBORCorSQL then
sMainSQL:='Select Top 1 * from TSY60000_Transaction where FZID ='
+''''+sFZID+'''';
if not bSYSDBORCorSQL then
sMainSQL:='Select * from TSY60000_Transaction where FZID ='
+''''+sFZID+'''' +' And rownum <= 1 ';
//DM.CDSSys.Close;
//DM.CDSSys.CommandText:=sMainSQL;
//DeBebugSpy(nil,'FTransactionSQL',sMainSQL);
//DM.CDSSys.Open;
//if DM.CDSSys.RecordCount <= 0 then begin
Result:=False;
//DlgWarningA('数据库冲突,可能是主键重复');
//end else
Result:=True;
end;
{******************************************************************************
* 在华南的办法 是个很简单的办法
* 感应控件来做界面 提交还是SQL
..............................................................................
* 一个精纯的感悟 看来平淡的东西只有能动脑壳
* 就能创新意 出奇迹
* 尽在大胆的想象中
..............................................................................
* 图像字段 有代研究
******************************************************************************}
function FCreateInSertOneSQLC(DBDataSet:TDataSet;sTableName:String):String;//表名
var
I,K:Integer;
saFieldName,saFieldValue:array of String;
iaFieldStr:array of Integer;
Str:String;
FT:TFieldType;
begin
Result:='';
K:=DBDataSet.FieldCount;
SetLength(saFieldName,K);
SetLength(saFieldValue,K);
SetLength(iaFieldStr,K);
for I:=0 to K - 1 do begin
Str:=DBDataSet.Fields[I].FieldName;
saFieldName[I]:=Str;
saFieldValue[I]:=Trim(DBDataSet.FieldByName(Str).AsString);
iaFieldStr[I]:=-1;
FT:=DBDataSet.Fields[I].DataType;
{***只有字符 没有时间 数据库不能有时间字段出现***}
if (FT = ftMemo) or (FT = ftWideString) or (FT = ftString) or (FT = ftFmtMemo) then
iaFieldStr[I]:=I;
end;
{********利用已有的资源 是效率的关键 做事的要领************}
Result:=FCreateInSertOneSQLA(saFieldName,saFieldValue,iaFieldStr,sTableName);
end;
{******************************************************************************}
{*********************************End******************************************}
{******************************************************************************}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -