各位大哥帮帮小弟,这个问题困扰了我几天了,不知道为什么
请各位哥哥帮忙看看,小弟先行谢谢
// This unit named unit_DMOperatorDB Implement base operate for database
unit unit_DMOperatorDB;interfaceuses
  SysUtils, Classes, DB, ADODB,Dialogs;type
  TDMOperatorDB = class(TDataModule)
    con: TADOConnection;
    procedure DataModuleCreate(Sender: TObject);  private
    { Private declarations }
  public
    { Public declarations }
    function fun_ExecuteQuery(strSqlQuery:string):boolean;
    function fun_OpenQuery(strSqlQuery:string):TADOQuery;
  end;var
  DMOperatorDB: TDMOperatorDB;implementation{$R *.dfm}
// Connection database
procedure TDMOperatorDB.DataModuleCreate(Sender: TObject);
begin
  con.Close;
  con.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;pwd=sa;Initial Catalog=pubs;Data Source=.';
  try
    con.Open;
  except
    ShowMessage('Database connection fail...');
  end;
end;// Execute without record of query
function TDMOperatorDB.fun_ExecuteQuery(strSqlQuery:string):boolean;
var
  Query:TADOQuery;
begin
  Query:=TADOQuery.Create(nil);
  Query.Connection:=con;
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Text:=strSqlQuery;
  con.BeginTrans;
  try
    Query.ExecSQL;
    con.CommitTrans;
    fun_ExecuteQuery:=true;
  except
    fun_ExecuteQuery:=false;
    con.RollbackTrans;
  end;
  Query.Free;
end;// Execute have record of query
function TDMOperatorDB.fun_OpenQuery(strSqlQuery:string):TADOQuery;
var
  Query:TADOQuery;
begin
  Query:=TADOQuery.Create(nil);
  Query.Connection:=con;
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Text:=strSqlQuery;
  try
    Query.Active:=true;
    result := query;
    showmessage(inttostr(result.RecordCount));
  except
    Query.Free;
    result:=nil;
  end;
end;
end.
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, StdCtrls,DB,ADODB;type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    editQuery: TEdit;
    btnQuery: TButton;
    GroupBox2: TGroupBox;
    gridView: TDBGrid;
    Button1: TButton;
    procedure btnQueryClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
uses
  unit_DMOperatorDB;
{$R *.dfm}procedure TForm1.btnQueryClick(Sender: TObject);
var
  // 保存用户输入的查询条件
  strInPutQuery:string;
  // 查询语句
  strSqlQuery:string;
  //Query:TADOQuery;
begin
  //Query:=TAdoquery.Create(nil);
  // 设置查询语句
  //strSqlQuery:='select * from tbl_user where 1=1';
  strInPutQuery:= editQuery.Text;
  // 判断用户是否输入
  // 如果没有输入,则查询所有记录
  // 否则根据条件执行查询所需要的记录
  if strInPutQuery='' then
    strSqlQuery:='select * from publishers where 1=1'
    //gridView.DataSource.DataSet:= DMOperatorDB.fun_OpenQuery(strSqlQuery)
    //Query:= DMOperatorDB.fun_OpenQuery(strSqlQuery)
  else
      // 重置查询语句
      strSqlQuery:=strSqlQuery+'and pub_id='+ ''''+ strInPutQuery + '''';
      //Query:=DMOperatorDB.fun_OpenQuery(strSqlQuery)
      gridView.DataSource.DataSet:= DMOperatorDB.fun_OpenQuery(strSqlQuery);        //Query := DMOperatorDB.fun_OpenQuery(strSqlQuery);
        //gridView.DataSource.DataSet:= Query;      // 如果查询结果不为空,显示记录
      if gridView.DataSource.DataSet.RecordCount>0 then
        begin
          gridView.Columns[0].FieldName:='pub_id';
          gridView.Columns[1].FieldName:='pub_name';
          gridView.Columns[2].FieldName:='city';
          gridView.Columns[3].FieldName:='state';
          gridView.Columns[4].FieldName:='country';
        end
      else
        ShowMessage('Record is null');
    // 释放结所得果集
    if gridView.DataSource.DataSet <> nil then
      gridView.DataSource.DataSet.Free
   //else
    //  ShowMessage('Data operation fail');
     { try
        Query := DMOperatorDB.fun_OpenQuery('select * from publishers where 1=1');
        //Datasource1.DataSet := Query;
        gridView.DataSource.DataSet:= Query;
        if gridView.DataSource.DataSet.RecordCount>0 then
          begin
            gridView.DataSource.DataSet:=DMOperatorDB.fun_OpenQuery(strSqlQuery);
            gridView.Columns[0].FieldName:='pub_id';
            gridView.Columns[1].FieldName:='pub_name';
            gridView.Columns[2].FieldName:='city';
            gridView.Columns[3].FieldName:='state';
            gridView.Columns[4].FieldName:='country';
            //gridView.DataSource.DataSet.Free;
          end
          //else
           //if gridView.DataSource.DataSet <>nil then
            //gridView.DataSource.DataSet.Free;
      finally
        Query.Free;
        gridView.DataSource.DataSet.Free;
      end;
      //DMOperatorDB.Free;  }
      
end;procedure TForm1.Button1Click(Sender: TObject);
var
  Tage:boolean;
begin
  Tage:=DMOperatorDB.fun_ExecuteQuery('update publishers set pub_name='+'''shan xi chu ban she'''+ 'where pub_id=0736');
  if Tage=true then
    showmessage('update access')
  else
    showmessage('update fail');
end;end.就是查询出问题,总出现 Project prjUserManager.exe raised exception class
EAccessViolation with message'Access violation at address 004865AD in module'prjUserManager.exe'.Read of address 00000030',Process stopped.Use Step or Run to
continue.

解决方案 »

  1.   

    // Execute have record of query
    function TDMOperatorDB.fun_OpenQuery(strSqlQuery:string):TADOQuery;
    var
      Query:TADOQuery;
    begin
      Query:=TADOQuery.Create(nil);
      Query.Connection:=con;
      Query.Close;
      Query.SQL.Clear;
      Query.SQL.Text:=strSqlQuery;
      try
        //添加
        Query.ExecSQL;
        //添加完毕
        Query.Active:=true;
        result := query;
        showmessage(inttostr(result.RecordCount));
      except
        Query.Free;
        result:=nil;
      end;
    end;
      

  2.   

    还是不行
    我原来用Open也都不行
      

  3.   

    各位大哥帮帮忙
    小弟实在急的很,刚开始学习Delphi三四天,由于项目要求,马上就要开始了
    求各位大哥帮帮,谢谢
      

  4.   

    function TDMOperatorDB.fun_OpenQuery(strSqlQuery:string):TADOQuery;
    这样用法不对
    procedure TDMOperatorDB.fun_OpenQuery(mTempQuery:TADOQuery);你原来的结果集在出函数的时候都被释放掉了。
      

  5.   

    erhan(二憨) 真是耐心,这么长的代码也看。。赞一个。