Delphi中使用原生ADO控制数据库

时间:2010-01-27 16:32:20  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:只是希望能对大家有所帮助。当然,这帖子也是原生的,不是转贴的。一、优点1、大家知道 Delphi 对 ADO 接口进行了一番包装后形成了 ADOExpress,我想 Borland 的主要目的还是想与自己的数据敏感控件相连。然而事实上数据敏感控件并不是那么耀眼,如果你希望编出来的程序稍微有点水准的话就别用那玩意;如果你很少使用数据敏感控件,那么 ADOExpress 基础上失去了其应有...
  正文:我发现很多朋友在开发数据库时都使用 Delphi 自带的 ADO 组件 或 Diamond ADO,其实在 Delphi 中使用原生 ADO 接口也是十分方便和有效的。我使用原生 ADO 开发项目已有很长一段时间,也回答过一些朋友类似的问题,现在把自己的一点心得与大家分享,班门弄斧,只是希望能对大家有所帮助。当然,这帖子也是原生的,不是转贴的。

一、优点
1、大家知道 Delphi 对 ADO 接口进行了一番包装后形成了 ADOExpress,我想 Borland 的主要目的还是想与自己的数据敏感控件相连。然而事实上数据敏感控件并不是那么耀眼,如果你希望编出来的程序稍微有点水准的话就别用那玩意;如果你很少使用数据敏感控件,那么 ADOExpress 基础上失去了其应有的作用,无数冗余的属性、虚方法,不管你用不用得到一股脑给你编译进去,也会使你的程序再大上 200K;效率么,不说了。
2、MSDN 和 vb 中的例子你可以搬过来就用。
3、关于代码重用:我给大家的例子都是以函数或过程形式,重用性不好么?
4、别说帖子太长,那你看看 DB.pas, ADODB.pas 多长?

二、基础储备
1、一些必须的单元


uses
Variants, ComObj;

2、一些基础常数(其它查 ADODB2000.pas):


const
adOpenDynamic = $00000002;
adOpenStatic = $00000003;

adLockOptimistic = $00000003;
adLockBatchOptimistic = $00000004;

adStateClosed = $00000000;
adStateOpen = $00000001;
adStateConnecting = $00000002;
adStateExecuting = $00000004;
adStateFetching = $00000008;

adUseServer = $00000002;
adUseClient = $00000003;

adModeReadWrite = $00000003;

adXactCursorStability = $00001000;

adCmdText = $00000001;
adCmdTable = $00000002;
adCmdStoredProc = $00000004;
adCmdFile = $00000100;

adAffectCurrent = $00000001;
adAffectGroup = $00000002;
adAffectAll = $00000003;
adAffectAllChapters = $00000004;

3、一些基础函数和过程


//创建 Connection 对象
function CreateConnection: OleVariant;
//释放 Connection 对象;cnn 为 Connection 对象
procedure FreeConnection(var cnn: OleVariant);
//创建 Recordset 对象
function CreateRecordset: OleVariant;
//释放 Recordset 对象;rst 为 Recordset 对象
procedure FreeRecordset(var rst: OleVariant);
//创建 Command 对象
function CreateCommand: OleVariant;
//释放 Command 对象;cmd 为 Command 对象
procedure FreeCommand(var cmd: OleVariant);
//用 Connection 连接到 SQLServer 数据库;cnn 为 Connection 对象,db 数据库名,host 主机名,usr 用户名,pwd 密码
function ConnectToDB(cnn: OleVariant; const db, host, usr, pwd: string): Boolean;
//执行 SQL 语句,有返回行,无事务处理;cnn 为 Connection 对象,rst 为 Recordset 对象,sql 为 SQL 语句(可以是存储过程)
function ExecSQL(cnn, rst: OleVariant; const sql: string): Boolean;
//执行 SQL 语句,无返回行,有事务处理;cnn 为 Connection 对象,cmd 为 Command 对象,sql 为 SQL 语句(可以是存储过程)
function ExecSQLA(cnn, cmd: OleVariant; const sql: string): Boolean;

function CreateConnection: OleVariant;
begin
  try
    Result := CreateOleObject('ADODB.Connection');
    Result.CursorLocation := adUseServer;
    Result.IsolationLevel := adXactCursorStability;
    Result.Mode := adModeReadWrite;
    Result.Provider := 'SQLOLEDB.1';
    except
      if not VarIsEmpty(Result) then Result := Unassigned;
    end;
  end;
  
  procedure FreeConnection(var cnn: OleVariant);
  begin
    if not VarIsEmpty(cnn) then
    begin
      if cnn.State <> adStateClosed then cnn.Close;
      cnn := Unassigned;
    end;
  end;
  
  function CreateRecordset: OleVariant;
  begin
    try
      Result := CreateOleObject('ADODB.Recordset');
      Result.CacheSize := 1000;
      Result.CursorType := adOpenStatic;
      Result.CursorLocation := adUseServer;
      Result.LockType := adLockOptimistic;
      except
        if not VarIsEmpty(Result) then Result := Unassigned;
      end;
    end;
    
    procedure FreeRecordset(var rst: OleVariant);
    begin
      FreeConnection(rst);
    end;
    
    function CreateCommand: OleVariant;
    begin
      try
        Result := CreateOleObject('ADODB.Command');
        Result.CommandType := adCmdText;
        Result.CommandTimeout := 5;
        except
          if not VarIsEmpty(Result) then Result := Unassigned;
        end;
      end;
      
      procedure FreeCommand(var cmd: OleVariant);
      begin
        if not VarIsEmpty(cmd) then cmd := Unassigned;
      end;
      
      function ConnectToDB(cnn: OleVariant; const db, host, usr, pwd: string): Boolean;
      begin
        Result := not VarIsEmpty(cnn);
        if Result then
        begin
          if cnn.State <> adStateClosed then cnn.Close;
          cnn.ConnectionString :=
          'Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog=' +
          db + ';Data Source=' + host + ';Connect Timeout=5;' +
          'Use Procedure for Prepare=1';
          try
            cnn.Open(cnn.ConnectionString, usr, pwd, -1);
            except
              Result := False;
            end;
          end;
        end;
        
        function ExecSQL(cnn, rst: OleVariant; const sql: string): Boolean;
        begin
          Result := not (VarIsEmpty(cnn) or VarIsEmpty(rst)) and (cnn.State = adStateOpen);
          if Result then
          begin
            if rst.State <> adStateClosed then rst.Close;
            try
              rst.Open(sql, cnn, adOpenStatic, adLockOptimistic, adCmdText);
              except
                Result := False;
              end;
            end;
          end;
          
          function ExecSQLA(cnn, cmd: OleVariant; const sql: string): Boolean;
          begin
            Result := not (VarIsEmpty(cnn) or VarIsEmpty(cmd)) and (cnn.State = adStateOpen);
            if Result then
            begin
              cnn.BeginTrans;
              try
                cmd.ActiveConnection := cnn;
                cmd.CommandText := sql;
                cmd.Prepared := True;
                cmd.Execute;
                cnn.CommitTrans;
                except
                  cnn.RollbackTrans;
                  Result := False;
                end;
              end;
            end;

Delphi中使用原生ADO控制数据库》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/2010-01-27/12526.html


关键字:

关于《Delphi中使用原生ADO控制数据库》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td