⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufunoasql.pas

📁 一个会议签到系统
💻 PAS
字号:
{$WARN SYMBOL_PLATFORM OFF}
{$WARN UNIT_PLATFORM OFF}
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 + -