我一直在测试Delphi XE2附带的新的ODBC dbExpress驱动程序,并注意到TSQLMonitor似乎不起作用.考虑到我可能错误地配置了组件,我将TSQLMonitor连接到使用MS SQL dbExpress驱动程序的TSQLConnection,这就像魅力一样.
我在网上看不到关于这个问题的任何帖子.有没有人注意到这个问题?它是否是一个错误,一个不受支持的功能(在使用ODBC驱动程序的TSQLConnection上没有监视),或者在这种情况下配置TSQLMonitor是否有技巧?
我熟悉使用ADO(dbGo)的Microsoft SQL服务器世界,我已经为该环境编写了许多应用程序.现在我有一个遗留的Delphi 7应用程序和Firebird 2.5数据库,我必须维护它.
但我发现如果2个客户端应用程序执行此操作:
SQLQuery.SQL.Text := 'Update mytable set field1 = 11 where keyfield = 99'
SQLQuery.Execute;
Run Code Online (Sandbox Code Playgroud)
在几乎完全相同的时间,第二个应用程序立即出现"死锁"错误.在SQL Server中,会有一段等待时间
ADOConnection.Isolationlevel = ilCursorstability;
ADOConnection.CommandTimeout := 5;
Run Code Online (Sandbox Code Playgroud)
在第二个客户端应用程序中引发任何异常之前.异常处理可能涉及在批处理过程中被视为非常不寻常的情况的回滚.这是合理的.5秒是计算机处理时间非常长的时间.
现在,我在Firebird客户端上使用相同方法的尝试毫无结果,因为"死锁"(实际上是使用中的记录)立即发生.
如果无法将数据库引擎配置为等待一些条件来改进(记录锁定要发布),那么现在责任必须由客户端应用程序开发人员负责,他们必须编写疯狂的慢速代码来克服我认为是主要的Firebird失败了.
一旦检测到"死锁",除非断开连接组件,否则不会清除该情况
while rowsupdated = 0 and counter < 5 do
begin
try
rowsupdated := SQLQuery.Execute;
except
SQLConnection.Connected := False;
SQLConnection.Connected := True;
end;
Inc(Counter)
end;
Run Code Online (Sandbox Code Playgroud)
当您在使用Delphi中的DBX时在Firebird中没有任何实质性的锁定容差时,如何构建健壮的多用户表更新客户端?
我编写了一个使用TSQLConnection的GetTableNames和GetFieldNames方法显示数据库结构的工具.如何获取每个字段名称的类型类似于以下列表(这是构建表所需的DDL的一部分)?
TABLE: ARTICLES
ID INTEGER NOT NULL
PRINTED SMALLINT DEFAULT 0
ACADEMIC SMALLINT
RELEVANCE SMALLINT
SOURCE VARCHAR(64) CHARACTER SET WIN1251 COLLATE WIN1251
NAME VARCHAR(128) CHARACTER SET WIN1251 COLLATE WIN1251
FILENAME VARCHAR(128) CHARACTER SET WIN1251 COLLATE WIN1251
NOTES VARCHAR(2048) CHARACTER SET WIN1251 COLLATE WIN1251
Run Code Online (Sandbox Code Playgroud) 在我正在工作的项目中,我有如下代码.
procedure TForm.EditBtnClick(Sender:TObject);
begin
// Mark is form variable. It's private
Mark = cdsMain.GetBookmark;
// blabalbal
.
.
.
end;
procedure TForm.OkBtnClick(Sender:TObject);
var
mistakes: Integer;
begin
//Validation stuff and transaction control
//removed to not clutter the code
If cdsMain.ChangeCount <> 0 then
mistakes := cdsMain.AppyUpdates(-1);
cdsMain.Refresh;
try
cdsMain.GotoBookmark(Mark);
// Yes, I know I would have to call FreeBookmark
// but I'm just reproducing
except
cdsMain.First;
end;
end;
Run Code Online (Sandbox Code Playgroud)
就个人而言,我没有太多使用书签 - 除了重新定位我只移动光标位置的数据集(创建列表,填充字符串列表等).如果我Refresh,更新(特别是当过滤器可以使记录不可见),重新获取(Close/ Open)或修改数据集中的数据的任何操作时,我不使用书签.我更喜欢Locate使用主键(TClientDataset当然使用a …
我有一个简单的应用程序,它使用dbExpress连接Informix数据库.如果我用TurboDelphi编译它,它适用于WinXP和Win2003.
当我使用新的Deplhi 2009时,我的应用程序在WinXP上工作正常,但不能在Win2003上启动.没有MessageBox有错误,只有EventLog中的信息:
故障应用程序inf_dbexpress_test.exe,版本0.0.0.0,故障模块kernel32.dll,版本5.2.3790.4062,故障地址0x0000bee7.
我认为这是dbExpress驱动程序的问题,而我用于使用ODBC连接Informix的德里2009编译的其他应用程序适用于Win2003.
任何人都可以测试Delphi 2009的Informix dbExpress驱动程序是否适用于Windows 2003?
谢谢你的帮助,但它不起作用.
至于$INFORMIXDIR:我重新安装了ClientSDK 3.5,我$INFORMIXDIR现在是:
C:\ Informix的
(是c:\ Program Files ...).
我可以从我的使用ODBC的应用程序连接到数据库.但是,即使在WinXP兼容模式下,dbExpress应用程序也无法启动.
我在Delphi Quality Central中报告了它作为bug#67823:
我使用delphi多年了,但从来没有使用数据库的东西,但最近开始研究和测试.
我必须说,我印象深刻,大部分事情都是自动发生的,我习惯用手写在php和python中.
我将为朋友(2层)5台用户计算机,1台数据库服务器开发商业系统.
数据库服务器将是一个体面的机器(raid-1)2硬盘驱动器运行(MySql5.1或Postgre或Firebird,打开建议).
ADO
的dbExpress
ZEOS
如您所见,所需的功能是:
我无法在真实场景(客户端,服务器)中测试所有内容,所以我希望有经验的人可以帮助我选择哪一个以及为什么.
编辑:谢谢大家,我想我会和ADO(可能)或Zeos一起去
在此先感谢
亚瑟
我的应用程序遇到了一个奇怪的问题,它的内存使用量时不时地上升几百兆,最终应用程序冻结了.该应用程序是用Delphi编写的,它使用数据库,COM(用于OPC)和TCP/IP.
使用FastMM,我已经关注了内存使用情况的屏幕截图.我不完全确定如何读取该表,但看起来有些东西已经分配了296463552个字节(0x100fb000,这是"幻数"?)三次.

有任何想法吗?有没有办法跟踪非Delphi-MM内存分配?
我正在使用Delphi 2007和FastMM 4.96.
编辑:
我使用IMallocSpy编写了一个小助手类来跟踪COM内存分配.这是我得到的摘录:
00119023 5:52:27.484 [4496] TCOMAllocSpy.PreRealloc size: 269462304
00119024 5:52:27.734 [4496] (0002760C){ntdll.dll } [7C82860C] KiFastSystemCallRet + $0
00119025 5:52:27.734 [4496] (0009F83A){MyApp.exe} [004A083A] JclDebug.JclCreateThreadStackTrace (Line 3943, "JclDebug.pas" + 7) + $1E
00119026 5:52:27.734 [4496] (003D496A){MyApp.exe} [007D596A] ComLeakHelper.TCOMAllocSpy.DebugStack (Line 46, "ComLeakHelper.pas" + 2) + $9
00119027 5:52:27.734 [4496] (003D4B52){MyApp.exe} [007D5B52] ComLeakHelper.TCOMAllocSpy.PreRealloc (Line 125, "ComLeakHelper.pas" + 4) + $2
00119028 5:52:27.734 [4496] (000053B6){MyApp.exe} [004063B6] System.@WStrAsg (Line 14090, "sys\system.pas" + 10) + $0
00119029 5:52:27.734 [4496] (002E4490){MyApp.exe} [006E5490] …Run Code Online (Sandbox Code Playgroud) 我有Delphi XE Professional.它附带了大量的DBX内容,包括DBXPool包含连接池支持的单元,但它没有XE Enterprise中提供的完整DBX支持.特别是,很多设计时支持都不存在.
我并不特别介意.我已经能够做到我需要的所有东西,没有它,直到我需要连接池.现在我正试图让它工作,我无法弄清楚如何使它工作.我可以添加DBXPool到我的程序并验证它是否已初始化,但是当我开始发出数据库请求时,TDBXPoolConnection.Create从未调用过.
这是我在BeforeConnect事件处理程序中的连接设置代码.任何人都知道我做错了什么以及如何做对吗?
procedure TMyDataModule.connectionBeforeConnect(Sender: TObject);
begin
connection.DriverName := 'Firebird';
connection.Params.Values['User_Name'] := FUserName;
connection.Params.Values['Password'] := FPassword;
connection.Params.Values['Database'] := FDatabasePath;
connection.Params.Values['ServerCharSet'] := 'UTF8';
connection.Params.values['DelegateName'] := 'DBXPool';
connection.Params.values['DelegateConnection.MaxConnections'] := '32';
end;
Run Code Online (Sandbox Code Playgroud)
编辑:如果有人在未来遇到这个问题并遇到同样的问题,我必须设置它以使其正常工作.而不是上面的最后两行,
connection.Params.values['DelegateConnection'] := 'DBXPoolConnection';
connection.Params.values['DBXPoolConnection.DriverName'] := 'DBXPool';
connection.Params.values['DBXPoolConnection.MaxConnections'] := '32';
Run Code Online (Sandbox Code Playgroud)
感谢Sertac让我选择了正确的课程!
我有一个主 TClientDataSet,它也是一个详细数据集。这个数据集被命名为 MasterDetail1。
另一个数据集 DetailSet1 是 MasterDetail1 的详细信息集。
DetailSet1 的查询是
SELECT *
FROM readoutprobe_containers
WHERE id = :parent_container
Run Code Online (Sandbox Code Playgroud)
其中parent_container参数的值是通过从主数据集中获取其数据的 DataSource 获得的。
只要 MasterDetail1 数据集有多条记录,DetailSet1 数据集就会显示相应的数据。
但是,当 MasterDetail1 数据集为空时,DetailSet1 数据集显示 MasterDetail1 数据中最后填充的记录,这是错误的数据。当主集没有数据时,明细集也应该不显示数据。
当主数据为空时如何实现空的DetailSet1?