请注意下面的编辑以获取更多信息,以及可能的解决方案
我们最近修改了一个大型Delphi应用程序,以使用ADO连接和查询而不是BDE连接和查询.自那次改变以来,表现变得非常糟糕.
我已经分析了应用程序,瓶颈似乎是在实际调用TADOQuery.Open.换句话说,除了重构应用程序以减少实际使用数据库之外,从代码角度来看,我无法做很多事情来改进这一点.
有没有人有关于如何提高ADO连接的Delphi应用程序性能的建议?我已经尝试了这里给出的两个建议,几乎没有任何影响.
为了了解性能差异,我对相同的大型操作进行了基准测试:
在BDE下:11秒
在ADO下:73秒
在该文章引用的更改之后的ADO下:72秒
我们在客户端 - 服务器环境中使用Oracle后端.本地计算机每个都保持与数据库的单独连接.
对于记录,连接字符串如下所示:
const
c_ADOConnString = 'Provider=OraOLEDB.Oracle.1;Persist Security Info=True;' +
'Extended Properties="plsqlrset=1";' +
'Data Source=DATABASE.DOMAIN.COM;OPTION=35;' +
'User ID=******;Password=*******';
Run Code Online (Sandbox Code Playgroud)
回答zendar提出的问题:
我在Windows Vista和XP上使用Delphi 2007.
后端是Oracle 10g数据库.
如连接字符串所示,我们使用的是OraOLEDB驱动程序.
我的基准测试机器上的MDAC版本是6.0.
编辑:
在BDE下,我们有很多代码如下:
procedure MyBDEProc;
var
qry: TQuery;
begin
//fast under BDE, but slow under ADO!!
qry := TQuery.Create(Self);
try
with qry do begin
Database := g_Database;
Sql.Clear;
Sql.Add('SELECT');
Sql.Add(' FIELD1');
Sql.Add(' ,FIELD2');
Sql.Add(' ,FIELD3');
Sql.Add('FROM');
Sql.Add(' TABLE1');
Sql.Add('WHERE SOME_FIELD …Run Code Online (Sandbox Code Playgroud) 有没有办法通过经典的ADO将表值参数传递给SQL Server中的存储过程?
我想用Delphi程序连接(并获取用户组)到Sun LDAP服务器.我认为ADSI只适用于Microsoft LDAP.我尝试使用ADO,但我无法连接.
有人可以显示一些代码我会怎么做?
我已经继承了几个目前无法在.NET中重写的旧VB6应用程序.这些旧的应用程序都使用ADO,并在我的XP机器上正常编译.自从切换到Windows 7机器后,应用程序编译得很好,但是当它们部署时(在XP机器上),我会收到错误.这是Microsoft文章讨论的一个已知问题:
http://support.microsoft.com/kb/2517589
本文给出了一个解决方法的非常详细的解释,其中涉及复制".TLB"文件并使用"regtlibv12"注册它.当我尝试注册它时,我收到以下错误消息:
C:\ Program Files\Common Files\System\ado\msado60_Backcompat.tlb的RegisterTypeLib失败:80029c4a
我也尝试使用Windows文件夹中的旧"regtlib.exe"注册这个,但是出现了这个错误:
C:\ Program Files\Common Files\System\ado\msado60_Backcompat.tlb的LoadTypeLib失败:80029c4a
因此,我无法继续进行这项工作.我将非常感谢任何人可以给我如何正确注册此文件的任何指导.
先感谢您!
首先,我想提一下,我知道在与数据库的Web交互中,
由于安全原因应该始终使用服务器端语言,并且因为javascript
不提供并且与Windows文件系统兼容.
那说我面临着一种情况,我正在努力创造性思考.
我不允许任何访问服务器端脚本和SQL.
我需要为Intranet创建一个基于客户端的应用程序,该应用程序能够随着时间的推移存储数据.
到目前为止,我找到了2个解决方案,但没有一个有足够的文档供我正确使用.
一个是名为ACCESSdb的javascript库,可以在这里找到:ACCESSdb很
遗憾我无法理解如何使用它来写入或读取数据库中的数据...
另外就是那3段代码:
添加记录:
function AddRecord() {
var adoConn = new ActiveXObject("ADODB.Connection");
var adoRS = new ActiveXObject("ADODB.Recordset");
adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='/\dbName.mdb'");
adoRS.Open("Select * From tblName", adoConn, 1, 3);
adoRS.AddNew;
adoRS.Fields("FieldName").value = "Quentin";
adoRS.Update;
adoRS.Close();
adoConn.Close();
}
Run Code Online (Sandbox Code Playgroud)
删除记录:
function DeleteRecord() {
var adoConn = new ActiveXObject("ADODB.Connection");
var adoRS = new ActiveXObject("ADODB.Recordset");
adoConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='\\dbName.mdb'");
adoRS.Open("Select * From tblName Where FieldName = 'Quentin'", adoConn, 1, 3);
adoRS.Delete;
adoRS.Delete;
adoRS.Close();
adoConn.Close();
}
Run Code Online (Sandbox Code Playgroud)
编辑记录:
function EditRecord() {
var adoConn …Run Code Online (Sandbox Code Playgroud) 当我不得不使用Python从PowerPivot模型中读取一些数据时,看起来像是一项微不足道的任务变成了一场真正的噩梦.我相信我在过去的几天里对此进行了很好的研究,但现在我遇到了一堵砖墙,并希望得到Python/SSAS/ADO社区的一些帮助.
基本上,我想要的是以编程方式访问存储在PowerPivot模型中的原始数据 - 我的想法是通过下面列出的方法之一连接到底层的PowerPivot(即MS Analysis Services)引擎,列出模型中包含的表,然后使用简单的DAX查询(类似EVALUATE (table_name))从每个表中提取原始数据.容易腻,对吗?好吧,也许不是.
如您所见,我尝试了几种不同的方法.我会尝试尽可能仔细地记录所有内容,以便那些不熟悉PowerPivot功能的人会很清楚我想做什么.
首先,有关编程访问Analysis Services引擎的一些背景知识(它说2005 SQL Server,但它应该仍然适用):SQL Server数据挖掘可编程性和用于Analysis Services连接的数据提供程序.
我将在下面的示例中使用的示例Excel/PowerPivot文件可以在此处找到:Microsoft PowerPivot for Excel 2010和Excel 2013示例中的PowerPivot.
另请注意,我使用的是Excel 2010,因此我的一些代码是特定于版本的.例如,wb.Connections["PowerPivot Data"].OLEDBConnection.ADOConnection应该是wb.Model.DataModelConnection.ModelConnection.ADOConnection,如果你使用Excel 2013.
我将在整个问题中使用的连接字符串基于以下信息:使用C#连接到PowerPivot引擎.另外,一些方法显然需要在数据检索之前对PowerPivot模型进行某种初始化.请参见此处:从VBA自动执行PowerPivot Refresh操作.
最后,这里有几个链接显示这应该是可以实现的(但请注意,这些链接主要是指C#,而不是Python):
Interop.ADODB.dll集,我猜它是用于访问PowerPivot数据的内容)import clr
clr.AddReference("Microsoft.AnalysisServices.AdomdClient")
import Microsoft.AnalysisServices.AdomdClient as ADOMD
ConnString = "Provider=MSOLAP;Data Source=$Embedded$;Locale Identifier=1033;
Location=H:\\PowerPivotTutorialSample.xlsx;SQLQueryMode=DataKeys"
Connection = ADOMD.AdomdConnection(ConnString)
Connection.Open()
Run Code Online (Sandbox Code Playgroud)
在这里,似乎问题是PowerPivot模型尚未初始化:
AdomdConnectionException: A connection cannot be …Run Code Online (Sandbox Code Playgroud) 我目前正在为可再发行的应用程序使用MSAccess mdb文件.
前段时间我发现了SQLite,作为我的解决方案的替代品,但是他们提供的二进制文件并没有提供将它们用作VB6中的对象的可能性.(或者至少我无法弄清楚如何).
有没有人有链接,或者可以写一些关于从VB6连接到SQLite DB,以及它与使用ADO的区别?
我是一个完全的初学者.有人可以发一些Delphi代码
然后,以后
对不起,这么无能为力.我做谷歌,但没有找到有用的教程......
另外,如果底层数据库是MySql(5.1.36)(我甚至不知道这是否有任何区别)会很有用
我们一直在我们的程序中使用旧的msado15.dll.我们曾经导入它#import"msado15.dll".现在几天前我们升级到Windows 8.唉,我们的软件停止在没有安装Service Pack 1的Windows 7上运行.早些时候,当我们使用Windows 7时,我们已升级到Service Pack 1,同样的问题发生了,所以我们从所有机器上卸载了Windows 7的Service Pack 1,一切正常.
但是对于Windows 8,我认为他们已经改变了msado15.dll.我在网上进行了一些研究,他们说我们应该用msado60.tlb替换导入,但这对我们的编译破坏也没有用.
这就是我们过去在C++环境中引用的方式
import "c:\program Files\Common Files\system\ado\msado15.dll" rename_namespace("ADOCG") rename("EOF","EndofFile")
Run Code Online (Sandbox Code Playgroud)
我把它改成了
import "c:\program Files\Common Files\system\ado\msado28.tlb" rename_namespace("ADOCG") rename("EOF","EndofFile")
Run Code Online (Sandbox Code Playgroud)
并尝试过
import "c:\program Files\Common Files\system\ado\msado60.tlb" rename_namespace("ADOCG") rename("EOF","EndofFile")
Run Code Online (Sandbox Code Playgroud)
正如Microsoft Link所建议的那样.但它仍然适用于没有安装Service Pack 1的XP机器和Windows 7机器.
任何人都可以建议我们可以遵循的正确步骤,以使我们的程序在没有Service Pack 1的Windows 7上运行,也可以在Windows 8上运行.
几天来一直坚持这个问题.帮助将不胜感激.
问候,Saurabh
ado ×10
delphi ×3
vb6 ×3
database ×2
windows-7 ×2
activex ×1
bde ×1
c# ×1
c++ ×1
com ×1
datasource ×1
excel ×1
javascript ×1
ldap ×1
ms-access ×1
mysql ×1
oracle ×1
performance ×1
powerpivot ×1
python ×1
sql-server ×1
sqlite ×1
ssas ×1
sun ×1
windows-8 ×1