标签: dbexpress

将TSQLMonitor与使用新ODBC dbExpress驱动程序的TSQLConnection一起使用是否有技巧?

我一直在测试Delphi XE2附带的新的ODBC dbExpress驱动程序,并注意到TSQLMonitor似乎不起作用.考虑到我可能错误地配置了组件,我将TSQLMonitor连接到使用MS SQL dbExpress驱动程序的TSQLConnection,这就像魅力一样.

我在网上看不到关于这个问题的任何帖子.有没有人注意到这个问题?它是否是一个错误,一个不受支持的功能(在使用ODBC驱动程序的TSQLConnection上没有监视),或者在这种情况下配置TSQLMonitor是否有技巧?

t-sql delphi dbexpress delphi-xe2

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

如何使Firebird客户端应用程序等待行解锁

我熟悉使用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中没有任何实质性的锁定容差时,如何构建健壮的多用户表更新客户端?

delphi firebird interbase dbexpress

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

如何使用dbExpress从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)

delphi firebird dbexpress

12
推荐指数
2
解决办法
2万
查看次数

TDataset书签有效期多长时间?

在我正在工作的项目中,我有如下代码.

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 …

delphi tclientdataset dbexpress

10
推荐指数
3
解决办法
5778
查看次数

Delphi 2009和Informix dbExpress与Windows 2003

我有一个简单的应用程序,它使用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 informix dbexpress delphi-2009

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

数据库连接Delphi

我使用delphi多年了,但从来没有使用数据库的东西,但最近开始研究和测试.

我必须说,我印象深刻,大部分事情都是自动发生的,我习惯用手写在php和python中.

我将为朋友(2层)5台用户计算机,1台数据库服务器开发商业系统.

数据库服务器将是一个体面的机器(raid-1)2硬盘驱动器运行(MySql5.1或Postgre或Firebird,打开建议).

ADO

  • 使用方便
  • 易于部署(仅限mysqlconnector安装程序)
  • 慢一点?

的dbExpress

  • 需要发送4个文件[dbxconnections.ini,dbxdrivers.ini,mysqldll,driverdll]
  • 越复杂(越难使用)
  • ClientDataSet增加了复杂性,但看起来非常有用
  • 没有免费的Postgre驱动程序?

ZEOS

  • 易于部署(1个dll)
  • 使用方便

如您所见,所需的功能是:

  • 快速
  • 使用方便
  • 易于部署

我无法在真实场景(客户端,服务器)中测试所有内容,所以我希望有经验的人可以帮助我选择哪一个以及为什么.

编辑:谢谢大家,我想我会和ADO(可能)或Zeos一起去

在此先感谢
亚瑟

database delphi ado dbexpress zeos

7
推荐指数
2
解决办法
3900
查看次数

Delphi/DBExpress导致内存泄漏

我的应用程序遇到了一个奇怪的问题,它的内存使用量时不时地上升几百兆,最终应用程序冻结了.该应用程序是用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 debugging memory-leaks memory-management dbexpress

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

Firebird:DBExpress还是原生组件?

我从Firebird开始,已经找到了Devart访问数据库的组件.它们提供本机组件(IBDAC)或DBExpress驱动程序.(我使用的是不包含Firebird驱动程序的Delphi XE2 Pro)

我猜本机组件要快一点,但这对我来说并不重要.

每种方法的优点/缺点是什么?为什么我应该选择其中一种?

delphi firebird dbexpress delphi-xe2

7
推荐指数
2
解决办法
4093
查看次数

如何在代码中设置DBX连接池?

我有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让我选择了正确的课程!

delphi connection-pooling dbexpress delphi-xe

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

当主数据集为空时更新 VCL TClientDataSet(详细信息集)

我有一个主 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?

c++ vcl tclientdataset dbexpress

7
推荐指数
0
解决办法
74
查看次数