一个项目中,有很多窗体都要访问数据库,每个窗体都要分别添加数据适配器,建立数据库连接,生成数据集吗?
如果没有这么麻烦,该怎么做?

解决方案 »

  1.   

    建立一个类,把访问数据库的操作全部用类来实现
    参考:SqlHelper(搜索一下)
      

  2.   

    yeah, microsoft application block/ enterprise library
      

  3.   

    可以把有关数据连接的操作都写成一个类,对更常用的可以用session保存
      

  4.   

    VS.NET提供的数据窗体向导,只是为了让你看它生成的代码是怎么写的,是让你学习用的.在实际应用中基本上用不到
      

  5.   

    我写的一个数据库操作类,是基于ODBC的(.NET Framework 2.0),不过1.1也差不多。
    你可以改一下。当然最后的一个SetTableName函数没用。那个字符集转换的函数也可以不用,除非你遇到中文显示错误的问题。using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.Odbc;/// <summary>
    /// 操作数据库的类
    /// </summary>
    public class DataObject
    {
        public DataObject()
        {
            ocmd = new OdbcCommand(null, ocnt);
            oda = new OdbcDataAdapter(null, ocnt);
        }    private OdbcConnection ocnt = new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        private OdbcCommand ocmd;
        private OdbcDataAdapter oda;
        private int connections; //连接计数,以支持自动连接    public void Open()
        {
            if (ocnt.State == ConnectionState.Closed)
            {
                ocnt.Open();
                connections = 1;
            }
            else
                connections++;
        }    public void Close()
        {
            if (ocnt.State == ConnectionState.Open)
            {
                if (connections == 1)
                    ocnt.Close();
                else
                    connections--;
            }
        }    public int ExecuteCommand(string commandText, string paramNames, params object[] paramValues)
        {
            SetParams(ocmd, paramNames, paramValues);
            return this.ExecuteCommand(commandText);
        }    public int ExecuteCommand(string commandText)
        {
            Open();
            try
            {
                ocmd.CommandText = SetTableName(commandText);
                return ocmd.ExecuteNonQuery();
            }
            finally
            {
                Close();
            }
        }
        public DataTable ExecuteSelect(string spName, string paramNames, string paramDirection, params object[] paramValues)
        {
            SetSPParams(paramNames, paramValues, paramDirection, spName);
            oda.SelectCommand = ocmd;
            DataTable dt = new DataTable();
            Open();
            try
            {
                oda.Fill(dt);
                return dt;
            }
            //catch
            //{
            //    return dt;
            //}
            finally
            {
                Close();
            }
        }    public DataTable ExecuteSelect(string selectCommandText, string paramNames, params object[] paramValues)
        {
            SetParams(oda.SelectCommand, paramNames, paramValues);
            return this.ExecuteSelect(selectCommandText);
        }    public DataTable ExecuteSelect(string selectCommandText)
        {
            Open();
            DataTable dt = new DataTable();
            try
            {
                oda.SelectCommand.CommandText = SetTableName(selectCommandText);
                oda.Fill(dt);
                return dt;
            }
            //catch
            //{
            //    return dt;
            //}
            finally
            {
                Close();
            }
        }
        public IDataReader ExecuteReader(string selectCommandText, string paramNames, params object[] paramValues)
        {
            SetParams(ocmd, paramNames, paramValues);
            return this.ExecuteReader(selectCommandText);
        }    public IDataReader ExecuteReader(string selectCommandText)
        {
            if (ocnt.State == ConnectionState.Closed)
                ocnt.Open();
            try
            {
                ocmd.CommandText = SetTableName(selectCommandText);
                return ocmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch
            {
                Close();
                throw;
            }
        }    public object ExecuteScalar(string commandText, string paramNames, params object[] paramValues)
        {
            SetParams(ocmd, paramNames, paramValues);
            return this.ExecuteScalar(commandText);
        }    public object ExecuteScalar(string commandText)
        {
            Open();
            try
            {
                ocmd.CommandText = SetTableName(commandText);
                return ocmd.ExecuteScalar();
            }
            finally
            {
                Close();
            }
        }    public int ExecuteSP(string spName, string paramNames, string paramDirection, params object[] paramValues)
        {
            SetSPParams(paramNames, paramValues, paramDirection, spName);        Open();
            try
            {
                ocmd.ExecuteNonQuery();
                return (int)ocmd.Parameters["returnval"].Value;
            }
            finally
            {
                Close();
            }    }    public IDataReader ExecuteReader(string spName, string paramNames, string paramDirection, params object[] paramValues)
        {
            SetSPParams(paramNames, paramValues, paramDirection, spName);
            if (ocnt.State == ConnectionState.Closed)
                ocnt.Open();
            try
            {
                return ocmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch
            {
                Close();
                throw;
            }
        }    private void SetParams(OdbcCommand ocmd, string paramNames, params object[] paramValues)
        {
            ocmd.Parameters.Clear();
            string[] names = paramNames.Split(',');
            OdbcParameter op;
            object obj;
            for (int i = 0; i < names.Length; i++)
            {
                obj = paramValues[i];
                if (obj.GetType() == System.Type.GetType("System.String"))
                {
                    op = ocmd.Parameters.Add(names[i], OdbcType.Binary);
                    op.Value = TranslateChineseStr(obj.ToString());
                }
                else
                    ocmd.Parameters.AddWithValue(names[i], obj);
            }
        }    private byte[] TranslateChineseStr(string str)
        {
            //由于编码原因,要将中文字符串重新编码,936为中文代码页
            System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(936);
            return encoding.GetBytes(str);
        }
        private void SetSPParams(string paramNames, object[] paramValues, string paramDirection, string spName)
        {        System.Text.StringBuilder sb = new System.Text.StringBuilder("{?=CALL " + spName + "( ");
            if (paramNames != null)
            {
                SetParams(ocmd, paramNames, paramValues);
                string[] dirs = paramDirection.Split(',');
                for (int i = 0; i < dirs.Length; i++)
                {
                    switch (dirs[i])
                    {
                        case "O":
                            ocmd.Parameters[i].Direction = ParameterDirection.Output;
                            break;
                        case "IO":
                            ocmd.Parameters[i].Direction = ParameterDirection.InputOutput;
                            break;
                        default:
                            ocmd.Parameters[i].Direction = ParameterDirection.Input;
                            break;
                    }
                }
                for (int i = 0; i < paramValues.Length; i++)
                    sb.Append("?,");
            }
            OdbcParameter op = new OdbcParameter("returnval", OdbcType.Int);
            ocmd.Parameters.Insert(0, op);
            ocmd.Parameters["returnval"].Direction = ParameterDirection.ReturnValue;
            ocmd.CommandType = CommandType.StoredProcedure;        ocmd.CommandText = sb.ToString(0, sb.Length - 1) + ")}";
        }    private string SetTableName(string cmd)
        {
            int areaID = UserManager.GetLoginAreaID();
            if (areaID != 0)
            {
                string[] areaName = { "CZ", "WJ", "JT", "LY" };
                return System.Text.RegularExpressions.Regex.Replace(cmd, @"(VNET|VNET_USER|VNET_IF)\b",
                        "$1_" + areaName[areaID - 1]);
            }
            else
                return System.Text.RegularExpressions.Regex.Replace(cmd, @"(VNET|VNET_USER)\b",
                    "$1_ALL");
        }}