我有一个VB6应用程序通过ADO访问MSSQL2000服务器上的单个表.我正在使用只读访问权限(adOpenStatic,adLockReadOnly)网络中还有其他应用程序可以对表进行更改.
出于某种原因,我收到的错误是我的应用程序被选为死锁受害者.
我真的很困惑:当我从一张桌子上读书时为什么会出现僵局?我期待超时,因为其他应用程序的编写,但不是死锁......
有人可以对此有所了解吗?
更新:2009-06-15我仍然对这个问题的解决方案感兴趣.所以我提供了更多信息:
我需要将大量SQL查询转换为存储过程.我有一些代码在一个Delphi过程中一次更新大约20或30个值.我可以处理创建存储过程来做这样的事情.问题是我将参数传递给存储过程的方式非常笨重,如下所示:
with stored_procedure do......
Param := Parameters.AddParameter;
Param.Name := '@SSN';
Param.Value := edtSSN.text;
Param := Parameters.AddParameter;
Param.Name := '@FirstName';
Param.Value := edtFirstName.Text;
Param := Parameters.AddParameter;
Param.Name := '@LastName';
Param.Value := edtLastName.Text;
Param := Parameters.AddParameter;
Param.Name := '@UserRID';
Param.Value:= GetRIDFromCombo(cbUser);
Run Code Online (Sandbox Code Playgroud)
我也不确定是否会导致内存泄漏(是否需要释放此类TParameter对象?)
任何人都有更好的方法来处理大量的参数?(我不能使用新的库.我必须使用ADO,我使用的SQL是MSSQL)(另外,我不使用ADO.net)
我在Sql Server 2005中有一个存储过程,其varchar输入参数定义为:
@Value varchar(24) = NULL
Run Code Online (Sandbox Code Playgroud)
在我的VB6应用程序中,我尝试使用ADO函数设置参数:
Set prmParamVal = cmdChkParam.CreateParameter(, adVarChar, adParamInput, Len(paramValue), paramValue)
Run Code Online (Sandbox Code Playgroud)
如果我尝试传递的值是一个空(零长度)字符串,那么我得到以下错误:
ADODB.Connection错误'800a0e7c'参数对象未正确定义.提供的信息不一致或不完整.
我试图传递NULL值而不是空字符串,但这会导致不同的错误.
如何将空字符串或NULL值传递给存储过程?
我已经阅读了很多文章和搜索论坛(甚至多次发现我的问题),但没有正确的答案.
到目前为止空字符串的解决方法是设置length = 1或设置string =""(空格).但那不是很好,我倾向于发送NULL.我还尝试将paramValue设置为vbNull,Null,vbNullString或者设置prmParamVal.value = Empty而没有任何运气!
有没有更快的方法来迭代ADO数据集而不是
while (not ADOQuery1.Eof) do
begin
/* Do something */
ADOQuery1.Next;
end;
Run Code Online (Sandbox Code Playgroud)
我需要扫描大约9000个项目的数据集,并且只提取与预定义的分支编号集匹配的记录.
我正在测试使用单个INSERT语句插入多行的速度.
例如:INSERT INTO [MyTable] VALUES(5,'dog'),(6,'cat'),(3,'fish)
这是非常快的,直到我在一个语句上传递50行,然后速度显着下降.
插入10000行,批量为50,需要0.9秒.插入10000行,批量为51,需要5.7秒.
我的问题有两个部分:
我的测试是在c ++和ADO中完成的.
编辑:看起来下拉点不是50行,而是1000列.我得到了50行20列或100行10列的类似结果.
我在excel中有以下UDF,它使用ADO连接到我的MSSQL服务器.它应该执行标量udf"D100601RVDATABearingAllow".
由于某种原因,我尝试附加的参数不会发送到sql server.仅在服务器上:
SELECT dbo.D100601RVDATABearingAllow
Run Code Online (Sandbox Code Playgroud)
到达.
我的EXFEL UDF:
Function RVDATA(Fastener) As Long
Dim cnt As ADODB.Connection
Dim rst As ADODB.Recordset
Dim Cmd1 As ADODB.Command
Dim stSQL As String
Const stADO As String = "Provider=SQLOLEDB.1;Data ................"
'----------------------------------------------------------
Set cnt = New ADODB.Connection
With cnt
.ConnectionTimeout = 3
.CursorLocation = adUseClient
.Open stADO
.CommandTimeout = 3
End With
'----------------------------------------------------------
Set Cmd1 = New ADODB.Command
Cmd1.ActiveConnection = cnt
Cmd1.CommandText = "dbo.D100601RVDATABearingAllow"
Cmd1.CommandType = adCmdStoredProc
'----------------------------------------------------------
Set Param1 = Cmd1.CreateParameter("Fastener", adInteger, adParamInput, 5)
Param1.Value …Run Code Online (Sandbox Code Playgroud) 我想在内存中发布一些子行,然后有条件地发布它们,或者不将它们发布到底层SQL数据库,具体取决于父行是否已发布或未发布.我不需要完整的ORM,但可能就是这样:
尝试从心理上考虑如何使用delphi数据感知控件和TADOQuery或其他ADO对象来完成上述操作.如果有一种非ADO特定的方法,我也对此感兴趣,我只是把ADO扔到那里因为我碰巧在我当前的应用程序中使用MS-SQL Server和ADO.
因此,在我之前工作了很短时间的雇主中,他们有一个TMasterDetail专门编写的课程,用于将上述内容添加到ADO记录集中.它有时会起作用,有时候会失败一些非常有趣且难以修复的方法.
是否有任何内置于VCL中的内容,或任何具有执行此技术的强大方法的第三方组件?如果没有,我正在谈论上面要求ORM?我认为ORM被很多人认为是"坏",但上面是一个非常自然的UI模式,可能会出现在一百万个应用程序中.如果我使用非ADO非Delphi-db-dataset工作方式,上面几乎不会出现我可能编写的任何持久层中的问题,但是当主键使用标识值链接时主人和细节行进入画面,事情变得复杂.
更新:在这种情况下,交易并不理想.(提交/回滚对我来说太粗糙了.)
如何使用Delphi 7更新SQL Server 2012上的DateTime,保留毫秒数ADOQuery.ExecSQL?
SQL Server似乎降低了秒的精度,所以我在SQL Server 2012 DateTime2[7]字段上没有毫秒或微秒.使用此ADO查询,MS Access不会丢弃毫秒.以下ADOQuery代码似乎适用于我关心的所有DataTypes,除了SQL Server DateTime.
我使用的连接字符串是:
Provider=SQLNCLI11.1;Integrated Security=SSPI;User ID="";Initial File Name="";Server SPN="";Data Source=myPC\SQLSERVER2012EXP;Initial Catalog=MyDatabase
这是我的代码:
function ExecuteNonQry(Conn:TADOConnection;Sql:string;Params:Variant): Integer;
{ Execute a query that does not return a recordset. Returns number of rows
affected. Params can be any unique name, they are all dealt with in order
of appearance in the parameter array and in the sql string.
E.g. SQL
'INSERT INTO customers (id,name,country) VALUES (:id,:name,:country)';
E.g. calling code:
sql …Run Code Online (Sandbox Code Playgroud) 我试图在XE6中使用断开连接的ADO Recordset.这个想法是你正常打开记录集,然后你将记录集的ActiveConnection设置为你的语言相当于null/ Nothing/ nil:
rs.Set_ActiveConnection(null);
Delphi 5中的以下示例工作正常:
var rs: _Recordset;
rs := CoRecordset.Create;
rs.CursorLocation := adUseClient; //the default for a Recordset is adUseServer (Connection.Execute's default is adUseClient)
rs.CursorType := adOpenForwardOnly; //the default
rs.Open(CommandText, Conn,
adOpenForwardOnly, //CursorType
adLockReadOnly, //LockType
adCmdText);
//Disconnect the recordset by setting the .ActiveConnection to null
rs.Set_ActiveConnection(nil);
Run Code Online (Sandbox Code Playgroud)
问题是我无法在Delphi XE6中使用它.在Delphi 5中我会成功致电:
rs.Set_ActiveConnection(nil);
Run Code Online (Sandbox Code Playgroud)
一切都很出色.它起作用,因为_Recordset接口被声明为:
procedure Set_ActiveConnection(const pvar: IDispatch); safecall;
Run Code Online (Sandbox Code Playgroud)
所以通过是有效的nil; 它起作用了.
在XE6中,退出变为:
procedure Set_ActiveConnection(pvar: OleVariant); …Run Code Online (Sandbox Code Playgroud) 我在我的数据报告中使用ado shape命令,它工作正常,但当我的聚合函数CALC(agrProfit/agrExtended*100)为null或0/0*100时,它显示一般错误和数据报告未显示.请帮忙.
mRS.Open "SHAPE {select products.productid,products.productcode,isnull(products.description,descr) as description,isnull(vendor.description,'*** NOT FOUND ***') as groupdescription, " & _
"isnull(sum(totalcost),0) as mTotalCost,isnull(sum(extended) - (sum(totalcost)),0) as mProfit, " & _
"sum(charges) as mCharges,sum(discount) as mDiscounts, sum(retextended) as mReturns, " & _
"reportuom, sum(totalcost) as mTotalCost, isnull(case when sum(extended) = 0 then 0 else (sum(extended) - (sum(totalcost)))/sum(extended)*100 end,0) as mgpm, sum(totalcost) as mTotalCost, case when sum(extended) = 0 then 0 else (sum(extended) - (sum(totalcost)))/sum(extended)*100 end as mgpm, sum(case when extended < 0 then (0 - …Run Code Online (Sandbox Code Playgroud)