簡體   English   中英

將用戶定義的表類型從VBA傳遞到SQL

[英]Pass user-defined table type from VBA to SQL

我的任務是創建一個Excel電子表格作為SQL數據庫的前端和一些C#,它對數據執行復雜的計算。 我的老板希望將前端作為電子表格,對於VBA來說計算似乎過於復雜。

目前,檢索數據集的存儲過程工作正常。 然后,用戶將在Excel中編輯數據並將其發送回數據庫。 需要將數據作為新集插入,保留先前集的記錄。 因此,我編寫了以下SQL存儲過程來完成此任務:

DECLARE @Now DATETIME = GETDATE()
DECLARE @DataSetID SMALLINT = (SELECT ISNULL(MAX([DataSetID]), 0) FROM [dbo].[tbl_DataSet]) + 1

--Add DataSet entry
INSERT INTO [dbo].[tbl_DataSet] ([DataSetID], [InputDate])
SELECT @DataSetID, @Now

--Add latest data
INSERT INTO [dbo].[tbl_Data] ([DataSetID], [DataID], [Amount])
SELECT @DataSetID, [DataID], [Amount]
FROM @DataTable
ORDER BY [DataID]

這意味着VBA代碼需要能夠調用存儲過程,傳入用戶定義的表類型參數@DataTable AS [dbo]。[typ_DataTable] READONLY。

我目前調用SQL用戶存儲過程的方法,傳入標准數據類型參數:

Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.ConnectionString = getConnectionString()
cnn.CursorLocation = adUseClient
cnn.Open

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.Parameters.Append cmd.CreateParameter("in", adInteger, adParamInput, , 1)
cmd.Parameters.Append cmd.CreateParameter("bReturn", adBoolean, adParamOutput)
cmd.ActiveConnection = cnn
cmd.CommandText = ProcedureName
cmd.CommandType = adCmdStoredProc

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Set rst = cmd.Execute()

是否有一種傳遞用戶定義的表類型的簡單方法?

或者,是否有一個完全更好的系統,我可以用它來做到這一點?

我現在能想到的唯一解決方法是將數據傳遞給C#,然后使用以下命令發送到數據庫:

command.Parameters.Add(new SqlParameter {
    ParameterName = "@DataTable",
    Value = dataTable,
    TypeName = "[dbo].[typ_DataTable]",
    SqlDbType = SqlDbType.Structured }); 

然而,這似乎有點迂回。

謝謝。

更新:

由於已經存在從C#到Excel的管道,因此最好使用這一個令人討厭的代碼,而不是使用Excel < - > SQL引入第二個代碼。 C#還可以很容易地用於轉換數據類型並驗證任何參數或返回變量。 使用VBA到C#的偽異步方法也將改進Excel界面,防止在UI線程上掛起。

ADO有一個非常好的表類型。

“目前,檢索數據集的存儲過程運行良好。”

分離數據集。

然后,用戶將在Excel中編輯數據...

將新數據附加到分離的數據集。 從分離的數據集中刪除舊數據

...並將其發送回數據庫。

重新附加數據集。 更新數據:

myRecordSet.ActiveConnection=oConnection
myRecordSet.UpdateBatch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM