4

私は、SQL データベースのフロントエンドとして Excel スプレッドシートを作成し、データに対して複雑な計算を実行する 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 で 2 番目のコードを導入するのではなく、この 1 つの厄介なコードを利用するのが最善のようです。C# を使用して、データ型を変換したり、パラメーターを検証したり、変数を返したりすることも簡単にできます。VBA to C# で疑似非同期メソッドを使用すると、Excel インターフェイスも改善され、UI スレッドでのハングが防止されます。

4

1 に答える 1

0

ADO には非常に優れたテーブル型があります。

「現在、データセットを取得するためのストアド プロシージャは正常に動作しています。」

データセットを切り離します。

その後、ユーザーは Excel でデータを編集します...

デタッチされたデータセットに新しいデータを追加します。デタッチされたデータセットから古いデータを削除する

...そしてそれをデータベースに送り返します。

データセットを再接続します。データを更新します。

myRecordSet.ActiveConnection=oConnection
myRecordSet.UpdateBatch
于 2013-11-28T07:34:47.160 に答える