【问题标题】:Type mismatch with date parameter using vba使用 vba 类型与日期参数不匹配
【发布时间】:2022-01-06 09:53:12
【问题描述】:

我有一个如下的 vba 子例程,它传递两个参数(日期搜索到 sql server 存储过程)

**Sub load_data()
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim strConn As String
Dim i, j As Date
'i = InputBox("Enter Date Start")
'j = InputBox("Enter Date Finish")
i = ActiveSheet.Range("B3")
j = ActiveSheet.Range("B4")
Set cn = New ADODB.Connection
strConn = "Provider=SQLOLEDB;"
strConn = strConn & "Data Source=ashcourt_app1;"
strConn = strConn & "Initial Catalog=ashcourt_weighsoft5;"
strConn = strConn & "Integrated Security=SSPI;"
cn.Open strConn
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "ashcourt_invoiced_transactions"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Refresh
cmd.Execute , i, j
Set rs = cmd.Execute()

End Sub**

我的存储过程如下:

**SELECT i.documentid, ia.quantity, ia.Outlet, i.invoicedate, t.EventTimestamp, convert(varchar(7), i.invoicedate, 126) as [invoice month], t.CollectionPostcode, ti.TotalPrice, ia.TotalPrice, 
t.AccountAddressName, t.CollectionAddressName,ia.ProductCode, ia.ProductDescription,
case
when a.AccountNo in('CA030','CE001','CS003','CA009','CA051','CA008','CM033') then 'Internal'
else 'External'
end as [Int/Ext], i.IsPosted
FROM [ASHCOURT_Weighsoft5].[dbo].[InvoiceItem] ia
inner join [ASHCOURT_Weighsoft5].[dbo].[TransactionItem] ti on ia.TransactionItemId = ti.id
inner join [ASHCOURT_Weighsoft5].[dbo].[Invoice] i on ia.InvoiceId = i.id
inner join [ASHCOURT_Weighsoft5].[dbo].[account] a on i.AccountId = a.Id
inner join [ASHCOURT_Weighsoft5].[dbo].[Transaction] t on ti.TransactionId = t.Id
where i.CompanyId = 4 and ia.UnitOfSaleCode = 'cm' and i.Deleted <> 1 and i.InvoiceDate >= @invoicestartdate and i.InvoiceDate <= @invoiceenddate
order by i.documentid**

我有 sub 在命令按钮上运行并收到以下错误:

“参数类型错误、超出可接受范围或相互冲突。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 您是如何定义程序中的参数的? i&j当时的值是多少?
  • 您似乎没有将值传递给 @invoicestartdate@invoiceenddate
  • 嗨。输入的数据采用短日期格式 - 01/11/2021 和 30/11/2021。谢谢。除非我错了,否则 vba 代码应该按照 cmd.execute 定义的顺序将数据传递给参数。

标签: sql vba datetime stored-procedures parameters


【解决方案1】:

我设法通过不同方式传递参数并将它们格式化为存储过程中变量的正确日期/时间格式来解决此问题

cmd.Parameters.Append cmd.CreateParameter("DocumentID", adVarChar, adParamInput, 10, Format(Range("B3").Value, "yyyy-mm-dd"))
cmd.Parameters.Append cmd.CreateParameter("DocumentID", adVarChar, adParamInput, 10, Format(Range("B4").Value, "yyyy-mm-dd"))

【讨论】: