我使用ADO Connection OpenSchema()
调用以各种方式成功从SQL服务器上托管的数据库中提取列定义,因此我可以在另一个SQL数据库中以编程方式重新创建这些表.到现在为止还挺好.
使用多个视图进行与上表的主要交互; 虽然OpenSchema()
能够以与返回表的列定义相同的方式返回视图的列定义,但缺少一小部分信息 - 视图中的列映射到的基础表中的哪个表和列.
我尝试使用ADOX目录视图访问用于创建视图的SQL命令,但似乎我们使用的SQL Server的OLEDB驱动程序不支持此功能.
有没有办法通过ADO获取视图配置的这些信息,或者以"ColumnX映射到表Z中的ColumnY"的方式或以用于创建视图的实际SQL命令的形式?
我如何部署Microsoft SQL Server Compact 4.0?
SQL Server Compact Edition(目前版本为4.0)是:
免费的嵌入式数据库,软件开发人员可以使用它来构建Windows桌面应用程序.它占用空间小,支持在应用程序文件夹中私有部署其二进制文件.
但是你如何实际部署呢?
问题是除非已注册,否则无法使用ADO OLEdb提供程序.注册OLEdb提供程序必须以管理员身份完成.这意味着SQL Server Compact版本将失败,而非管理员用户.
SQL Server Compact 4.0附带一个redist_enu.txt
文件:
列出的.exe文件每个都将其附带的组件安装到目标计算机上的特定位置.这有助于确保可维护性和技术支持.这些.exe文件中包含的.dll文件也可以在此redist.txt中单独使用.但是,这些单独的.dll的分发可能会导致可维护性问题.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=94589
通过BreadCrumb进行私有部署检测:不支持通过Assembly.LoadFrom(),.local文件或使用DLL/COM重定向策略显式加载本机堆栈和显式加载SQL Server Compact Assembly,可能导致可维护性问题.有关详细信息,请参阅http://support.microsoft.com/kb/835322和http://msdn2.microsoft.com/en-us/library/aa375142.aspx
Microsoft SQL Server Compact 4.0
SSCERuntime_x86-ENU.exe
SSCERuntime_x86-DEU.exe
SSCERuntime_x86-FRA.exe
SSCERuntime_x86-
JPN.exe SSCERuntime_x86-RUS.exe
SSCERuntime_x86-ESN.exe
SSCERuntime_x86-ITA.exe
SSCERuntime_x86-KOR.exe
SSCERuntime_x86-CHT.exe
SSCERuntime_x86-CHS.exe
SSCERuntime_x64-ENU.exe
SSCERuntime_x64-DEU.exe
SSCERuntime_x64-FRA.exe
SSCERuntime_x64-
JPN.exe SSCERuntime_x64-RUS.exe
SSCERuntime_x64-ESN.exe
SSCERuntime_x64-ITA.exe
SSCERuntime_x64-KOR.exe
SSCERuntime_x64-CHT.exe
SSCERuntime_x64-CHS.exe
sqlcese40.dll
sqlceqp40.dll …
StackOverflow上有几个问题似乎有关于ADO/OleDB,delphi TADOQuery/TADOCommand和参数主题的相互矛盾的答案.
可以在ADO组件的CommandText或SQL属性中以两种方式引入参数.大多数时候都为我工作的命名参数是用冒号引入的:
select a, b, c from bar where bat = :baz
Run Code Online (Sandbox Code Playgroud)
这对99%的时间对我有用,就好了.偶尔我会发现ADO或Delphi的包装器不会接受":baz"并要求我写这个:
select f, g, h from bar where bat = ?
Run Code Online (Sandbox Code Playgroud)
这会生成一个未命名的参数,而不是命名参数.当ADO查询或ADO命令只包含一个参数时,这不是什么大问题.但是当ADO对我不利时,情况并非如此.昨天它采取了一种方式,今天,在单个TADOCommand对象中使用双命令的另一种方式,就像这样,在一个CommandText字符串中有两个命令:
delete from bar where id = :id1
delete from bat where id = :id2
Run Code Online (Sandbox Code Playgroud)
我不得不改变它:
delete from bar where id = ?
delete from bat where id = ?
Run Code Online (Sandbox Code Playgroud)
它整天都在工作.今天,我不得不将其改回第一版,以使其发挥作用.症状是ADO参数消失了,不会再回来,当我尝试执行命令时,我得到一个错误,索引超出范围,当我尝试访问时Parameters[0]
.什么都没有给我任何关于参数消失的警告.似乎在ADO数据集的一些连接,在设计时TADOCommand
,尤其是对组件进行慢跑,它"只是打破了我".当你尝试编写查询或命令时,它特别令人抓狂,你知道它有效,但是ADO组件决定不接受"?" 或":x"现在.你可以通过从一个切换到另一个来解决它无法运行的问题.但它让我感到沮丧,可能实际上完全阻止了其他人.我知道有些人总是在代码中动态构建SQL,并且避免使用Parameters
,也许这就是原因.
我期待的问题的可能答案是:
ADO不支持多个命令,或者至少Delphi的包装器不支持.或者也许TADOCommand
只是在这里不可靠.
参数是所有ADO中的错误区域,还是所有Delphi的ADO包装器?
你这样做是错的.
我正在使用Delphi XE2,但我在2007,2009,2010和XE中看到过类似的狡猾行为.我正在使用Microsoft OLEDB Provider for SQL Server作为我的OLEDB Provider.
我有excel VBA脚本:
Set c?nn = CreateObject("ADODB.Connection")
conn.Open "report"
Set rs = conn.Execute("select * from table" )
Run Code Online (Sandbox Code Playgroud)
脚本工作正常,但我想添加参数.例如"where(parentid = myparam)",其中myparam在查询字符串外设置.我该怎么做?
当然我可以修改查询字符串,但我认为这不是很明智.
这不是一个关于哪个更好的问题,而是一个关于它们在功能上有何不同的问题.我遇到的问题已经解决了,但我很好奇为什么会发生这种情况.
背景 - 使用Excel vba从Access数据库中提取数据.当用户单击按钮时,会从Access中提取记录集,并将各种数据填充到电子表格中.然后,从另一个查询中提取另一个记录集以填充电子表格的另一部分.
ADO做了什么 - ADO非常适合我的第一个记录集.但是,我的第二个记录集转到Access中的查询,运行,并且不返回任何行.如果我在Access中运行此查询,它会打开(大约3到4秒后).此查询具有多个连接,计算项,限制以及可能的Union查询(我尝试了许多不同的方式,有/无联合等).我尝试关闭并重新打开ado连接.我尝试更改超时值,我甚至测试使用ADO命令运行对此数据的Make表查询,然后从表中取出(这样做顺便说一句,但不是最好的情况,因为数据不断变化,每次有人使用此工具时,我都不想运行make table查询.
所以,我把第二个数据拉到了DAO,看,它有效.第一个数据拉取仍然是ADO(我通常更喜欢使用),但现在考虑将其更改为DAO,因为我宁愿在代码中使用一种数据访问方法.
那么,有人可以向我解释为什么ADO不会在一个案例中提取数据,但DAO会吗?同样,这纯粹是出于提供信息的目的.
在具有ADO数据库连接的多线程环境中,我想知道是否已调用CoInitialize.我该如何检查?
我在古老的留言板上找到了一些代码,可以很好地从类,模块和表单中导出所有VBA代码(见下文):
Option Explicit
Option Compare Database
Function SaveToFile() 'Save the code for all modules to files in currentDatabaseDir\Code
Dim Name As String
Dim WasOpen As Boolean
Dim Last As Integer
Dim I As Integer
Dim TopDir As String, Path As String, FileName As String
Dim F As Long 'File for saving code
Dim LineCount As Long 'Line count of current module
I = InStrRev(CurrentDb.Name, "\")
TopDir = VBA.Left(CurrentDb.Name, I - 1)
Path = TopDir & "\" & "Code" 'Path where …
Run Code Online (Sandbox Code Playgroud) 在启动应用程序时,如何确保安装某个OLEDB驱动程序?我使用Delphi的ADO,如果缺少驱动程序,则希望显示描述性错误消息.从ADO返回的错误并不总是那么用户友好.
可能有一个很好的小函数返回所有已安装的驱动程序,但我还没有找到它.
我在数据库中有多个表:
tblOjt
ID studentid courseid companyid addresseeid dateadded datestarted dateended ojthours
1 3 1 1 1 9/25/2013 500
Run Code Online (Sandbox Code Playgroud)
tblStudent
ID lastname firstname middlename course gender renderedhours dateadded archive
3 Dela Cruz Juan Santos BSIT Male 500
Run Code Online (Sandbox Code Playgroud)
tblCourse
ID coursealias coursename hours
1 BSIT Bachelor of Science in Information Technology 500
Run Code Online (Sandbox Code Playgroud)
tblCompany
ID companyname
1 MyCompany
Run Code Online (Sandbox Code Playgroud)
tblAddressee
ID addresseename
1 John dela Cruz
Run Code Online (Sandbox Code Playgroud)
我需要一个SQL语句,我可以在其中获取此值:
tableOjt.id tableOJT.surname,firstname, and middlename course companyname addresseename dateadded datestarted dateended ojthours
Run Code Online (Sandbox Code Playgroud)
我将如何使用这些连接方法在SQL中获取此代码...我在VB6 ADODC中编写它,这是否与标准SQL中的语法相同?谢谢
请注意下面的编辑以获取更多信息,以及可能的解决方案
我们最近修改了一个大型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 ×10
delphi ×4
ms-access ×3
vba ×3
dao ×2
activex ×1
bde ×1
delphi-xe2 ×1
deployment ×1
excel ×1
jet ×1
oledb ×1
oracle ×1
performance ×1
sql ×1
sql-server ×1
vb6 ×1
view ×1
xcopy ×1