0

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

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

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

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

服务器无法处理请求。

然后尝试XmlText作为 for 的类型@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();
        }
    }
4

1 回答 1

2

您不能在 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 语句,并且可能无法解析和执行该语句......

于 2012-11-14T22:20:20.483 回答