当前位置:编程学习 > C#/ASP.NET >>

C# Remoting操作数据库服务端采用Singleston激活时DataSet返回正常,SingleCall激活不返值,这是为什么,请高手解决

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值!真心求解,这问题困扰我一周了!在此先谢了! --------------------编程问答-------------------- 请朋友们帮一下忙 --------------------编程问答-------------------- http://www.cnblogs.com/vivounicorn/archive/2009/07/02/1515341.html --------------------编程问答-------------------- Singleton --- 每个传入的消息由同一个对象实例提供服务。只会实例化一次。

SingleCall --- 每个传入的消息由新的对象实例提供服务。 --------------------编程问答--------------------
你说的我都清楚,那我访问数据库的代码该怎么写? --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢你的代码,能用,第一次接触这remoting ,抄了你的,挺好用,你说的问题我解决了,

 if (sqlConn.State != ConnectionState.Open)
                {
                    ConnectSQLserver();
                }

把这个去了就行,每一次都是新建 对象,意味着你每次都要新建连接。不要加判断了,直接连就可以了 --------------------编程问答-------------------- 用WCF吧!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,