DBServerClassLibrary.Dll
using 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值!真心求解,这问题困扰我一周了!在此先谢了!

解决方案 »

  1.   

    http://www.cnblogs.com/vivounicorn/archive/2009/07/02/1515341.html
      

  2.   

    Singleton --- 每个传入的消息由同一个对象实例提供服务。只会实例化一次。SingleCall --- 每个传入的消息由新的对象实例提供服务。
      

  3.   

    谢谢你的代码,能用,第一次接触这remoting ,抄了你的,挺好用,你说的问题我解决了, if (sqlConn.State != ConnectionState.Open)
                    {
                        ConnectSQLserver();
                    }把这个去了就行,每一次都是新建 对象,意味着你每次都要新建连接。不要加判断了,直接连就可以了