给你个我的程序代码试一试吧 public ModuleData GetAllModuleData() { ModuleData ds = new ModuleData(); using(SqlConnection conn = new SqlConnection(connectString)) { SqlCommand cmd = new SqlCommand("权限_模块信息_SelectAll",conn); cmd.CommandType = CommandType.StoredProcedure; SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.TableMappings.AddRange(new System.Data.Common.DataTableMapping[] { new System.Data.Common.DataTableMapping("Table", "模块信息", new System.Data.Common.DataColumnMapping[] { new System.Data.Common.DataColumnMapping("模块编号", "模块编号"), new System.Data.Common.DataColumnMapping("模块名称", "模块名称"), new System.Data.Common.DataColumnMapping("父级层次", "父级层次"), new System.Data.Common.DataColumnMapping("子级层次", "子级层次"), new System.Data.Common.DataColumnMapping("装配件名称", "装配件名称"), new System.Data.Common.DataColumnMapping("启动类名", "启动类名"), new System.Data.Common.DataColumnMapping("启动方法", "启动方法"), new System.Data.Common.DataColumnMapping("资源文件", "资源文件"), new System.Data.Common.DataColumnMapping("资源空间", "资源空间"), new System.Data.Common.DataColumnMapping("资源名称", "资源名称")}) }); sda.Fill(ds); } return ds; }
现在又有新问题了,我新加了一个带参数的构造函数 public GetDbInfo() { } public GetDbInfo(string strSqlVal) { objDataSet = new DataSet(); 连接数据库,填充DATASET..... }然后在客户端调用 RemotingConfiguration.RegisterWellKnownClientType(typeof(GetDbInfo),"tcp://localhost:8085/SrvRemoting/GetRemotingDataSet"); GetDbInfo objGetDbInfo = new GetDbInfo(strSql);
报错"当正在连接已知对象时,不能运行非默认构造函数"
用Singleton就可返回这个datagset 那么用SingleCall应当如何做呢
采用服务端激活的方式时,只能用默认的构造函数,本能带参数,要想带参数,只能用客户端激活 Singleton和SingleCall的用法基本一样,差别就是singlecall不能保留状态,比如public interface IA { int function1(); int function2(); }public class A:MarshalByRefObject,IA { int i=0; public A() { i=100; }
public int function1() { return i; } public int function1() { i+=100; return i; } }如果你用singlecall调用A的2个方法时,返回的结果function1总是100,function2总时200;因为在每次调用方法是,尽管使用的是同一个对象,总是先调用默认的构造函数
在一个类GetDbInfo中有一个方法GetDataSet,它返回一个DATASET,并把它编译成了一个DLL private DataSet objDataSet;
private string strLibInfo = "haha"; public string LibInfo //返回状态
{
get{return strLibInfo;}
} public DataSet GetDataSet() // 返回一个DATASET
{
objDataSet = new DataSet();
try
{
objOleDbConnect = new OleDbConnection();
objOleDataAdapter = new OleDbDataAdapter();
objOleDbCommand = new OleDbCommand();
objOleDbConnect.ConnectionString=@"连接数据库字串";
objOleDbConnect.Open(); objOleDbCommand.Connection = objOleDbConnect;
objOleDbCommand.CommandText = strSql;
objOleDataAdapter.SelectCommand = objOleDbCommand;
objOleDataAdapter.Fill(objDataSet,"resume");
strLibInfo = "得到DataSet";
}
catch(Exception e)
{
strLibInfo = "出现错误:" + e.Message;
}
finally
{
objOleDbConnect.Close();
objOleDbConnect.Dispose();
objOleDataAdapter.Dispose();
objOleDbCommand.Dispose();
}
return objDataSet;}
在另一个WINFORM程序中引用了这个DLL,并实例化这个类
DataSet objClientDataSet ;
GetDbInfo objGetDbInfo = new GetDbInfo();
objClientDataSet = objGetDbInfo.GetDataSet();程序执行正常,未出错,但objClientDataSet 是空的,并没有数据进来。
SQL语句我试过了,是有记录的
更奇怪的是LibInfo 返回的值是"haha",如果执行了GetDataSet这个方法的话那么
LibInfo 的返回值应当是 "得到DataSet",这是为什么呢?楼上的,现在的问题是GetDataSet这个方法好象没有执行,所以用你的那个方法也一样不能返回DATASET,呵呵
你可以print出来看看
所以表名是"resume"
可以使用DataMapping属性建立其与强类型数据集之间的关系,在Fill之前使用,
这样SqlDataAdapter在填充的时候会自动根据映射关系填充到相应的数据表中
objOleDataAdapter.Fill(objDataSet,"resume");
这一句改为
objOleDataAdapter.Fill(objDataSet);
是吗?
我这就试试
感觉好象就没有执行getdateset这个方法
objGetDbInfo.LibInfo 的值为"服务启动",按理说调用GetDataSet这个方法后它的值应当为"得到DataSet"才对呀
{
ModuleData ds = new ModuleData();
using(SqlConnection conn = new SqlConnection(connectString))
{
SqlCommand cmd = new SqlCommand("权限_模块信息_SelectAll",conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.TableMappings.AddRange(new System.Data.Common.DataTableMapping[] {
new System.Data.Common.DataTableMapping("Table", "模块信息",
new System.Data.Common.DataColumnMapping[] {
new System.Data.Common.DataColumnMapping("模块编号", "模块编号"),
new System.Data.Common.DataColumnMapping("模块名称", "模块名称"),
new System.Data.Common.DataColumnMapping("父级层次", "父级层次"),
new System.Data.Common.DataColumnMapping("子级层次", "子级层次"),
new System.Data.Common.DataColumnMapping("装配件名称", "装配件名称"),
new System.Data.Common.DataColumnMapping("启动类名", "启动类名"),
new System.Data.Common.DataColumnMapping("启动方法", "启动方法"),
new System.Data.Common.DataColumnMapping("资源文件", "资源文件"),
new System.Data.Common.DataColumnMapping("资源空间", "资源空间"),
new System.Data.Common.DataColumnMapping("资源名称", "资源名称")})
});
sda.Fill(ds);
}
return ds;
}
:(
www.21disk.com
一般小的代码放在上面,得到URI.方便问和解答.
hope it helps
也谢谢其他的朋友们,我试试再来这发帖
public GetDbInfo()
{
} public GetDbInfo(string strSqlVal)
{
objDataSet = new DataSet();
连接数据库,填充DATASET.....
}然后在客户端调用
RemotingConfiguration.RegisterWellKnownClientType(typeof(GetDbInfo),"tcp://localhost:8085/SrvRemoting/GetRemotingDataSet");
GetDbInfo objGetDbInfo = new GetDbInfo(strSql);
报错"当正在连接已知对象时,不能运行非默认构造函数"
那么用SingleCall应当如何做呢
Singleton和SingleCall的用法基本一样,差别就是singlecall不能保留状态,比如public interface IA
{
int function1();
int function2();
}public class A:MarshalByRefObject,IA
{
int i=0;
public A()
{
i=100;
}
public int function1()
{
return i;
}
public int function1()
{
i+=100;
return i;
}
}如果你用singlecall调用A的2个方法时,返回的结果function1总是100,function2总时200;因为在每次调用方法是,尽管使用的是同一个对象,总是先调用默认的构造函数