OracleParameter[] paras = new OracleParameter[9];我想把存储过程的参数对象paras保存到viewstate里面,出现异常:
类型“System.Data.OracleClient.OracleParameter”必须标记为 Serializable 或者具有 ReferenceConverter 以外的 TypeConverter,才能被放置在视图状态中。请问有什么方法可以实现吗?如果不能保存在viewstate里,还有其他保存到页面级别的方法吗?

解决方案 »

  1.   

    想在以后使用它,使用session会带来其他问题
      

  2.   

    我是想做一个分页显示数据的控件,由于不同的地方都使用这个控件,使用的存储过程也不相同,所以想把存储过程名和参数传进去,翻页的时候直接调用存储过程,所以想在控件里缓存存储过程名和参数,但用viewstate就出现了上述的问题。请问还有什么其他实现方法吗?
      

  3.   

    放个容器里 ARRAYLIST 再放arraylist到VIEWSTATE 呵呵
      

  4.   

    还是出现同样的异常,因为arraylist里面放的还是OracleParameter
      

  5.   

    参考下这里的做法
    http://community.csdn.net/Expert/topic/4602/4602005.xml?temp=.7006342
      

  6.   

    to singlepine(小山) :参照了那个帖子里hdt(倦怠)的做法,代码如下:
    public void SetViewState_SPPara(OracleParameter[] para)
    { System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    bf.Serialize( ms , para);
    ms.Seek( 0 , System.IO.SeekOrigin.Begin);
    byte[] b = new byte[ ms.Length ];
    ms.Read( b ,0 , b.Length );
    ViewState["spPara"] = b;
    }还是出现异常,是在序列化的那行代码
    bf.Serialize( ms , para);程序集 System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 中的类型 System.Data.OracleClient.OracleParameter 未标记为可序列化所以还是那个问题,OracleParameter不能序列化
      

  7.   

    建议你用 Cache 来保存。然后定义合适的 CacheKey 来存取。
    该 Key 只要能关联到你这个特定的查询就可以了。比如用 sql 语句替代掉一些字符串,拼接上参数值就可以构造一个 key.
      

  8.   

    用cache可以暂时解决问题,但cache过期或清空的时候还是会引起问题
      

  9.   

    还有什么方法能把OracleParameter保存到页面级呢
      

  10.   

    Cache 过期时怎么会有问题呢,我这么说是要你用 Cache 做一个惰性加载模式。每次你去取他的时候自己会判断是否存在的啊,如果不存在则创建新的,并且把这个新创建的对象塞进去。
      

  11.   

    直接用查询语句的方式方也就可以了。为什么一定要用存储过程呢?存储过程里面放的不也是 SQL语句吗?在程序里组串不也是一样的吗?
      

  12.   

    to NeilChen123这个对象不固定,有多个存储过程的参数对象都可能存到cache里,而且参数的值可以缓存,如果过期了,要重新创建对应的参数对象比较麻烦