我的任务是创建一个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线程上。
答案 0 :(得分:0)
ADO有一个非常好的表类型。
“目前,检索数据集的存储过程运行正常。”
分离数据集。
然后,用户将在Excel中编辑数据...
将新数据附加到分离的数据集。从分离的数据集中删除旧数据
...并将其发回数据库。
重新附加数据集。更新数据:
myRecordSet.ActiveConnection=oConnection
myRecordSet.UpdateBatch