簡體   English   中英

將數據集作為參數從C#傳遞到T-SQL存儲過程

[英]Passing a DataSet in to a T-SQL stored procedure as a parameter from C#

我試圖將填充的數據集從C#傳遞到SQL Server存儲過程參數,但是遇到了麻煩。

這是我的C#代碼:

if (tblNoMatch.Rows.Count > 0)
{
    pge.dbconn.ExecuteNonQuery("dbo.MySproc",
                               new SqlParameter("@MyTableParam", tblNoMatch),
                               new SqlParameter("@IsProcessed", "2")
                              );

    pge.dbconn.ShutDown();
}

其中tblNoMatchDataSet類型,並填充有列ID 數據集變量填充了40行ID值。

這是我的SQL結尾:

IF TYPE_ID(N'MyTable') IS NULL
    CREATE TYPE dbo.MyTable AS TABLE(BatchID INT);
GO

ALTER PROCEDURE [dbo].[MySproc] 
    @MyTableParam AS dbo.MyTable READONLY,
    @IsProcessed [smallint] = 0
AS
    IF (SELECT COUNT(*) FROM @MyTableParam) > 0
        --Process Records from Batch 
    BEGIN
        UPDATE [dbo].[MyTable]
        SET [IsProcessed] = ISNULL(@IsProcessed, IsProcessed)
        WHERE [ID] IN (SELECT ID FROM @MyTableParam)
    END

當我使用SQL Server Profiler工具嗅探吞吐量時,我什至看不到@MyTableParam通過,並且在SQL Server端,它被完全忽略了。

我在這里做錯了什么?

提前謝謝了!

編輯:

我進行了更改,因為我知道參數的類型必須為Structured ,但是不幸的是,這對我也沒有幫助:

if (tblNoMatch.Rows.Count > 0)
{
    var tblParameter = new SqlParameter
                           {
                                ParameterName = "@MyTableParam",
                                SqlDbType = SqlDbType.Structured,
                                Value = tblNoMatch
                           };

    pge.dbconn.ExecuteNonQuery("dbo.MySproc", tblParameter,
                               new SqlParameter("@IsProcessed", "2"));

    pge.dbconn.ShutDown();
}

我在這里還想念什么?

嘗試按以下方式指定TypeName ...

tblParameter.TypeName = "dbo.MyTable";

暫無
暫無

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

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