1

1つのStackOverflowリンクを含む、CodeProject、CSharpCorner、MSDN、CSharpPearlsなどのいくつかのサイトを調べました。-

asp.netの2つの異なるデータソースにアクセスするための単一のデータアクセス層を作成する方法

しかし、私はその答えに不満を持っていました。

Web.Configを使用してConnectionStringを取得しているASP.netC#でWebサイトのDALを作成したいと思います。しかし、今日、SQLSERVERに接続しているとしたら、私のDALはSQLSERVERに接続できます。しかし、将来、もう1つのconnectionStringを追加し、1つの接続文字列でSQLSERVERに接続し、別の接続文字列でMYSQLに接続すると、MyDALはすべてのタイプのデータベースに問題なく接続できる必要があります。

これまで私が行ったことは、SQLServerで動作するSQLServerですが、これを汎用的で、OLEDB、MYSQL、SQLCLIENT、(BIGTABLE&CASANDRA IF POSSIBLE)およびその他すべてのプロバイダーで動作させたいと考えています。

これが私が今まで試したことです:-

namespace MyDAL
{
namespace DB
{
    using System;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    /// <summary>
    /// BaseDataManager is used to connect to database
    /// </summary>
    [Serializable()]
    public class BaseDataManager : IDisposable
    {
        private bool _disposedValue = false;
        private SqlConnection _connectionObject = null;
        private SqlCommand _commandObject = null;
        public BaseDataManager()
        { }
        /// <summary>
        /// Provide ConnectionString
        /// </summary>
        public BaseDataManager(string connectionString)
        {
            this.SqlConnectionString = connectionString;
        }

        /// <summary>
        /// if config is true provide connectionstring name in Web.config
        /// else if config is false provide connectionstring rather than providing                     
        ///name
        /// </summary>
        public BaseDataManager(String connectionString_Name, Boolean config)
        {
            if (config == true)
            {
                this.SqlConnectionString = ConfigurationManager.ConnectionStrings[connectionString_Name].ConnectionString;
            }
            else if (config == false)
            {
                this.SqlConnectionString = connectionString_Name;
            }
            else
            {
                Console.Out.WriteLine("Error in Connection String, Check Web.Config ");
            }
        }
        /// <summary>
        /// Provide data source=; as connection string, username and password of
        /// database 
        /// </summary>
        public BaseDataManager(string DataSource, string InitialCatalog, bool IntegratedSecurity)
        {
            if (IntegratedSecurity == true)
            {
                this.SqlConnectionString += "Data Source=" + DataSource + "InitialCatalog=" + InitialCatalog + ";Integrated Security=" + IntegratedSecurity;
            }
        }

        /// <summary>
        /// Provide data source=; as connection string, username and password of
        /// database 
        /// </summary>
        public BaseDataManager(string DataSource,string InitialCatalog, string username, string password)
        {
            this.SqlConnectionString += "Data Source="+DataSource+"InitialCatalog="+InitialCatalog+";User ID=" + username + ";Password=" + password;
        }

        public string SqlConnectionString
        {
            get;
            set;
        }

        public virtual SqlConnection connection
        {
            get
            {
                if (_connectionObject == null && !String.IsNullOrEmpty (this.SqlConnectionString))
                    _connectionObject = new SqlConnection (this.SqlConnectionString);
                return _connectionObject;
            }
            set
            {
                _connectionObject = value;
            }
        }

        public virtual SqlCommand command
        {
            get
            {
                if (_commandObject == null)
                    _commandObject = new SqlCommand();
                return _commandObject;
            }
            set
            {
                _commandObject = value;
            }
        }

        public SqlConnection getOpenConnection()
        {
            if (connection.State == ConnectionState.Closed)
            {
                connection.Open();
            }
            return connection;
        }

        public SqlCommand getCommand()
        {
            return command;
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!_disposedValue)
            {
                if (disposing)
                {


   //-------------------------------------------------------------------------
                    // Close the connection object prior to setting it to nothing


   //----------------------------------------------------------------------
                    if (_connectionObject != null)
                    {
                        _connectionObject.Close();
                        _connectionObject.Dispose();
                    }
                    if (_commandObject != null)
                    {
                        _commandObject.Cancel();
                        _commandObject.Dispose();
                    }
                }

                _disposedValue = true;
            }
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
    GC.Collect();
        }

        ~BaseDataManager()
        {
            Dispose(false);
        }

    }
 }
 }

私を助けてください..

4

1 に答える 1

0

私が見てきた作業は、1 つの巨大な DAO ではなく、エンティティごとにデータ アクセス オブジェクト (DAO) を提供することです。

私はそれを本当にシンプルに保ち、あまり抽象化しすぎないようにします。学校に関するアプリケーションを作成しているとしましょう。一部のエンティティ:

  • 学校
  • 先生
  • 学生

次に、各 DAO のインターフェイスを作成できます。

  • ISchoDAO
  • ITeacherDAO
  • IStudentDAO

各 DAO には、アプリケーション固有の機能があります。ジェネリックにしようとすることはお勧めしません。学校には次のようなメソッドがあるかもしれません:

  • 公開リスト GetSchools()
  • 公立学校 GetSchool(int id)

次に、DAO のインターフェイスを実装すると、必要なテクノロジを使用できます。BigTable/Hadoop/SQL などは同じ概念に準拠していないことに注意してください。1 つはリレーショナル データベースで、もう 1 つはリレーショナル データベースではありません。

コード全体でインターフェイスを使用すると、単体テストを記述して、基盤となるテクノロジを簡単に交換できます。

(繰り返す価値があります...インターフェースの一部としてSQLステートメントを読み取ろうとしないでください。それらはテクノロジー間で同じようにマッピングされないことに注意してください。)

于 2013-01-24T04:35:08.183 に答える