【问题标题】:Passing a DataSet in to a T-SQL stored procedure as a parameter from C#将 DataSet 作为 C# 中的参数传递给 T-SQL 存储过程
【发布时间】:2018-07-06 09:50:49
【问题描述】:

我正在尝试将填充的数据集从 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();
}

我还缺少什么?

【问题讨论】:

  • 什么是pge

标签: c# sql-server parameters dataset profiler


【解决方案1】:

尝试按如下方式指定 TypeName...

tblParameter.TypeName = "dbo.MyTable";

【讨论】:

  • 很遗憾没有,仍然没有将参数传递给我的 SPROC。它甚至没有出现在我的分析器命中...我还能尝试什么?
猜你喜欢
  • 2011-07-21
  • 2020-04-24
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2010-10-19
  • 1970-01-01
相关资源
最近更新 更多