2014-09-24 27 views
0

似乎是一個常見問題,但我無法獲得任何示例來處理我的代碼。使用Excel VBA將參數傳遞給存儲過程的問題

對不起,如果這是微不足道的,因爲我是DBA而不是開發人員。

我有一個存儲過程,需要兩個參數LaborRateEndDateLaborRate是一個十進制數據類型,將從工作表BOMSum和單元格G1中獲取它的變量。 EndDate是日期數據類型,將從工作表BOMSum和單元格G2中獲取其變量。即使瀏覽了本網站上的教程和其他建議,我的所有嘗試都失敗了。

這是我非常簡單的代碼我開始了實際運行正確的,但不指定任何PARAMS運行:

Sub Execute_SP() 
Dim conn As ADODB.Connection 
Dim cmd As ADODB.Command 

Set conn = New ADODB.Connection 
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID=<DB_User>;Password=<pwd>" 
conn.Open 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = "CostingInfo" 

cmd.Execute 
conn.Close 

Set conn = Nothing 
Set cmd = Nothing 
ActiveWorkbook.RefreshAll 
End Sub 

這是我現在有。我試圖從G1和G2傳遞兩個參數LaborRateEndDate

Sub Execute_SP() 
Dim conn As ADODB.Connection 
Dim cmd As ADODB.Command 
Dim prm1 As ADODB.Parameter 
Dim prm2 As ADODB.Parameter 

Set conn = New ADODB.Connection 
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID=<DB_User>;Password=<pwd>" 
conn.Open 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = CostingInfo 
prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput) 
prm1.Precision = 28 
prm1.NumericScale = 4 
cmd.Parameters.Append prm1 
prm1.Value = ActiveSheet.Range("G1").Text 
prm2 = cmd.CreateParameter("@endDate", adDate, adParamInput) 
prm2.Value = ActiveSheet.Range("G2").Text 
cmd.Parameters.Append prm2 
cmd.Execute 
conn.Close 

Set conn = Nothing 
Set cmd = Nothing 
ActiveWorkbook.RefreshAll 
End Sub 

我已經收到有關精度和對象變量或塊變量未設置的錯誤。我很困惑,很難從VBA編程中移除。

編輯:經過Rude Dawg的一些建議,現在是我的代碼。現在我得到一個「語法錯誤或訪問衝突」錯誤,這在調試點,遇到的問題的cmd.Execute部分:

Sub Execute_SP() 
Dim conn As ADODB.Connection 
Dim cmd As ADODB.Command 
Dim prm1 As ADODB.Parameter 
Dim prm2 As ADODB.Parameter 

Set conn = New ADODB.Connection 
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID= <DB_User>;Password=<pwd>" 
conn.Open 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = CostingInfo 
set prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput) 
prm1.Precision = 28 
prm1.NumericScale = 4 
prm1.Value = Sheets("BOMSum").Range("G1").VALUE 
cmd.Parameters.Append prm1 
set prm2 = cmd.CreateParameter("@endDate", adDate, adParamInput) 
prm2.Value = Sheets("BOMSum").Range("G2").VALUE 
cmd.Parameters.Append prm2 
cmd.Execute 
conn.Close 

Set conn = Nothing 
Set cmd = Nothing 
ActiveWorkbook.RefreshAll 
End Sub 

回答

1

結束查找問題。

在將我的頭撞向我的鍵盤後,我發現我的存儲過程名稱周圍沒有雙引號。

這裏是我的最終結果,如果有人有興趣:

Sub Execute_SP() 
Dim conn As ADODB.Connection 
Dim cmd As ADODB.Command 
Dim prm1 As ADODB.Parameter 
Dim prm2 As ADODB.Parameter 
Dim rs As ADODB.Recordset 

Set conn = New ADODB.Connection 
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID= <DB_User>;Password=<pwd>" 

conn.Open 

Set cmd = New ADODB.Command 
cmd.ActiveConnection = conn 
cmd.CommandType = adCmdStoredProc 
Set prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput, 14,  ThisWorkbook.Sheets("BOMSumTbl").Range("G1").Value) 
prm1.Precision = 28 
prm1.NumericScale = 4 
cmd.Parameters.Append prm1 
Set prm2 = cmd.CreateParameter("@EndDate", adDate, adParamInput, 7,  ThisWorkbook.Sheets("BOMSumTbl").Range("G2").Value) 
cmd.Parameters.Append prm2 
cmd.CommandText = "CostingInfo" 
Set rs = cmd.Execute(adCmdStoredProc) 
conn.Close 

Set conn = Nothing 
Set cmd = Nothing 
Set rs = Nothing 
ActiveWorkbook.RefreshAll 
End Sub 
+0

我有一個類似的問題與我的存儲過程名稱的雙括號:'[[spDistPOCheckOrderConfirmation_byLine]]' – nutsch 2016-09-19 18:30:09

1

嘗試這種輕微的mod輸入。

set prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput) 
prm1.Precision = 28 
prm1.NumericScale = 4 
cmd.Parameters.Append prm1 
prm1.Value = Sheets("BOMSum").Range("G1").VALUE 
set prm2 = cmd.CreateParameter("@endDate", adDate, adParamInput) 
prm2.Value = Sheets("BOMSum").Range("G2").VALUE 
cmd.Parameters.Append prm2 

另外,爲什麼在添加單元格「G1」值之前添加prm1?這是一個輕微的錯字?

+0

耶先生,感謝您的建議。這確實是一個錯字。我用你的建議,它拋出一個「下標超出範圍」的錯誤。當我調試時,它突出顯示了這一行代碼:prm1.Value = Sheets(「BOMSum」)。Range(「G1」)。Value – jdidsQAA 2014-09-24 20:00:36

+0

你肯定有一張名爲'BOMSum'的表是否正確?確保prm1參數具有.value屬性。如果這兩個都是真的,我唯一能想到的就是嘗試'thisworkbook.sheets(「BOMSum」)。Range(「G1」)。value' – 2014-09-24 20:38:30

+0

Yup。絕對有一張名爲「BOMSum」的表。更改後,它會在代碼的「cmd.Execute」部分引發語法錯誤或訪問衝突錯誤。 – jdidsQAA 2014-09-24 20:51:22

相關問題