我在webservice中这样写:
[WebMethod]
public DataSet Gettest(string sqlstr,SqlParameter[] para)
{
SqlDataAdapter oDataAdapter = new SqlDataAdapter(sqlstr, dbconn);
SqlCommandBuilder oCommandBuilder = new SqlCommandBuilder(oDataAdapter);
         int i;
         for(i=0;i<para.length;i++)
    oDataAdapter.SelectCommand.Parameters.Add(para[i]);
DataSet ds=new DataSet();
oDataAdapter.Fill(ds,"123");
dbconn.Close();
return ds;
}
目的是动态传送sql语句及参数,但是webservice似乎不支持使用SqlParameter这样的复杂类型为参数。请问高手,有什么办法能够解决吗?

解决方案 »

  1.   

    必需实现ISerializable接口的对象才有资格做WebMethod的参数。 可以考虑自己重构该对象。
      

  2.   

    别传输类似SqlParameter这样的参数,即使是它实现了ISerializable也毫无意义。想想吧,SqlParameter是特别针对SQL Server数据库的,而且是应该仅限于持久层的,把SQL参数传输给WebService简直是滥用WebService你的境界还是把WebService仅当作一个方便的细颗粒远程对象来调用,而不是集合客户所需要的大颗粒服务对象。建议找本WebService的书,好好读读吧
      

  3.   

    SqlParameter 确实不应该作为一个参数,你可以把一个数组做为参数来传递是可以的。
      

  4.   

    要看到WEBSERVICE的本質是非持久連接的,是跨平台的.
    非持久連接的就不能用MarshalByRefObject;只能是串行化.
    跨平台,就是用中性的XML作客戶端與服務器端作交流,由此,則XML串行化的只能是對象中的數據成員,而不是對象的方法(當然方法也沒法串行化),客戶端對所串行化的對象一無所知,它所反串行化的也只能是一個數據結構型的對象.想象一下這個場景:一個WINDOWS下的WEBSERVICE傳一個VB或是其它的的對象給UNIX下的客戶端,UNIX下的客戶端能了解這個VB的對象嗎?它只能從VB對象的串行化中了解到其中的數據,對它的方法一無所知,所以反串行化的絕不會是原來的那個VB對象.
    當然,你要強行做的話,也不是不行,無非就是將SqlParameter[] para實現串行化,再在客戶端給用SqlParameter[] para給反串行回來,但我覺得這樣做的話,并不符合WEBSERVICE的本意,方式并不是太好.