通过ASMX Web服务将XML参数传递给存储过程

时间:2012-11-14 22:03:50

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

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

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

我的任务是编写一个调用此存储过程的.asmx Web服务。这是我有一个块的地方。

如果在C#web方法中将参数@Pxml指定为字符串,则为

  

服务器无法处理请求。

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

1 个答案:

答案 0 :(得分:2)

您无法在ASMX界面上使用字符串(因此调用者会向您发送字符串),但在ASMX Web服务中,您可以在存储中定义@PXml参数程序调用{​​{1}}?我认为应该有用......

有些事情:

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

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

ExecuteReader

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