Разделение моего SQL-класса для поддержки нескольких подключений и хранимой процедуры

#c# #sql-server #stored-procedures

#c# #sql-сервер #хранимые процедуры

Вопрос:

Мне нужно создать наилучшую архитектуру для моего приложения, чтобы управлять моими различными подключениями (двумя) и хранимой процедурой. Пока что я создал один класс SQL и не обрабатываю два соединения: у меня смешанные методы и функции, которые могут вызываться независимо от соединения (и могут аварийно завершать работу).

Как мне создать класс подключения и DAL ?

Мой класс подключения к SQL :

 namespace GripPicture.Data
{
    class Sqlmap
  {
    static string RmSynchro = "ConnectionRmSynchro";
    static string PascomPhoto = "ConnectionPascomPhoto";
    private string config;

    private OleDbConnection _lConnection = new OleDbConnection();

    private OleDbConnection OleConnection
    {
        get
        {
            if (_lConnection.State != ConnectionState.Open)
            {
                if (_lConnection.State != ConnectionState.Connecting)
                {
                    _lConnection.OpenAsync();
                }
            }
            return _lConnection;
        }
        set { _lConnection = value; }
    }


    public Sqlmap(bool pIsPascom = false)
    {
        config = pIsPascom ? ConfigurationManager.AppSettings[PascomPhoto] : ConfigurationManager.AppSettings[RmSynchro];
        OleConnection = new OleDbConnection(config);
    }

    private void Connection()
    {
        OleConnection.OpenAsync();
    }

    public int ExcuteUpdate(string pQuery)
    {
        // Check if connection is closed
        OleDbCommand command = new OleDbCommand(pQuery, OleConnection);

        return command.ExecuteNonQuery();
    }

    // This function should reside in your SQL-class.
    public IEnumerable<T> ExecuteQueryForList<T>(string pQuery)
    {
        List<T> items = new List<T>();

        Type type = typeof(T);
        var data = ExecuteDataTable(pQuery);
        foreach (DataRow row in data.Rows)
        {
            // Object have a constructor with a Datarow
            T item = (T)Activator.CreateInstance(typeof(T), row);

            PascomPhotoDo element = (PascomPhotoDo)Activator.CreateInstance(typeof(PascomPhotoDo), row);

            if ((items.Cast<PascomPhotoDo>()).Any((elem => elem.NumeroContact == element.NumeroContact)))
            {
                LogHelper.Log("Doublons dans la liste Id Pascom "   element.NumeroContact   " "   element.FirstName   " Atlas "   element.IdParticipantAtlas);
                //Console.WriteLine("Doublon dans liste : "   element.NumeroContact   " "   element.FirstName   " Atlas "   element.IdParticipantAtlas);
            }

            items.Add(item);

        }
        return items;
    }

    private DataTable ExecuteDataTable(string pQuery)
    {
        OleDbDataAdapter dp1 = new OleDbDataAdapter(pQuery, OleConnection);
        DataSet ldataSet = new DataSet();
        dp1.Fill(ldataSet, "table");
        return ldataSet.Tables[0];
    }

    #region PASCOM

    public byte[] GetPictureFromPascom(int pNumeroContact)
    {
        byte[] lDataPicture = null;
        OleDbCommand command = new OleDbCommand();
        command.CommandType = CommandType.StoredProcedure;

        command.CommandText = "itsp_Photo_GetPhotoByContact";
        command.Connection = OleConnection;
        command.Parameters.Add("@numero_contact", OleDbType.Integer).Value = pNumeroContact;
        command.CommandTimeout = 15000;

        try
        {
            lDataPicture = (byte[])command.ExecuteScalar();
        }
        catch (Exception e)
        {
            LogHelper.Log("Fail to get picture n"   " Id Pascom "   pNumeroContact   " "   e.Message);
        }

        return lDataPicture;
    }

    public void InsertPictureToDatabase(PascomPhotoDo pPascomPhoto)
    {
        OleDbCommand command = new OleDbCommand();
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "itsp_Photo_CreatePhotoContact";
        command.Connection = OleConnection;
        command.Parameters.Add("@idContact", OleDbType.Integer).Value = pPascomPhoto.NumeroContact;
        command.Parameters.Add("@photo", OleDbType.Binary).Value = pPascomPhoto.PhotoByteReduced;
        command.Parameters.Add("@source", OleDbType.VarChar).Value = "blabla";
        command.Parameters.Add("@idSalonOrganise", OleDbType.VarChar).Value = "blabla";
        command.Parameters.Add("@IdParticipantAtlas", OleDbType.VarChar).Value = pPascomPhoto.IdParticipantAtlas;

        command.CommandTimeout = 15000;
        try
        {
            int data = command.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            LogHelper.Log(LogTarget.File, "Fail to insert in database", e);
        }
    }
}

#endregion
}
  

Затем я использую свое SQL-соединение, объявляя новый объект следующим образом :

 _sqlRmSynchro = new Sqlmap();
_sqlPascom = new Sqlmap(true);
  

Как вы можете видеть, я могу вызвать какую-то конкретную функцию из неправильной строки подключения…
Что мне нужно? A DAL ? На что это похоже?

Комментарии:

1. Почему вы чувствуете необходимость изобретать велосипед? Используйте Entity Framework.

2. @IanKemp База данных для этого не подходит, в таблицах нет индексов, это очень старое приложение, я добавляю простую новую функцию.