我想将delphi内所有SQL操作都封装成一个单元,查询操作封装为一个函数并返回二维数组。
代码如下:unit dbLink;interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,DB,ADODB;
type
    TStrArr=array of string;
    SecArr=array of array of string;
    function dbOpertor(sql:string;rvalue:TStrArr):SecArr;//sql为查询语句,rvalue为要查询的字段数组
//当我写成 function dbOpertor(sql,rvalue:string):TStrArr;
    function dbInsert(isql:string):boolean;
implementation
  uses dataMod;
  
  function dbOpertor(sql:string;rvalue:TStrArr):SecArr;//function dbOpertor(sql,rvalue:string):TStrArr;
  var i,j,k:Integer;
      arr:SecArr;//arr:TStrArr
   begin
     
     if dataMod.DataModule1.ADOcon.Connected then //现在函数数据库连接这里报错,但是我用一维数组返回时不报错
      begin
       dataMod.DataModule1.ADOquery.Close;
       dataMod.DataModule1.ADOquery.SQL.Clear;
       dataMod.DataModule1.ADOquery.SQL.Add(sql);
       dataMod.DataModule1.ADOquery.Open;
       i:=0;
       j :=dataMod.DataModule1.ADOquery.RecordCount;
       showMessage(IntToStr(j));
       while not dataMod.DataModule1.ADOquery.Eof do
       begin
         SetLength(arr,j);
//------下面是我对返回二维数组的操作
         for k:=Low(rvalue) to High(rvalue) do
         arr[i][k] :=dataMod.DataModule1.ADOquery.FieldByName(rvalue[k]).AsString;
//------下面是我对返回一维数组的操作
{arr[i] :=dataMod.DataModule1.ADOquery.FieldByName(rvalue[k]).AsString;}
         dataMod.DataModule1.ADOquery.Next;
       inc(i);
       end;
       Result :=arr;
      end
      else
      showMessage('数据库连接失败');   end;请问各位大侠,这是什么原因呢?报的是不能连接数据库的内存错误!

解决方案 »

  1.   

    try    
    if dataMod.DataModule1.ADOcon.Connected then //现在函数数据库连接这里报错,但是我用一维数组返回时不报错
          begin
           dataMod.DataModule1.ADOquery.Close;
           dataMod.DataModule1.ADOquery.SQL.Clear;
           dataMod.DataModule1.ADOquery.SQL.Add(sql);
           dataMod.DataModule1.ADOquery.Open;
           i:=0;
           j :=dataMod.DataModule1.ADOquery.RecordCount;
           showMessage(IntToStr(j));
           while not dataMod.DataModule1.ADOquery.Eof do
           begin
             SetLength(arr,j);
    //------下面是我对返回二维数组的操作
             for k:=Low(rvalue) to High(rvalue) do
             arr[i][k] :=dataMod.DataModule1.ADOquery.FieldByName(rvalue[k]).AsString;
    //------下面是我对返回一维数组的操作
    {arr[i] :=dataMod.DataModule1.ADOquery.FieldByName(rvalue[k]).AsString;}
             dataMod.DataModule1.ADOquery.Next;
           inc(i);
           end;
           Result :=arr;
          end
          else
          showMessage('数据库连接失败');
    except
       showmessage('数据库连接失败');
    end;
      

  2.   

    dataMod.DataModule1.ADOcon.Connected  只能判断d adocon是否连接(在连接字符串正确的情况下)如果不正确 会产生异常,所以需要用try---except  捕捉异常,
      

  3.   

    呵呵,是啊,报的错大概是:access violation at address 004BE25 in moudle
      

  4.   

    if dataMod.DataModule1.ADOcon.Connected then 
    是这里报错的吗? 如果是的 应该不是datamodule1没创建就是adocon没创建。
      

  5.   

    那如何查看它是否创建呢,不好意思我才学delphi没多久
      

  6.   

    有倒分嫌疑?报什么错,看看dataMod.DataModule1.ADOcon这句话里面的每个实例是否存在
      

  7.   

    倒分?大哥,别乱说,我分虽然不是很多,但也足够用,又不是钱。不好意思,查看实例可以用showMessage('实例')查看吗?》