C# Remoting操作数据库服务端采用Singleston激活时DataSet返回正常,SingleCall激活不返值,这是为什么,请高手解决
DBServerClassLibrary.Dllusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace DBServerClassLibrary
{
public class DBServerClassLibrary : MarshalByRefObject
{
private string strConn;
private string strServer;
private string strDb;
private string strUser;
private string strPsw;
public SqlConnection sqlConn;
public SqlTransaction transaction;
public DBServerClassLibrary()
{
sqlConn = null;
}
~
DBServerClassLibrary()
{
}
public int ConnectSQLserver()
{
strConn = "Data Source=ptz;Initial Catalog=water;User ID=sa;Password=water";
sqlConn =new SqlConnection(strConn);
try
{
if (sqlConn.State != ConnectionState.Open)
{
sqlConn.Open();
}
}
catch
{
return -1;
}
return 0;
}
public void StartTransaction()
{
transaction = sqlConn.BeginTransaction();
}
public void CommitTransaction()
{
transaction.Commit();
}
public void RollBackTransaction()
{
if (transaction == null)
return;
transaction.Rollback();
}
public int Execute(string pszSQL, bool isTransaction)
{
try
{
if (sqlConn.State != ConnectionState.Open)
{
ConnectSQLserver();
}
SqlCommand sqlComm = new SqlCommand(pszSQL, sqlConn);
if (isTransaction)
sqlComm.Transaction = transaction;
sqlComm.ExecuteNonQuery();
}
catch
{
return -1;
}
return 0;
}
public int Execute(string pszSQL)
{
try
{
if (sqlConn.State != ConnectionState.Open)
{
ConnectSQLserver();
}
SqlCommand sqlComm = new SqlCommand(pszSQL, sqlConn);
sqlComm.ExecuteNonQuery();
}
catch
{
//System.Windows.Forms.MessageBox.Show(sqlEx.Message);
return -1;
}
return 0;
}
public DataSet ExecuteQuery(string strSQLquery, string strTable)
{
try
{
if (sqlConn.State != ConnectionState.Open)
{
ConnectSQLserver();
}
SqlDataAdapter sqlDa = new SqlDataAdapter(strSQLquery, sqlConn);
DataSet ds = new DataSet(strTable);
sqlDa.Fill(ds, strTable);
return ds;
}
catch
{
// System.Windows.Forms.MessageBox.Show(sqlEx.Message);
return null;
}
}
public DataSet ExecuteQuery(string strSQLquery, string strTable, bool isTransaction)
{
try
{
if (sqlConn.State != ConnectionState.Open)
{
ConnectSQLserver();
}
SqlCommand sqlComm = new SqlCommand(strSQLquery, sqlConn);
if (isTransaction)
sqlComm.Transaction = transaction;
SqlDataAdapter sqlDa = new SqlDataAdapter();
sqlDa.SelectCommand = sqlComm;
DataSet ds = new DataSet(strTable);
sqlDa.Fill(ds, strTable);
return ds;
}
catch
{
return null;
}
}
服务端代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace DBServerClassLibrary
{
public partial class FmServer : Form
{
public FmServer()
{
InitializeComponent();
}
private void FmServer_Load(object sender, EventArgs e)
{
TcpServerChannel channel = new TcpServerChannel(8888);
ChannelServices.RegisterChannel(channel,false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(DBServerClassLibrary), "DBServerClassLibrary", WellKnownObjectMode.SingleCall);
DBServerClassLibrary db = new DBServerClassLibrary();
/*if (db.ConnectSQLserver() < 0)
{
MessageBox.Show("数据库连接失败!");
return;
}*/
}
}
}
客户端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
//using DBServerClassLibrary;
using System.Data.SqlClient;
namespace DBServerClassLibrary
{
public partial class FmClient : Form
{
//private DBServerClassLibrary obj;
public FmClient()
{
InitializeComponent();
}
private void FmClient_Load(object sender, EventArgs e)
{
string strSQL;
DBServerClassLibrary g_conn = new DBServerClassLibrary();
g_conn = (DBServerClassLibrary)Activator.GetObject(typeof(DBServerClassLibrary), "tcp://Ptz:8888/DBServerClassLibrary");
if (g_conn.ConnectSQLserver() < 0)
{
MessageBox.Show("连接数据库失败!");
}
else
{
MessageBox.Show("连接数据库成功!");
}
strSQL = "Select*From Client_Info";
DataSet ds = new DataSet();
try
{
ds = g_conn.ExecuteQuery(strSQL, "Client_Info");
if (ds == null)
return;
dgvlogin.DataSource = ds.Tables["Client_Info"];
}
catch (Exception )
{
MessageBox.Show("网络掉线,请重新打开软件!");
}
}
}
}
服务端用Singleston激活时,客户端ds能返回正确的数据集,其他地方不动,改为SingleCall激活则返回Null值!真心求解,这问题困扰我一周了!在此先谢了! --------------------编程问答-------------------- 请朋友们帮一下忙 --------------------编程问答-------------------- http://www.cnblogs.com/vivounicorn/archive/2009/07/02/1515341.html --------------------编程问答-------------------- Singleton --- 每个传入的消息由同一个对象实例提供服务。只会实例化一次。
SingleCall --- 每个传入的消息由新的对象实例提供服务。 --------------------编程问答--------------------
你说的我都清楚,那我访问数据库的代码该怎么写? --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢你的代码,能用,第一次接触这remoting ,抄了你的,挺好用,你说的问题我解决了,
if (sqlConn.State != ConnectionState.Open)
{
ConnectSQLserver();
}
把这个去了就行,每一次都是新建 对象,意味着你每次都要新建连接。不要加判断了,直接连就可以了 --------------------编程问答-------------------- 用WCF吧!
补充:.NET技术 , C#