我有一个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();
}
}
答案 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语句,并且可能无法解析并执行该语句....