这里提出的问题是: -
How long does Access keep unflushed transactions locally?
是关于某些发票生成的问题,这仍然会导致问题。我现在正在尝试使用ADODB重写相同的代码以完全在后端SQL Server数据库上工作,特别是ADODB.Command和一些存储过程。
我试图解决的一个问题是,在旧系统中,我在客户端中创建了一个本地表(称为tmpUKRepeatInvoices
)。我在服务器上制作了一个类似的表。但是,此表的字段是通过跨两个单独数据库的连接创建的。
使用我的新系统更容易使用存储过程填充与开票相关联的服务器上的等效表,并在该存储过程中使用FOR XML PATH('')
子句返回逗号分隔的customerID列表(另一个数据库)使用像这样的查询
SELECT @Subs = (SELECT ''''+SubsID+''',' FROM InvoicingData WHERE SessionID = @SessionID FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)')
SELECT @Customers = LEFT(@Subs,LEN(@Subs)-1)
@Customers是此NVARCHAR(MAX)类型的存储过程的输出参数,将包含我将在下一个查询中使用的文本
我可以在Sql Server Management studio中运行存储过程,它返回一个42000字符的字符串
接下来的查询就是这样。并且可以用于使用针对每个客户的项目数来填充工作表。
SQL = "SELECT COUNT(*) As NoItems, CustomerID FROM CustomerItems WHERE CustomerID IN(" & Customers & " )"
所以我在Access VBA中创建调用来运行存储过程,如此
Dim Customers As String
With cmd
Set .ActiveConnection = Conn
.CommandType = adCmdStoredProc
.CommandText = "CreateInvoicingData"
.Parameters.Append .CreateParameter("@SessionID", adVarWChar, adParamInput, 25, TempVars!SessionID)
.Parameters.Append .CreateParameter("@InvoiceDate", adDate, adParamInput, , Form_Company.InvoiceDate)
.Parameters.Append .CreateParameter("@Currency", adVarWChar, adParamInput, 15, "Pounds")
.Parameters.Append .CreateParameter("@Customers", adVarWChar, adParamOutput, 1000000000)
.Execute
Customers = .Parameters("@FleetCustomers").Value
End With
我遇到的问题是Customers字符串被截断为4000个字符。我尝试将@Customers参数设置为输入adLongVarWChar,但是在.Execute语句中抛出错误,该语句表示"数据类型Ox63是折旧的大对象或LOB,但被标记为输出参数。不支持折旧的大对象作为输出参数。请改用当前大型对象。"
我应该为@Customers参数使用什么类型,以免它被截断或视为折旧?注意:我尝试将此参数的大小设置为-1,但是由于参数错误消息不一致而失败。