标签: ado

如何防止Delphi ADO将整个表加载到内存中?

我不是Delphi程序员,但我得到了一个旧的Delphi 7应用程序,我需要修复它并使用ADO.

数据库表(MS Access)包含+100,000行,当我设置ADOTable.Active = true时,它开始将整个表加载到RAM中,这需要大量的内存和时间.

如何防止ADO加载整个表?我试图设置MaxRecords,但它没有帮助.

基本上我们所做的只是程序启动:

// Connect to database
DataModule.MyADOConnection.Connected:=true;

DataModule.MeasurementsADOTable.MaxRecords:=1;

// Open datatables
DataModule.MeasurementsADOTable.Active:=true;                  
Run Code Online (Sandbox Code Playgroud)

设置Active = true后,它开始将整个测量加载到RAM中,需要TIME!

我们正在使用MSDASQL.1提供程序.也许它不支持MaxRecords属性?

如何在此数据对象中添加一些限制查询,仅"从测量中加载TOP 1*"?

delphi ado

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

ADO.RecordCount等于-1问题

当我尝试访问RecordCount属性时,我总是得到-1的返回值.以下是我的示例代码.

Set oConn = Server.CreateObject ("ADODB.Connection")
oConn.Open Application("strConnectstring")
Set rs = Server.CreateObject ("ADODB.Recordset")
rs.ActiveConnection = oConn
SQL = "Publications_PicoSearchListing"
set rs = oConn.execute(SQL)
Run Code Online (Sandbox Code Playgroud)

我不确定我是在做forwardCursor还是动态游标,或者提供者是否支持RecordCount属性.如何检查提供程序是否支持RecordCount属性,或者我是否使用forwardCursor或动态游标.

任何帮助,将不胜感激.

谢谢

ado asp-classic

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

ADO组件CommandTimeout

我有TADOQuery,TADOCommand或TADODataSet查询执行超时设置的问题(我已经尝试过每一个).我有一个小应用程序,它连接到数据库并定期执行存储过程,作为结果返回数据集.我的目标是保持此应用程序始终在线,但我的问题是,当连接丢失时,刚刚执行的命令(通过上述组件之一)的超时默认为30秒.我一直在寻找解决方案,但没有任何作用. 你能给我一个建议吗,如何将CommandTimeout设置为5秒或更长时间来说明如何修改ADODB.pas以尊重我自己的超时,好吗?

有很多"解决方案",比如set DataComponent.Connection.CommandTimeout:= 1; 但实际上,没有任何作用.我正在使用D2009,MSSQL2005,并且在线程中动态创建连接以及数据组件.

最后,我试过的是这个

// protected variable owned and created in the thread with its own connection
var Query_Object: TADODataSet; 

// connection timeout is set to 3 seconds
Query_Object.Connection.ConnectionTimeout := 3;
...

// this piece of code I'm calling periodically in the only one existing thread
...
SQL_Query := 'EXEC my_procedure_which_returns_dataset'

with Query_Object do
  begin
    Close;    
    CommandType := cmdText;
    CommandText := SQL_Query;
    CommandTimeout := 5;             // doesn't affect the timeout
    CursorLocation := clUseServer;   // let …
Run Code Online (Sandbox Code Playgroud)

delphi timeout ado tadodataset tadoquery

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

使用Delphi以编程方式获取ODBC数据源名称列表

我看到几个示例,其中源名称列表来自注册表(HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC数据源).有没有其他方法来获取ODBC数据源名称列表?

我只需要使用Delphi标准组件,所以我不能使用3d party解决方案.

delphi odbc ado delphi-2006

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

获取"多步操作产生的错误.检查每个状态值." 在SQL Server 2008中使用ADO时出错

我们正在将SQL 2000框迁移到SQL 2008.但是我们遇到了一个问题.当使用具有UNION的查询返回结果集(行或不)时.稍后在代码中我们尝试添加一个新行并为其分配字段,但由于使用了UNION,当我们尝试为字段赋值时,它会给我们一个Multiple-step operation generated errors. Check each status value.错误.我们在Windows XP和Windows 7上尝试了以下代码并得到了相同的结果.但是当我们更改连接字符串以指向我们的SQL 2000框时,我们不再会遇到该错误.

以下示例显示了我们遇到的问题.

var c = new ADODB.Connection();
var cmd = new ADODB.Command();
var rs = new ADODB.Recordset();
object recordsAffected;

c.Open("Provider=SQLOLEDB;Server=*****;Database=*****;User Id=*****;Password=*****;");

cmd.ActiveConnection = c;
cmd.CommandType = ADODB.CommandTypeEnum.adCmdText;
cmd.CommandText = "create table testing2008 (id int)";
cmd.Execute(out recordsAffected);

try {
    cmd.CommandText = "select * from testing2008 union select * from testing2008";

    rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
    rs.Open(cmd, Type.Missing, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockBatchOptimistic, -1);

    rs.AddNew();
    rs.Fields["id"].Value = 0; //throws exception
    rs.Save();
}
catch …
Run Code Online (Sandbox Code Playgroud)

sql-server ado sql-server-2008

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

ADO SQL类型将Float转换为String(Excel)

如何在ADO中使用CAST将Float值转换为String?

我试过了

SELECT CAST([Field] AS VARCHAR(20)) FROM ...
Run Code Online (Sandbox Code Playgroud)

SELECT CAST([Field] AS STRING) FROM ...
Run Code Online (Sandbox Code Playgroud)

并始终获得OLE异常(未知错误).

表列包含混合数字(右对齐)和字母数字(左对齐)值.如果只有字母数字值,则ADO查询字段类型为String.

我正在使用Delphi 2009 ADO和Excel 2010.

sql delphi excel ado

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

在INSERT上将SQL标识返回给VB变量

嗨我下面有一些代码,我希望在执行SQL语句时返回结果标识号.

set objCnn = Server.CreateObject("ADODB.connection")

CurrMachine = "my-test-box"

ObjCnn.Open("Provider=SQLOLEDB;Persist Security Info=False;User ID=Test;password=Test123;Language=British;Initial Catalog=TestDB;Data Source=" & CurrMachine)

strSQL = "INSERT INTO dbo.xyz" & _ " (field) " & _ " VALUES  (" & date & ")" & _ " SELECT @@Identity "

objCnn.Execute strSQL
Run Code Online (Sandbox Code Playgroud)

我添加了SELECT @@ Identity,当我在SQL中执行此操作时将返回唯一的ID号.如果我响应.write strSQL我得到SQL字符串而不是结果文本.

干杯!

编辑

理查德

    set objCnn = Server.CreateObject("ADODB.connection")

    CurrMachine = "my-test-srv"

    ObjCnn.Open("Provider=SQLOLEDB;Persist Security Info=False;User ID=Test;password=Test123;Language=British;Initial Catalog=Test;Data Source=" & CurrMachine)

        strSQL = "INSERT INTO xyz" & _
                " ([date])" & _
                 " VALUES  ( " …
Run Code Online (Sandbox Code Playgroud)

sql ado asp-classic

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

尝试运行短过程时查询超时已到期

这是我的连接字符串:

Global Const strConn As String = _
    "PROVIDER=SQLNCLI10;" & _
    "P-SSWORD=blahblah;" & _
    "USER ID=blahblah;" & _
    "INITIAL CATALOG=blah;" & _
    "DATA SOURCE=blah;" & _
    "CONNECT TIMEOUT=0;" & _
    "COMMAND TIMEMOUT=0" & _
    "PACKET SIZE=4096;"
Run Code Online (Sandbox Code Playgroud)

这是简单的代码:

Sub MoveDataUsingADO()

Dim cn As Object
Dim cm As Object
Dim rs As Object

    'get in touch with the server
    'Create ado objects.
Set cn = CreateObject("ADODB.Connection")
cn.connectiontimeout = 0
cn.Open strConn
cn.CommandTimeout = 0

Set cm = CreateObject("ADODB.Command")
Set cm.ActiveConnection = cn …
Run Code Online (Sandbox Code Playgroud)

excel vba ado excel-vba

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

如何在TableDefs中搜索链接表?

通过一组TableDef循环,如何确定每个TableDef是否表示链接表,而不是本地表?

ms-access dao ado access-vba

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

经典ASP - ADO执行存储过程传入​​参数

我需要使用Classic ASP将参数传递给存储过程.我确实看到一些人使用Command对象而其他人没有使用它.

我的sproc params是这样的:

@RECORD_NUMBER decimal(18,0),
@ErrorType nvarchar(100),
@INSURANCE_CODE smallint,
@CompanyId int,
@INS_ID_NUM nchar(22)   
Run Code Online (Sandbox Code Playgroud)

然后我试着这样做:

Dim conn, rsSet,rsString, cmd

Dim RN,ET,IC,CI,IIN
RN = Request.Form("Record_Number")
ET = Request.Form("ErrorType")
IC = Request.Form("INSURANCE_CODE")
CI = Request.Form("CompanyID")
IIN = Request.Form("INS_ID_NUM")

set conn = server.CreateObject("adodb.connection")
set rsSet = Server.CreateObject ("ADODB.Recordset")


conn.Open Application("conMestamed_Utilities_ConnectionString")
rs_string = "apUpdateBill " & RN &",'" &  ET & "'," & IC & "," & CI & ",'" & IIN & "'"
rsSet.Open rsString, conn, adOpenForwardOnly,, adCmdText
Run Code Online (Sandbox Code Playgroud)

(我不需要Recordset,我只是想让它发送数据)

错误:
ADODB.Recordset错误'800a0bb9'
参数类型错误,超出可接受范围或彼此冲突.

我已经尝试过Command的东西,我得到"精确"错误我"有"使用命令对象吗? …

stored-procedures ado asp-classic

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