标签: ado

我怎么能在Delphi中这样做?

我正在将应用程序从BDE转换为ADO.

在BDE下,如果查询是Open并且您调用了"Sql.Clear",它将自动关闭数据集.

但是,在TADOQuery下不是这种情况,它会引发异常"无法对已关闭的数据集执行操作".

我们的许多遗留代码依赖于旧的BDE行为,因此我从代码中获得了大量运行时错误,如下例所示.

我想覆盖我的TADOCustomQuery类的Sql.Clear方法,以便它包含一个".Close"命令.我怎样才能做到这一点?

".Clear"方法位于SQL属性上,类型为TWideStrings.我真正的问题是:如何在TADOQuery的后代上覆盖TWideStrings.Clear方法?

我已经有一个自定义的TADOQuery组件,这个用于SQL属性:

property SQL: TWideStrings read GetSQL write SetSQL;
Run Code Online (Sandbox Code Playgroud)

这里有一些代码来演示我遇到的问题:

procedure TForm1.btnBDEDemoClick(Sender: TObject);
var
  qryBDE: TQuery;
begin
  //Both queries complete with no problem
  qryBDE := TQuery.Create(nil);
  try
    with qryBDE do begin
      DatabaseName := 'Test';  //BDE Alias
      Sql.Clear;
      Sql.Add('SELECT SYSDATE AS CURDAT FROM DUAL');
      Open;
      ShowMessage('the current date is: ' + FieldByName('CURDAT').AsString);

      Sql.Clear;  //<<<<<NO ERRORS, WORKS FINE
      Sql.Add('SELECT SYSDATE-1 AS YESDAT FROM DUAL');
      Open;
      ShowMessage('And yesterday was: ' + FieldByName('YESDAT').AsString);
    end;  //with qryBDE
  finally
    FreeAndNil(qryBDE);
  end; …
Run Code Online (Sandbox Code Playgroud)

delphi ado bde

1
推荐指数
2
解决办法
4597
查看次数

首先是RDO,后来是ADO,后来是ADO.NET,现在是LINQ.LINQ是下一个标准还是我应该等待?

在我看来,微软每四到五年就会改变有关数据库管理的规则.我记得RDO是连接SQL服务器的解决方案.我更新了我使用ADO的知识,因为RDO已经过时了.ADO非常好用,但不久前,我发现自己编程并再次刷新我的知识来使用ADO.NET.现在我正在使用LINQ在我的第一个项目中工作.

你怎么看?LINQ是否已准备好成为下一个标准,或者我应该等待并继续在.NET 2.0中使用ADO.NET?我需要从您自己的经验中了解,如果改为LINQ与其提供的好处相比并不太昂贵.

linq database ado

1
推荐指数
1
解决办法
377
查看次数

ADO与DataSet和DataTables

所以我没有看到我的问题的答案:

ADO与DataSet之间是否存在差异(性能或其他)?如果是这样,哪个更常见?

.net ado

1
推荐指数
2
解决办法
1994
查看次数

Microsoft ActiveX数据对象错误

我正在创建的VB6 dll中引用以下dll:

Microsoft ActiveX Data Objects 2.8 Library
Run Code Online (Sandbox Code Playgroud)

制作VB6 dll后,它工作正常,但在其他人的计算机上,弹出以下错误:

Run-time error '429'
ActiveX component can't create object
Run Code Online (Sandbox Code Playgroud)

我很确定这与Microsoft ActiveX Data Objects 2.8库有关.知道如何修复此错误吗?我试过用我的替换其他人的计算机上的ActiveX DLL,但这不起作用.我尝试将我的ActiveX DLL放在共享驱动器上并引用它,但这不起作用.我尝试引用2.7库,但是没有用.

vb6 activex ado reference

1
推荐指数
1
解决办法
3339
查看次数

Delphi:TAdoQuery内存泄漏?

我正在使用Delphi 5和ADO开发小型糖尿病计划.我这样做一个小问题:

function GetLowestGlucoseLevel(StartDate:string;EndDate:string): Integer;
var
  Q:TADOQuery;
begin
   try
      Q:=TADOQuery.Create(Application); //Separate unit, owner set to App
      Q.Connection:=dtMod.ADOCon;
      Q.DisableControls;
      Q.Close;
      Q.SQL.Clear;
      Q.SQL.Add('SELECT Min(qGlucose.Glucose) AS MinOfGlucose from qGlucose');
      Q.Parameters[0].Value:=StartDate;
      Q.Parameters[1].Value:=EndDate;
      Q.Open;

      Result:=Q.FieldByName('MinOfGlucose').AsInteger;

      Q.Close;
    finally
      Q:=nil;
      Q.Free; 
    end; 
end;
Run Code Online (Sandbox Code Playgroud)

查询运行正常并按预期返回结果.但是,当我检查Windows任务管理器时,内存使用率在查询后继续上升而不是减少.

如何解决这个问题?

谢谢!

memory delphi memory-leaks ado tquery

1
推荐指数
1
解决办法
3792
查看次数

TADOConnection无法在delphi中使用xe2 64位

当我在32位delphi应用程序中运行此代码时,成功建立了与MySql的连接.

{$APPTYPE CONSOLE}

{$R *.res}

uses
  AdoDb,
  ActiveX,
  SysUtils;

Var
  LConn : TADOConnection;
begin
  try
    CoInitialize(nil);
    try
      LConn:=TADOConnection.Create(nil);
      try
        LConn.ConnectionString:='Driver={MySQL ODBC 5.1 Driver};Server=127.0.0.1;Database=mysql;User=*****; Password=*****;Option=3';
        LConn.Connected:=True;
        Writeln('Connected');
      finally
        LConn.Free;
      end;
    finally
      CoUninitialize;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

但是相同的代码代码因此异常而失败

EOleException:[Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序

如果代码编译为64位应用程序.问题是为什么64位应用程序中相同的代码失败?

mysql delphi ado delphi-xe2

1
推荐指数
1
解决办法
752
查看次数

添加到数据库不起作用

我查询资产编号是否在数据库中,它返回false,因此我想将数据添加到数据库,我没有错误.但它永远不会添加数据.

  //check if its there, if so update it, if not add it.
if fdeptlayout.adoquery1.IsEmpty then
begin
  showmessage('adding new machine to db');
  with Fdeptlayout.ADOQuery1 do
    begin
    sql.Clear;
    sql.BeginUpdate;
    sql.add('INSERT INTO MList ');
    sql.Add('(Zone,Dept,Number,Name,Asset,IsPanel');
    sql.Add(',FinalLocation,Left,Top) ');
    sql.Add('VALUES ( :Zone, :Dept, :Number, :Name, :Asset, :IsPanel');
    sql.Add(', :FinalLocation, :Left, :Top)');
    sql.EndUpdate;
    Parameters.ParamByName('Zone').Value  := CZone;
    Parameters.ParamByName('Dept').Value  := CDept;
    Parameters.ParamByName('Number').Value := CNumber;
    Parameters.ParamByName('Name').Value  := CName;
    Parameters.ParamByName('Asset').Value := CAsset;
    Parameters.ParamByName('IsPanel').Value := CIsPanel;
    Parameters.ParamByName('FinalLocation').Value := CFinalLocation;
    Parameters.ParamByName('Left').Value := CLeft;
    Parameters.ParamByName('Top').Value := CTop;
    open;
Run Code Online (Sandbox Code Playgroud)

delphi ado

1
推荐指数
1
解决办法
389
查看次数

Delphi,ADO,MySQL:检查是否返回了空集

Delphi的版本是7.

我正在向MySQL数据库发送查询.可以返回的是一组数据行或只是一个空集.没什么不寻常的.但我不知道如何建立一个检查机制来检查它是一组数据还是一个空集.

这是一些代码:

var
    Q: TADOQuery;
begin
    Q := TADOQuery.Create(self);
    Q.Connection := ADOConnection;

    Q.SQL.Add('CALL get_shopping_cart_list()'); // Call stored procedure
    Q.Open;                                     // Send query and get some
                                                // results back
    // PSEUDOCODE
    // IF get_shopping_cart_list() RETURNS A NON-EMPY SET THEN
    //     SHOW WHAT WE HAVE
    // ELSE
    //     SHOW A MESSAGE THAT SAYS 'EMPTY SET'

    Q.Free;
end;
Run Code Online (Sandbox Code Playgroud)

mysql delphi ado

1
推荐指数
1
解决办法
1522
查看次数

我在insert into语句中有语法错误

我正在使用MS Access数据库,表中包含以下列Admins:

Column        Type
======        ====
Name          Text 
Surname       Text 
Dateadded     Date/time 
Adminnumber   Number(long integer) 
Password      Text 
ID type       Autonumber  (Not sure if ID is relevant) 
Run Code Online (Sandbox Code Playgroud)

这是我的代码,但它一直给我一个语法错误.

ADOquery1.Active := false;
adoquery1.sql.Text := 'insert into Admins(Name, surname, Adminnumber, Dateadded,password)Values('''+edit11.Text+''', '''+edit12.text+''', '''+edit13.Text+''', '''+edit14.Text+''', '''+edit15.text+''')';
ADOquery1.ExecSQL;
Adoquery1.SQL.Text := 'select * from Admins';
ADOquery1.Active := true;
Run Code Online (Sandbox Code Playgroud)

我一直试图找出它,但无论我使用什么代码,它都是同样的错误.错误是

项目project1.exe引发异常类eoleException,并在INSERT INTO语句中显示消息"语法错误".

我也尝试过:

ADOquery1.SQL.Add('Insert into admins');
ADOquery1.SQL.Add('(Name , Surname, Dateadded, Adminnumber, Password)');  
ADOquery1.SQL.Add('Values :Name, :Surname, :Dateadded, :adminnumber :Password)');
ADOquery1.Parameters.ParamByName('Name').Value := edit11.Text;
ADOquery1.Parameters.ParamByName('Surname').Value := edit12.Text;
ADOquery1.Parameters.ParamByName('Dateadded').Value …
Run Code Online (Sandbox Code Playgroud)

delphi ms-access ado delphi-7

1
推荐指数
1
解决办法
4984
查看次数

如何使用ADO查询参数指定表和字段名称?

UPDATE在a中执行一个语句TADOQuery,我正在使用参数进行一些操作.最初,这工作正常,但我为表名和字段名添加了另一个参数,现在它正在破坏.

代码如下所示:

Q.SQL.Text:= 'update :tablename set :fieldname = :newid where :fieldname = :oldid';
Q.Parameters.ParamValues['tablename']:= TableName;
Q.Parameters.ParamValues['fieldname']:= FieldName;
Q.Parameters.ParamValues['oldid']:= OldID;
Q.Parameters.ParamValues['newid']:= NewID;
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

错误信息

我假设这是因为我使用这个字段名称两次.我可以通过第二次使用另一个唯一的字段名称来解决这个问题,但是我还有另一个错误:

错误信息

如何使用参数指定要更新的表和字段?

sql delphi parameters ado

1
推荐指数
1
解决办法
1761
查看次数