我不是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*"?
当我尝试访问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或动态游标.
任何帮助,将不胜感激.
谢谢
我有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) 我看到几个示例,其中源名称列表来自注册表(HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC数据源).有没有其他方法来获取ODBC数据源名称列表?
我只需要使用Delphi标准组件,所以我不能使用3d party解决方案.
我们正在将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) 如何在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语句时返回结果标识号.
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) 这是我的连接字符串:
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) 通过一组TableDef循环,如何确定每个TableDef是否表示链接表,而不是本地表?
我需要使用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的东西,我得到"精确"错误我"有"使用命令对象吗? …
ado ×10
delphi ×4
asp-classic ×3
excel ×2
sql ×2
access-vba ×1
dao ×1
delphi-2006 ×1
excel-vba ×1
ms-access ×1
odbc ×1
sql-server ×1
tadodataset ×1
tadoquery ×1
timeout ×1
vba ×1