sql - 将用户定义的表类型从 VBA 传递到 SQL

标签 sql vba sqldatatypes

我的任务是创建一个 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 有一个非常好的表类型。

"Presently, the stored procedure to retrieve the dataset works fine. "



分离数据集。

The user will then edit the data in Excel...



将新数据附加到分离的数据集。从分离的数据集中删除旧数据

... and send it back to the database.



重新附加数据集。更新数据:
myRecordSet.ActiveConnection=oConnection
myRecordSet.UpdateBatch

关于sql - 将用户定义的表类型从 VBA 传递到 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17041519/

相关文章:

mysql - sql查询根据兴趣匹配人

excel - 如何在VBA中确定夏令时?

php - 如何在数据库中存储精确的十进制值

sql-server - SQL Server text、ntext、image 数据类型问题

使用 str_to_date 从 .txt 文件读取日期类型时出现 mysql 问题

mysql - 修改列的最简单方法?

SQL:在处理 SQL 查询/ View /等时是否可以执行 TDD?

sql - 什么是本地端和远程端?

mysql - 从excel vba连接到mysql时sql中的类型不匹配错误

loops - 为什么这个 IF 语句不需要 End IF