当我尝试访问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或动态游标.
任何帮助,将不胜感激.
谢谢
我想做以下事情.1)创建数据库.2)创建表,存储过程等时运行脚本(此脚本由SMS'生成脚本'选项创建)
我找到了以下代码:http: //www.delphipages.com/forum/showthread.php?t = 181685 并将其修改为:
尝试
Run Code Online (Sandbox Code Playgroud)ADOQuery.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +edtPassword.Text +'; Persist Security Info = True; User ID ='+ edtUser.Text +'; Initial Catalog = master; Data Source ='+ edtServerName.Text;
Run Code Online (Sandbox Code Playgroud)ADOQuery.SQL.Clear; ADOQuery.SQL.Text := 'create DataBase ' + edtWebDBName.Text; ADOQuery.ExecSQL; // should check existance of database ADOWeb.Connected := false; ADOWeb.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +edtPassword.Text +'; Persist Security Info = True; User ID ='+ edtUser.Text +'; Initial Catalog ='+ edtWebDBName.Text +'; Data Source ='+ edtServerName.Text; ADOWeb.Connected:= true;
Run Code Online (Sandbox Code Playgroud)ADOQuery.Connection := …
我们正在将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) OLD说,一台机器有MSVBVM60.dll版本6.0.97.82.其他机器有MSVBVM60.dll版本6.0.98.15,说新.从NEW机器上创建的exe new ADODB.Connection在OLD机器上的行崩溃时发出以下错误
运行时错误'430':类不支持自动化或不支持预期的接口
如何摆脱这个?我的主要目标是在新机器上创建时在OLD机器上运行exe.为了避免干扰NEW机器的配置,我尝试取消注册旧版本并在OLD机器上注册更新版本但没有成功.是否有任何其他dll(s)使用ADODB.Connection或我需要做一些完全不同的东西来摆脱这个?
谷歌搜索这个ADO错误消息表明它在ASP.NET开发中经常遇到,但我没有发现它在Delphi应用程序中何时出现.我们有一些客户站点遇到短暂的网络问题,这是症状性错误消息.我们可以轻松地在办公室测试中复制它; 只需在delphi TADOConnection对象连接到该服务器实例上的数据库时关闭MS SQL Server服务,就会出现以下异常:
[DBNETLIB][ConnectionWrite (send()).]General network error. Check your network documentation.
Run Code Online (Sandbox Code Playgroud)
是的,抓住这个例外,你知道(或者你呢?)发生了这个错误.除了这是一个800 KLOC +应用程序,其中有超过10,000个围绕数据库操作的try-except块,其中任何一个都可能因此错误而失败.
TADOConnection有一些错误事件,在这种情况下都没有.但是,一旦发生这种情况,ADO Connection本身就会出现故障,即使重新启动SQL数据库,TADOConnection.Connected仍然是正确的,但它对你说谎.它真的处于故障状态.
那么,我的问题是:
您能否以任何方式检测此故障状态并从中恢复,而不是进入10,000个单独的try-except块并设置一些全局"重新连接ADO全局变量"?
我希望有一种方法可以进入TADOConnection.ConnectionObject(底层的原始OLEDB COM ADO对象)并在我们开始新查询时检测到这种故障情况,这样我们就可以重置ADOConnection并在下次运行时继续一个问题.由于我们的代码组织方式允许我们在"故障之后"检测到这种情况要比我们在10行演示应用程序中执行此操作的方式更容易.
这个另外的SO问题问为什么会发生,这不是我要问的,请不要给我"预防"答案,我已经了解它们,我正在寻找恢复和检测停滞的ADO除了捕获异常之外的连接技术.事实上,这是出错的例子; 在这种故障模式下,ADO是一个schrodingers-cat对象.
我知道MS知识库文章以及互联网上的各种解决方案.一旦错误情况(在我们的情况下通常是短暂的)已经清除,我就会询问有关RECOVERING而不会丢失客户数据的问题.这意味着我们冻结了我们的应用程序,向客户展示了例外情况,当客户点击"重试"或"继续"时,我们会尝试修复并继续.请注意,我们现有的代码会执行一百万次try-except-log-and-continue代码,这将会妨碍我们,因此我希望有人能够回答未处理异常的应用程序处理程序是最好的方法,但遗憾的是我们不能使用它.但我真的希望能够检测到冻结/故障/死ADO连接对象.
这就是我所拥有的:
try
if fQueryEnable and ADOConnection1.Connected then begin
qQueryTest1.Active := false;
qQueryTest1.Active := true;
Inc(FQryCounter);
Label2.Caption := IntToStr(qQueryTest1.RecordCount)+' records';
end;
except
on E:Exception do begin
fQueryEnable := false;
Memo1.Lines.Add(E.ClassName+' '+E.Message);
if E is EOleException and Pos('DBNETLIB',E.Message)>0 then begin
ADOConnectionFaulted := boolean; { Global variable. }
end;
raise;
end;
end;
Run Code Online (Sandbox Code Playgroud)
上述解决方案的问题是我需要在我的应用程序中复制并粘贴大约10,000个位置.
使用单个TADOQueryi使用左外连接从两个不同的表中提取记录:
Select M*, D.* from Courier M Left outer join Courier_VT D on M.Courier_Identifier = D.FK_Courier_Identifier
Run Code Online (Sandbox Code Playgroud)
我用a TDBGrid来成功地将字段更新发布到我的MSSQL DB.
由于有外键引用(FK_Courier_Identifier带Courier_Identifier)我插入记录时出错,
无法将值Null插入列'FK_Courier_Identifier',表Courier_VT; 列不允许null
但是在Courier表中发布了一条记录,我知道我需要在发布之前分配Courier_Identifier到FK_Courier_Identifier,但不知道如何以及在何处进行
我们如何在此场景中插入\删除记录?是否有可能实现单一使用TADOQuery?
我正在使用VBA中的ADO执行存储过程.我正在尝试使用SQL Server 2008中的存储过程的结果填充记录集.下面的VBA示例:
Public Function DoSomething() As Variant()
Dim oDB As ADODB.Connection: Set oDB = New ADODB.Connection
Dim oCM As ADODB.Command: Set oCM = New ADODB.Command
Dim oRS As ADODB.Recordset
oDB.Open gcConn
With oCM
.ActiveConnection = oDB
.CommandType = adCmdStoredProc
.CommandText = "spTestSomething"
.NamedParameters = True
.Parameters.Append .CreateParameter("@Param1", adInteger, adParamInput, , 1)
Set oRS = .Execute
End With
If Not oRS.BOF And Not oRS.EOF Then 'Error thrown here'
DoSomething = oRS.GetRows()
Else
Erase DoSomething
End If
oRS.Close
Set oRS = …Run Code Online (Sandbox Code Playgroud) 我们有一些旧的 ADO/VSTS 项目,我们希望将它们存档并设为只读。每个项目都有工作项、构建、git repos 等...
目前我发现的唯一方法是痛苦的。
我用 git repos 尝试了这个,但存在一些问题,因为某些权限不会继承给创建 git repo 的个人用户,他们仍然能够签入。
在这里您可以看到我创建了一个 READONLY 组并将除读取权限之外的所有内容设置为拒绝。(该组的成员是默认组,例如贡献者、构建管理员、项目管理员)
但是,在我创建只读组之前,我有一个由测试用户创建的存储库,并且该用户似乎仍然对该存储库具有权限
好吧好吧我知道如果权限设置在较低级别,那么它们将不会从顶级父级继承下来。我可以创建一个脚本来检查每个 git repo 的用户并将他们的签入权限设置为拒绝,但这很痛苦,我不想这样做。同样,一些项目有超过 300 个 git 存储库。
仅供参考,我想让整个项目只读,而不仅仅是 git repos。
尝试将datetime值12/30/1899传递给 SQL Server,失败并显示无效的日期格式- 但仅适用于本机客户端驱动程序,并且仅适用于DataTypeCompatiblity模式。
尝试在 ADO 中使用参数化查询时,针对 SQL Server:
SELECT ?
Run Code Online (Sandbox Code Playgroud)
我将datetime值参数化为adDBTimeStamp:
//Language agnostic, vaguely C#-like pseudo-code
void TestIt()
{
DateTime dt = new DateTime("3/15/2020");
VARIANT v = DateTimeToVariant(dt);
Command cmd = new Command();
cmd.CommandText = "SELECT ? AS SomeDate";
cmd.Parameters.Append(cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
Connection cn = GetConnection();
cmd.Set_ActiveConnection(cn);
cmd.Execute(out recordsAffected, EmptyParam, adExecuteNoRecords);
}
Run Code Online (Sandbox Code Playgroud)
当日期为3/15/2020.
我对 的行为感到困惑TADOQuery,让我们调用Q. 当我使用Q.Edit, 填充一些字段,然后Post,它最终实际上插入了一条新记录。
代码很简单,从对象中读取ID:
Q.SQL.Text := 'select * from SomeTable where ID = :id';
Q.Parameters.ParamValues['id'] := MyObject.ID;
Q.Open;
try
Q.Edit;
try
Q['SomeField']:= MyObject.SomeField;
finally
Q.Post;
end;
finally
Q.Close;
end;
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,它决定插入一条新记录,而不是更新预期的记录。单步执行代码,紧跟在 之后Q.Edit,查询实际上处于Insert模式。
我在这里做错了什么?
ado ×10
sql-server ×6
delphi ×5
asp-classic ×1
azure-devops ×1
com ×1
oledb ×1
permissions ×1
readonly ×1
recordset ×1
sql ×1
vb6 ×1
vba ×1