C# 通过ASMXWeb服务将XML参数传递给存储过程

C# 通过ASMXWeb服务将XML参数传递给存储过程,c#,wcf,sql-server-2005,stored-procedures,asmx,C#,Wcf,Sql Server 2005,Stored Procedures,Asmx,我有一个SQL Server 2005存储过程,其签名如下: CREATE PROCEDURE [dbo].[ProcTRequest] @Pxml xml, @ClientCode varchar(10) AS BEGIN ... END 我的任务是编写一个调用此存储过程的.asmxweb服务。这就是我的街区 如果参数@Pxml在C#web方法中被指定为string,我们得到 服务器无法处理请求 然后尝试将XmlText作为@Pxml的类型,结果 服务器无法处理请求。无法反映方

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

CREATE PROCEDURE [dbo].[ProcTRequest] 
   @Pxml xml, @ClientCode varchar(10) 
AS
BEGIN
  ...
END
我的任务是编写一个调用此存储过程的
.asmx
web服务。这就是我的街区

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

服务器无法处理请求

然后尝试将
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();
        }
    }

您不能在ASMX接口上使用字符串(因此调用者向您发送一个字符串),但在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语句,可能无法解析和执行该语句