我正在为我的用户构建一个小型Excel 2010程序,以便从Access 2010数据库快速生成时间表。在我尝试遵循良好的编码约定并希望使用存储过程从数据库中获取所需的所有信息之前,我没有做过很多像这样的项目。
我使用的代码(仅相关部分)如下:
Dim courses As New ADODB.Recordset
Set conn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & fname
conn.Open (strConnection)
Set getCoursescmd = New ADODB.Command
With getCoursescmd
Set .ActiveConnection = conn
.CommandText = "getCoursesByYearAndPeriod"
.CommandType = adCmdStoredProc
.NamedParameters = True
.Parameters.Append .CreateParameter("@Weekday", adInteger)
.Parameters.Append .CreateParameter("@CategoryID", adInteger)
.Parameters.Append .CreateParameter("@Period", adInteger)
.Parameters.Append .CreateParameter("@Year", adInteger)
.Parameters("@Weekday") = WeekDay
.Parameters("@CategoryID") = CategoryIDs.Fields(0).Value
.Parameters("@Period") = Blok
.Parameters("@Year") = Year
.Prepared = True
End With
Set courses = getCoursescmd.Execute() 'This is where it fails
SQL查询在Access 2010中运行完全正常,如下所示(忽略荷兰变量名称):
SELECT Cursussen.*, Weekday(Cursussen.StartDatum,2) AS Dag
FROM Cursussen
WHERE Weekday(Cursussen.StartDatum,2)=[@WeekDay] And Cursussen.Categorie=[@CategoryID] And Cursussen.Blok=[@Period] And Cursussen.Jaar=[@Year]
ORDER BY Cursussen.Naam, Cursussen.Niveau;
我已经在同一个数据库中运行了多个其他存储的查询,这些数据获取或更新数据,甚至一些带参数的数据。我似乎无法弄清楚为什么它在.Execute()
失败了。它抛出了一个运行时错误-2147467259 (80004005) Invalid Operation
,这让我不知道我在这里做错了什么。
非常感谢任何帮助。
答案 0 :(得分:2)
就像@Rory所说,你要么需要提供内联变量
.Parameters.Append .CreateParameter("@Weekday", adInteger, adParamInput, <yourintVar>)
或之后用
添加它们Dim prmWeekday As ADODB.Parameter
SET prmWeekday = .Parameters.Append .CreateParameter("@Weekday", adInteger)
prmWeekday.Value = <yourIntVar>