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; }
}
}
}
{
[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;
}
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( " 过程名 " , 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);