【问题标题】:Passing XML parameter to a stored procedure via ASMX web service通过 ASMX Web 服务将 XML 参数传递给存储过程
【发布时间】:2012-11-14 22:03:50
【问题描述】:

我有一个 SQL Server 2005 存储过程,其签名如下:

CREATE PROCEDURE [dbo].[ProcTRequest] 
   @Pxml xml, @ClientCode varchar(10) 
AS
BEGIN
  ...
END

我的任务是编写一个.asmx Web 服务来调用这个存储过程。这是我遇到障碍的地方。

如果参数@Pxml在C# web方法中指定为字符串,我们得到

服务器无法处理请求。

然后尝试XmlText作为@Pxml的类型,结果是

服务器无法处理请求。方法 MyWebService.MyWebMethod 无法反映。有一个错误 反映“PXml”。 ->;反映类型有错误 'System.Xml.XmlText'。 -> System.Xml.XmlText 不能用作:'xml 元素'。

从 C# Web 方法调用此存储过程的正确方法是什么?请注意,@Pxml 参数将始终是格式良好的 XML。

将调用此 Web 服务的人正在 Unix 系统上使用 Curl。

虽然要求是一个 ASMX,但如果这可以通过 WCF 实现,你能告诉我一段伪代码是如何实现的吗?我还不熟悉 WCF。

请帮忙。谢谢你。

更新:这就是我对 SP 的称呼

 [WebMethod]
 public string GetRequestID(string PXml, string clientcode)
    {
        Database db = DatabaseFactory.CreateDatabase();
        using (IDataReader dr = db.ExecuteReader("ProcRequestID", PXml, clientcode))
        {
            return dr["RequestID"].ToString();
        }
    }

【问题讨论】:

    标签: c# wcf sql-server-2005 stored-procedures asmx


    【解决方案1】:

    你不能在 ASMX 接口上使用 string(所以调用者会向你发送一个字符串),但是在 ASMX Web 服务中,你可以在存储过程调用中定义 @PXml 参数作为SqlDbType.Xml?我认为这应该可行....

    类似于:

    [WebMethod]
    public void MyWebMethod(string input, string clientCode)
    {
            using (SqlConnection conn = new SqlConnection(your-connection-string-here))
            using (SqlCommand cmd = new SqlCommand("dbo.ProcTRequest", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
    
                cmd.Parameters.Add("@Pxml", SqlDbType.Xml);
                cmd.Parameters.Add("@ClientCode", SqlDbType.VarChar, 10);
    
                cmd.Parameters["@Pxml"].Value = input;
                cmd.Parameters["@ClientCode"].Value = clientCode;
    
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
    }
    

    由于您只是调用存储的过程并且不期望返回结果集 - 使用 ExecuteNonQuery 而不是 ExecuteReader

    同样非常重要:告诉 ADO.NET 你正在调用一个存储过程!这就是这条线的作用:

                cmd.CommandType = CommandType.StoredProcedure;
    

    否则,默认情况下,ADO.NET 期望获得完整的内联 SQL 语句,并且可能无法解析和执行该语句......

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 2010-10-19
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多