我正在将应用程序从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) 在我看来,微软每四到五年就会改变有关数据库管理的规则.我记得RDO是连接SQL服务器的解决方案.我更新了我使用ADO的知识,因为RDO已经过时了.ADO非常好用,但不久前,我发现自己编程并再次刷新我的知识来使用ADO.NET.现在我正在使用LINQ在我的第一个项目中工作.
你怎么看?LINQ是否已准备好成为下一个标准,或者我应该等待并继续在.NET 2.0中使用ADO.NET?我需要从您自己的经验中了解,如果改为LINQ与其提供的好处相比并不太昂贵.
所以我没有看到我的问题的答案:
ADO与DataSet之间是否存在差异(性能或其他)?如果是这样,哪个更常见?
我正在创建的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库,但是没有用.
我正在使用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任务管理器时,内存使用率在查询后继续上升而不是减少.
如何解决这个问题?
谢谢!
当我在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位应用程序中相同的代码失败?
我查询资产编号是否在数据库中,它返回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的版本是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) 我正在使用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) 我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)
我得到的错误:

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

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