标签: ado

使用Delphi的ADO或DBX

哪个更好(以及为什么原因)用于从Delphi Win32应用程序--ADO或DBX(数据库快速)连接到MS SQL,Oracle或Firebird?

两者都允许您连接到主要数据库.我喜欢ADO通过连接字符串更改完成所有操作的方式以及ADO和驱动程序包含在Windows中这样的事实,因此无需额外部署(看起来,如果我错了,请纠正我).

DBX也很灵活,我可以将驱动程序编译到我的应用程序中,不是吗?

如果可能的话,我真的很想拥有一个单一来源,能够根据客户的IT部门/偏好来改变数据库.

但哪个更容易编程,性能更好,最有效地使用内存?还有其他什么可以区分它们吗?

谢谢,理查德

database delphi ado dbx

6
推荐指数
2
解决办法
3122
查看次数

VBA:使用Excel查询访问。为什么这么慢?

我在网上找到了此代码以查询Access并将数据输入到excel(2003)中,但是它比它应该慢得多:

Sub DataPull(SQLQuery, CellPaste)
Dim Con As New ADODB.Connection
Dim RST As New ADODB.Recordset
Dim DBlocation As String, DBName As String
Dim ContractingQuery As String

If SQLQuery = "" Then

Else
    DBName = Range("DBName")
    If Right(DBName, 4) <> ".mdb" Then DBName = DBName + ".mdb"

    DBlocation = ActiveWorkbook.Path
    If Right(DBlocation, 1) <> "\" Then DBlocation = DBlocation + "\"

    Con.ConnectionString = DBlocation + DBName
    Con.Provider = "Microsoft.Jet.OLEDB.4.0"
    Con.Open

    Set RST = Con.Execute(SQLQuery)
    Range(CellPaste).CopyFromRecordset RST

    Con.Close
End If

End Sub
Run Code Online (Sandbox Code Playgroud)

问题是此代码需要很长时间。如果我打开Access并在其中运行查询,则大约需要1/10的时间。反正有加速的吗?还是这可能需要很长时间?我所有的查询都是简单的select查询,带有简单的where语句,没有连接。甚至 …

excel vba ado jet

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

如何确定SSIS数据集中的行数

我经常在SSIS包中遇到一种情况,我在其中运行SQL命令以从ADO连接返回一组行.有些情况下我想根据返回的行数进行分支.ado结果集存储在SSIS"对象"数据类型中.SSIS表达式或脚本组件中是否有一种方法可以获得行数?

ssis ado

6
推荐指数
1
解决办法
1万
查看次数

如何打开SQL Compact数据库只读

我想快速阅读一个SQL Compact v3.1数据库.我在python中这样做,所以我无法访问托管代码.

我注意到,如果我使用adodbapi,数据库文件实际上只是通过打开它来修改.遗憾的是,当我向连接字符串添加"文件模式=只读"时,我得到一个奇怪的错误.

这是我用来连接的代码:

import adodbapi
adodbapi.connect('Provider=Microsoft.SQLSERVER.MOBILE.OLEDB.3.0; Data Source="awesome.sdf"; File mode = Read Only;SSCE:Temp File Directory=c:\temp\\;')
Run Code Online (Sandbox Code Playgroud)

然后我收到错误消息

OperationalError: (com_error(-2147352567, 'Exception occurred.', (0, u'Microsoft OLE DB Service Components', 
             u'Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.', 
             None, 0, -2147217887), None), 
    u'Error opening connection: Provider=Microsoft.SQLSERVER.MOBILE.OLEDB.3.0; Data Source="Awesome.sdf";File mode = Read Only;SSCE:Temp File Directory="c:\\\temp\\";')
Run Code Online (Sandbox Code Playgroud)

我添加了SSCE,因为当我用C#编写测试程序时,它需要它.以下代码完美地运行,并且在执行简单的SELECT查询时不会修改文件.

conn = new SqlCeConnection("Data Source = awesome.spf; File mode = Read Only;SSCE:Temp File Directory=\"c:\\users\\evelio\\desktop\\\";");
conn.Open();
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助,
Evelio

python ado sql-server-ce

6
推荐指数
1
解决办法
4099
查看次数

Delphi与SQL Server:OLEDB与Native Client驱动程序

我被告知SQL Native Client 应该比OLEDB驱动程序更快.所以我把一个实用工具放在一起进行两者之间的负载测试 - 结果好坏参半.有时一个更快,有时另一个更快,无论查询是什么(简单选择,where子句,join,order by等).当然,服务器承担了大部分工作量,但我对进入PC的数据到应用程序中可访问数据之间的时间感兴趣.

负载测试由非常小的查询组成,这些查询返回非常大的数据集.例如,我这样做select * from SysTables,这个表有50,000多条记录.在收到数据之后,我再次循环执行结果(使用while而不是Q.eof ... Q.next ...等).我也试过在查询中添加一些东西 - 比如order by Val哪里Val是一个varchar(100)字段.

这是我的负载测试仪的样本,最底部的数字是平均值...

在此输入图像描述

那么真的,两者之间有什么区别?我知道OLE非常灵活,支持许多不同的数据库引擎,而Native Client仅针对SQL Server.但是幕后还有什么呢?这又如何影响Delphi如何使用这些驱动程序?

这通过TADOConnection组件特别使用ADO TADOQuery.

我不一定在寻找或想办法提高性能 - 我只需要知道驱动程序之间的区别.

sql-server delphi oledb ado sqlncli

6
推荐指数
3
解决办法
9867
查看次数

在这种情况下,何时需要调用CoInitialize()?

我正在Delphi XE2中构建一个多线程Windows服务应用程序,它使用ADO数据库组件连接到SQL Server.我CoInitialize(nil);在内部线程之前已经使用了很多次,但在这种情况下,我有一个我不确定的函数.

调用此函数TryConnect,尝试使用给定的连接字符串连接到数据库.它在连接成功时返回true或false.问题是这个函数将在主服务线程的内部和外部使用,并且它将创建自己的临时TADOConnection组件,这需要CoInitialize...

我的问题是我还需要调用CoInitialize这个函数吗?如果我这样做,并且由于服务的执行程序CoInitialize也使用,如果我从服务中调用此函数,它们会干扰吗?该TryConnect函数位于从主服务线程创建的对象内部(但最终将移动到其自己的线程).我需要知道CoInitialize()从同一个线程(和CoUninitialize)调用两次是否会干扰 - 以及如何正确处理这种情况.

这是下面的代码......

//This is the service app's execute procedure
procedure TJDRMSvr.ServiceExecute(Sender: TService);
begin
  try
    CoInitialize(nil);
    Startup;
    try
      while not Terminated do begin
        DoSomeWork;
        ServiceThread.ProcessRequests(False);
      end;
    finally
      Cleanup;
      CoUninitialize;
    end;
  except
    on e: exception do begin
      PostLog('EXCEPTION in Execute: '+e.Message);
    end;
  end;
end;

//TryConnect might be called from same service thread and another thread
function TDBPool.TryConnect(const AConnStr: …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading activex ado delphi-xe2

6
推荐指数
1
解决办法
3万
查看次数

SQL中的参数 - Delphi 7

我正在使用Delphi 7和Access 2007.

我想知道任何人都可以告诉我如何使用SQL语句和ADO参数.

什么是必要的编码等等.对不起,我是Delphi的新手.

sql delphi ado delphi-7

6
推荐指数
1
解决办法
8202
查看次数

使用ADODB Excel 2010 VBA读取和使用长度超过255的字符串

这是给你们的东西:

我想从封闭的工作簿中使用VBA EXCEL中的ADODB读取信息。碰巧,excel中单元格中的字符串有时长度大于255。

然后这是此限制:http : //support.microsoft.com/kb/189897

“如果要被截断的字段的前8个记录包含255个或更少的字符,则您的数据可能被截断为255个字符。默认情况下,Microsoft Excel ODBC驱动程序将扫描数据的前8行以确定类型每列中的数据。”

为此,有一个“解决方案”:在注册表中将TypeGuessRows值设置为零(0),但是:

“出于性能原因,如果您的Excel表很大,不建议将TypeGuessRows值设置为零(0)。当此值设置为零时,Microsoft Excel将扫描表中的所有记录以确定每个表中的数据类型列。”

所以这是我的问题:

有没有一种方法可以告诉(说谎)驱动程序读取超过255个字符(除了在每列的第一行中放置一个虚拟字符串或将TypeGuessRows值设置为零(0)之外)。

如果我做不到,有没有一种方法可以写入已关闭的excel工作簿并保存更改,因此在我从已关闭的工作簿中读取信息之前,我可以在每列的顶部插入虚拟第一行。

excel vba ado adodb excel-vba

6
推荐指数
2
解决办法
3773
查看次数

如何更改已打开的TADODataSet中的字段顺序?

我有一个TADODataSet从DB加载一些列(一个SP,但这没关系).例如:

SELECT A, B, C, D FROM Foo
Run Code Online (Sandbox Code Playgroud)

现在,我打开数据集后,是否可以更改字段的顺序(或交换它们),TADODataSet以便它包含例如:

C, D, A, B
Run Code Online (Sandbox Code Playgroud)

我想在不更改命令文本本身的情况下执行此操作.可能吗?

delphi ado

6
推荐指数
1
解决办法
517
查看次数

无法将空字符串传递到非空数据库字段

我很难接受一些非常直截了当的事情.我有一个SQL Server数据库,我正在尝试使用空字符串更新不可为空的varchar或nvarchar字段.我知道这是可能的,因为空字符串''一样的东西NULL.但是,使用它TADOQuery,它不允许我这样做.

我正在尝试更新现有记录,如下所示:

ADOQuery1.Edit;
ADOQuery1['NonNullFieldName']:= '';
//or
ADOQuery1.FieldByName('NonNullFieldName').AsString:= '';
ADOQuery1.Post; //<-- Exception raised while posting
Run Code Online (Sandbox Code Playgroud)

如果字符串中有任何内容,即使只是一个空格,它也会像预期的那样保存得很好.但是,如果它是一个空字符串,它会失败:

不可为空的列无法更新为Null.

但它不是空的.它是一个空字符串,应该可以正常工作.我发誓我过去曾多次通过空串.

为什么我会收到此错误,我应该怎么做才能解决它?


额外细节:

  • 数据库:Microsoft SQL Server 2014 Express
  • 语言:Delphi 10 Seattle Update 1
  • 数据库驱动: SQLOLEDB.1
  • 正在更新的字段: nvarchar(MAX) NOT NULL

sql-server delphi ado sql-server-2014 delphi-10-seattle

6
推荐指数
1
解决办法
1033
查看次数