SqlParameter序列化的问题

SqlParameter remoting 客户端调用服务端方法: DataSet ExecuteProc(string procedurename, SqlParameter[] a);

              调用:  DataSet ds = SqlUtil.ExecuteProc("存储过程名", parameters);//

parameters  为
 SqlParameter[] 类型的实例

 

              报错: 由于安全限制,无法访问类型 System.Runtime.Remoting.ObjRef。原因是

SqlParameter不能序列化.需要添加一个类来转换.

 添加如下类:

namespace Modal.SerSqlParameter
{
    [Serializable]
    
public class SerSqlParameter
    {
        
public SerSqlParameter(SqlParameter sPara)
        {
            
this.paraName = sPara.ParameterName;
            
this.paraLen = sPara.Size;
            
this.paraVal = sPara.Value;
            
this.sqlDbType = sPara.SqlDbType;
        }

        
public SqlParameter ToSqlParameter()
        {
            SqlParameter para 
= new SqlParameter(this.paraName, this.sqlDbType, this.paraLen);
            para.Value 
= this.paraVal;
            
return para;
        }

        
private string paraName = "";
        
public string ParaName
        {
            
get { return this.paraName; }
            
set { this.paraName = value; }

        }

        
private int paraLen = 0;
        
public int ParaLen
        {

            
get { return this.paraLen; }
            
set { this.paraLen = value; }
        }

        
private object paraVal = null;
        
public object ParaVal
        {
            
get { return this.paraVal; }
            
set { this.paraVal = value; }
        }

        
private SqlDbType sqlDbType = SqlDbType.NVarChar;
        
public SqlDbType SqlDbType
        {
            
get { return this.sqlDbType; }

            
set { this.sqlDbType = value; }
        }
    }
}



服务端原来的  

//原来的
public DataSet ExecuteProc(string procedurename, SqlParameter[] arParams)   { 
            DataSet ds 
= SqlUtil.ExecuteProc(procedurename, arParams);
            
return ds;
        }

//修改为
 public DataSet ExecuteProc(string procedurename, IList<SerSqlParameter> arParams)
        {
            SqlParameter[] p 
= new SqlParameter[arParams.Count];
            
for (int i = 0; i < arParams.Count;i++ )
            {
                p[i]
=arParams[i].ToSqlParameter();
            }
            DataSet ds 
= SqlUtil.ExecuteProc(procedurename, p);
            
return ds;
        }

 

客户端修改为 

//原来的调用
DataSet ds = SqlUtil.ExecuteProc("过程名", parameters);

//修改后
 IList<SerSqlParameter> list = new List<SerSqlParameter>();
            
foreach (SqlParameter pa in parameters)
            { 
                SerSqlParameter serparam 
= new SerSqlParameter(pa);
                list.Add(serparam);
            }

 DataSet ds=SqlUtil.ExecuteProc("过程名",list);

 

posted @ 2011-05-20 11:14  左少白  阅读(2468)  评论(2编辑  收藏  举报