我有TADOQuery,TADOCommand或TADODataSet查询执行超时设置的问题(我已经尝试过每一个).我有一个小应用程序,它连接到数据库并定期执行存储过程,作为结果返回数据集.我的目标是保持此应用程序始终在线,但我的问题是,当连接丢失时,刚刚执行的命令(通过上述组件之一)的超时默认为30秒.我一直在寻找解决方案,但没有任何作用. 你能给我一个建议吗,如何将CommandTimeout设置为5秒或更长时间来说明如何修改ADODB.pas以尊重我自己的超时,好吗?
有很多"解决方案",比如set DataComponent.Connection.CommandTimeout:= 1; 但实际上,没有任何作用.我正在使用D2009,MSSQL2005,并且在线程中动态创建连接以及数据组件.
最后,我试过的是这个
// protected variable owned and created in the thread with its own connection
var Query_Object: TADODataSet;
// connection timeout is set to 3 seconds
Query_Object.Connection.ConnectionTimeout := 3;
...
// this piece of code I'm calling periodically in the only one existing thread
...
SQL_Query := 'EXEC my_procedure_which_returns_dataset'
with Query_Object do
begin
Close;
CommandType := cmdText;
CommandText := SQL_Query;
CommandTimeout := 5; // doesn't affect the timeout
CursorLocation := clUseServer; // let …Run Code Online (Sandbox Code Playgroud) 我们试图从TADOQuery中找到一些性能修复.目前,我们使用'while not Q.eof do begin ... Q.next方法循环记录.对于每个记录,我们读取每个记录的ID和值,并将每个记录添加到组合框列表中.
有没有办法将指定字段的所有值一次性转换为列表?而不是循环数据集?如果我可以做一些像...那样的话真的很方便
TStrings(MyList).Assign(Q.ValuesOfField['Val']);
Run Code Online (Sandbox Code Playgroud)
我知道这不是一个真正的命令,但那是我正在寻找的概念.寻找快速响应和解决方案(一如既往,但这是为了解决一个非常紧急的性能问题).
当使用TADOQuerywith [eoAsyncFetchNonBlocking]和附加到OnFetchComplete事件时,我发现它OnFetchComplete没有在主线程中执行(在XE4和XE8中测试).我认为这是一个错误*,因为我们大多数人都会在这些类型的事件中在UI中工作.我认为这是大型项目中一些问题的根源,我需要一个解决方法.
[编辑]*在阅读ADO文档后,我知道承认这可能不是一个错误,但多线程问题仍然存在.
是否有一种优雅的方法来强制在此处理程序中使用代码在主线程上执行?我不想使用计时器(但如果这是我将采取的唯一解决方案).或者,是否存在ADO同步对象,我可以在此等待或向ADO提供商发送其他形式的信令?
这是一个简化的示例,显示了问题.我的项目更复杂,工厂创建和填充这些数据集,但这里类似于将数据集附加到网格内部ADOQuery1FetchComplete.
unit Unit4;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Data.Win.ADODB, Vcl.StdCtrls;
type
TForm4 = class(TForm)
Button1: TButton;
Button2: TButton;
ADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FMainThreadID : DWORD;
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm} …Run Code Online (Sandbox Code Playgroud) 我想在动态查询中将自己的过程设置为OnGetText字段事件
我的程序是这样的:
procedure TMainFrm.MyFieldGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
...
end;
Run Code Online (Sandbox Code Playgroud)
我在ADOQuery的OnAfterOpen事件中设置事件处理程序:
procedure TImportFrm.ADOQueryAfterOpen(DataSet: TDataSet);
var
I : Integer;
begin
for I := 0 to ADOQuery.FieldCount - 1 do
ADOQuery.Fields[I].OnGetText := MainFrm.MyFieldGetText;
end;
Run Code Online (Sandbox Code Playgroud)
但是在打开ADOQuery之后,没有要显示的Text,看起来Text值为空!
似乎我的程序做什么并不重要,因为当我设置一个空程序(没有代码)时,也没有显示任何文本
出了什么问题?
谢谢 ...
我有一个由DataSource链接到DBGrid的ADOQuery.
ADOQuery和DataSource位于DataModule中,连接采用另一种形式.
在查询获取记录时,有没有办法让我的应用程序显示行?
像MSSQL Management Studio一样.
选择大约需要7分钟来终止执行.
我正在使用Delphi 2007.
我有一个在Delphi 6中开发的轮询应用程序.它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 Express Edition)
我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如日语操作系统.因此,我们将SQL Server中的数据库字段从varchar更改为nvarchar.
轮询在使用DBCS的操作系统中工作正常.如果系统区域设置设置为日语/中文/韩语且操作系统具有相应的语言包,则它也可以成功用于非DBCS操作系统.但是,如果Locale设置为english,则数据库包含双字节字符的垃圾字符.
我进行了一些测试但未能确定解决方案.
例如,如果我使用TStringList 从UTF-8文件读取并将其保存到另一个文件,则保存Unicode数据.但是,如果我使用文件的内容使用TADOQuery组件运行更新查询,则会显示垃圾字符.该数据库还包含垃圾字符.
PFB示例代码:
var
stlTemp : TStringList;
qry : TADOQuery;
stQuery : string;
begin
stlTemp := TStringList.Create;
qry := TADOQuery.Create(nil);
stlTemp.LoadFromFile('D:\DelphiUnicode\unicode.txt');
//stlTemp.SaveToFile('D:\DelphiUnicode\1.txt'); // This works. Even though
//the stlTemp.Strings[0] contains junk characters if seen in watch
stQuery := 'UPDATE dbo.receivers SET company = ' + QuotedStr(stlTemp.Strings[0]) +
' WHERE receiver_cd = N' + QuotedStr('Receiver');
//company is a nvarchar field in the database
qry.Connection := ADOConnection1;
with …Run Code Online (Sandbox Code Playgroud) 我有DBGrid哪些存储客户信息和会员资格的到期日期。我对包含即将到期(青色)或已过期(红色)的会员资格的行着色的OnDrawColumnCell事件使用以下代码DBGrid:
procedure TfrmMain.grdMainDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (ADOMember.FieldByName('expirydate').AsDateTime >= (now)) and (ADOMember.FieldByName('expirydate').AsDateTime <= (now+7)) then
begin
grdMain.Canvas.Brush.Color := clTeal;
grdMain.Canvas.Font.Color := clWhite;
grdMain.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
if (ADOMember.FieldByName('expirydate').AsDateTime < (now)) and (ADOMember.FieldByName('expirydate').AsString <> '') then
begin
grdMain.Canvas.Brush.Color := clRed;
grdMain.Canvas.Font.Color := clWhite;
grdMain.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我的表单上还有一个按钮可以重置 DBGrid。这允许用户在搜索完成后显示完整的客户端列表(返回少量客户端)。
按下重置按钮时出现我的问题。当ResetMemberGrid显示完整列表时,该按钮会正确执行以下 SQL 函数(在称为 的过程中)。
SELECT * FROM 客户
但是,DBGrid 不再着色。所有行保持白色。我无法调用该grdMainDrawColumnCell过程,因为它需要我不知道的参数。有没有办法调用 DrawColumnCell …
场景是这样的:
我们有一些SQL表.我们正在对此表执行SQL查询,并且我们在TADOQuery对象中有结果.
var
qryOryginal, qryClone: TADOQuery;
begin
//setup all the things here
qryOryginal.Active := True;
qryClone.Clone(qryOryginal, ltBatchOptimistic);
qryOryginal.Delete; //delete in qryOryginal casues that qryClone deletes its record too!
end;
Run Code Online (Sandbox Code Playgroud)
因此,在克隆DataSet之后,我的qryClone应该保存并且独立数据(至少我是这么认为的).但是,在qryOryginal上执行Delete会导致qryClone上的操作相同.我不希望这样.
有任何想法吗?
我知道我可以将数据存储在TClientDataSet中的其他位置,但我想首先尝试上述解决方案.
在此先感谢您的时间.
我有这个代码返回访问冲突('模块'sqloledb.dll'中地址74417E44的访问冲突'.读取地址786E3552')我无法确定问题出在哪里.我唯一的猜测是ADOQuery对我们可以传递的参数数量有限制.代码如下:
With qryInsert do
begin
Active := False;
Close;
Sql.Clear;
Sql.Add('Insert Into MyTable(ColumnOne, ');
Sql.Add(' ColumnTwo, ');
Sql.Add(' ColumnThree, ');
Sql.Add(' ColumnFour, ');
Sql.Add(' ColumnFive, ');
Sql.Add(' ColumnSix, ');
Sql.Add(' ColumnSeven, ');
Sql.Add(' ColumnEight, ');
Sql.Add(' ColumnNine, ');
Sql.Add(' ColumnTen, ');
Sql.Add(' ColumnEleven, ');
Sql.Add(' ColumnTwelve, ');
if qrySelect.FieldByName('ColumnTwelve').AsSTring = 'Y' then
begin
Sql.Add(' ColumnThirteen, ');
Sql.Add(' ColumnFourteen, ');
Sql.Add(' ColumnFifteen, ');
end;
Sql.Add(' ColumnSixteen, ');
if qrySelect.FieldByName('ColumnSixteen').AsSTring = 'Y' then
begin
Sql.Add(' ColumnSeventeen, ');
Sql.Add(' ColumnEighteen, ');
Sql.Add(' ColumnNineteen, …Run Code Online (Sandbox Code Playgroud) 我正面临在TADOQuery组件中执行SQL脚本的问题.正在执行的脚本包含goto语句及其相应的标签,例如:
goto MyLabel
MyLabel:
--do something else
Run Code Online (Sandbox Code Playgroud)
但是,TADOQuery看到这些:字符并将它们视为参数(它们不是参数),并给我一个错误:
Parameter object is improperly defined. Inconsistent or incomplete information was provided
如何指示TADOQuery不要将这些视为参数?
delphi ×10
tadoquery ×10
ado ×3
tadodataset ×2
asynchronous ×1
cloning ×1
dbgrid ×1
delphi-2007 ×1
delphi-6 ×1
delphi-xe4 ×1
delphi-xe8 ×1
events ×1
list ×1
performance ×1
sql-server ×1
tdbgrid ×1
timeout ×1
unicode ×1