通过ASMX Web服务
问题描述:
我有了这样的签名的SQL Server 2005的存储过程传递XML参数的存储过程:通过ASMX Web服务
CREATE PROCEDURE [dbo].[ProcTRequest]
@Pxml xml, @ClientCode varchar(10)
AS
BEGIN
...
END
我与写作.asmx
网络服务,将调用此任务存储过程。这是我有一个块的地方。
如果参数@Pxml
被指定为C#Web方法的字符串,我们得到
服务器无法处理请求。
然后试图XmlText
作为@Pxml
的类型,这导致
服务器无法处理请求。方法MyWebService.MyWebMethod无法反映。反映'PXml'的错误 。 - >;反映类型 'System.Xml.XmlText'的错误。 - > System.Xml.XmlText不能用作:'xml element'。
从C#web方法调用此存储过程的正确方法是什么?请注意,@Pxml
参数将始终是格式良好的XML。
将调用此Web服务的人在Unix系统上使用Curl。
虽然要求是一个ASMX,如果这可以通过WCF实现,你可以告诉我怎么用一段伪代码?我还不熟悉WCF。
请帮忙。谢谢。
UPDATE:这是我如何调用该SP的ASMX接口上
[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 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语句,可能只是无法解析和执行....