SqlClient Xml 输出参数“未提供”

发布于 2024-08-18 04:21:28 字数 2234 浏览 5 评论 0原文

运行以下代码时,我收到 SqlException。

“过程或函数‘usp_Search’需要参数‘@pxmlSearchOutput’,但未提供该参数。”

我的参数+请求。

    using (var connection = new SqlConnection(_connectionString))
    {
        using (var command = new SqlCommand("Search.usp_Search", con))
        {

            var pxmlSearchOutput = new SqlParameter();
            pxmlSearchOutput.ParameterName = "@pxmlSearchOutput";
            pxmlSearchOutput.SqlDbType = SqlDbType.Xml;
            pxmlSearchOutput.Direction = ParameterDirection.Output;
            pxmlSearchOutput.Size = 1;
            command.Parameters.Add(pxmlSearchOutput);

            var pxmlSearchInput = new SqlParameter();
            pxmlSearchInput.ParameterName = "@pxmlSearchInput";
            pxmlSearchInput.Value = requestXML;//is valid xml, is a local var
            pxmlSearchInput.SqlDbType = SqlDbType.Xml;
            command.Parameters.Add(pxmlSearchInput);

            var pbitDebug = new SqlParameter();
            pbitDebug.Value = false;
            pbitDebug.ParameterName = "@pbitDebug";
            pbitDebug.SqlDbType = SqlDbType.Bit;
            command.Parameters.Add(pbitDebug);

            var pintErrorNumber = new SqlParameter();
            pintErrorNumber.ParameterName = "@pintErrorNumber";
            pintErrorNumber.SqlDbType = SqlDbType.Int;
            pintErrorNumber.Direction = ParameterDirection.Output;
            command.Parameters.Add(pintErrorNumber);

            connection.Open();
            command.ExecuteScalar();
            connection.Close();
        }
    }

使用 sql profiler,我可以提取以下内容:

        declare @p3 xml
        set @p3=null
        declare @p4 xml
        set @p4=convert(xml,'***Redacted - This is however, valid xml, which convert works on happily***')
        declare @p6 int
        set @p6=NULL
        exec 
        sp_executesql 
        N'Search.usp_Search',
        N'@pxmlSearchOutput xml output,@pxmlSearchInput xml,@pbitDebug bit,@pintErrorNumber int output',
        @pxmlSearchOutput=@p3 output,
        @pxmlSearchInput=@p4,
        @pbitDebug=0,
        @pintErrorNumber=@p6 output
        select @p3, @p6

我无法准确诊断 SQL 出了什么问题(以及它与 .net 代码的关系)。有什么想法吗?

I receive an SqlException when running the following code.

"Procedure or function 'usp_Search' expects parameter '@pxmlSearchOutput', which was not supplied."

My parameters + request.

    using (var connection = new SqlConnection(_connectionString))
    {
        using (var command = new SqlCommand("Search.usp_Search", con))
        {

            var pxmlSearchOutput = new SqlParameter();
            pxmlSearchOutput.ParameterName = "@pxmlSearchOutput";
            pxmlSearchOutput.SqlDbType = SqlDbType.Xml;
            pxmlSearchOutput.Direction = ParameterDirection.Output;
            pxmlSearchOutput.Size = 1;
            command.Parameters.Add(pxmlSearchOutput);

            var pxmlSearchInput = new SqlParameter();
            pxmlSearchInput.ParameterName = "@pxmlSearchInput";
            pxmlSearchInput.Value = requestXML;//is valid xml, is a local var
            pxmlSearchInput.SqlDbType = SqlDbType.Xml;
            command.Parameters.Add(pxmlSearchInput);

            var pbitDebug = new SqlParameter();
            pbitDebug.Value = false;
            pbitDebug.ParameterName = "@pbitDebug";
            pbitDebug.SqlDbType = SqlDbType.Bit;
            command.Parameters.Add(pbitDebug);

            var pintErrorNumber = new SqlParameter();
            pintErrorNumber.ParameterName = "@pintErrorNumber";
            pintErrorNumber.SqlDbType = SqlDbType.Int;
            pintErrorNumber.Direction = ParameterDirection.Output;
            command.Parameters.Add(pintErrorNumber);

            connection.Open();
            command.ExecuteScalar();
            connection.Close();
        }
    }

Using sql profiler, I can extract the following:

        declare @p3 xml
        set @p3=null
        declare @p4 xml
        set @p4=convert(xml,'***Redacted - This is however, valid xml, which convert works on happily***')
        declare @p6 int
        set @p6=NULL
        exec 
        sp_executesql 
        N'Search.usp_Search',
        N'@pxmlSearchOutput xml output,@pxmlSearchInput xml,@pbitDebug bit,@pintErrorNumber int output',
        @pxmlSearchOutput=@p3 output,
        @pxmlSearchInput=@p4,
        @pbitDebug=0,
        @pintErrorNumber=@p6 output
        select @p3, @p6

I am unable to diagnose exactly what is wrong with the SQL (and thus, how it relates to the .net code). Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

肩上的翅膀 2024-08-25 04:21:28

您执行批处理,即 Text 类型的请求:

Search.usp_Search

您确实向该批处理传递了一堆参数,但这些参数都被忽略,因为它们实际上并未在批处理本身中使用。您有两种选择:

  • 在批处理本身中使用传递给批处理的参数: var command = new SqlCommand("exec Search.usp_Search @pxmlSearchOutput output, @pxmlSearchInput,@pbitDebug, @pintErrorNumber output", con))< /code>
  • 告诉 ADO.NEt 您正在进行 RPC 调用,而不仅仅是执行批处理: command.CommandType = CommandType.StoredProcedure;

任一更改都有效(但不能同时执行)。

You execute the batch, a request of type Text:

Search.usp_Search

You do pass a bunch of parameters to this batch, but those are all ignored as they aren't actually used in the batch itself. You have two alternatives:

  • use the parameters passed to the batch in the batch itself: var command = new SqlCommand("exec Search.usp_Search @pxmlSearchOutput output, @pxmlSearchInput,@pbitDebug, @pintErrorNumber output", con))
  • Tell ADO.NEt that you are making an RPC call, not merely executing a batch: command.CommandType = CommandType.StoredProcedure;

Either change will work (but not both).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文