#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 База данных для этого не подходит, в таблицах нет индексов, это очень старое приложение, я добавляю простую новую функцию.