powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Подключения к SqlServer
6 сообщений из 6, страница 1 из 1
Подключения к SqlServer
    #34185495
kluben
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться с подключением к SqlServer.

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

1. Использовать конструкцию

using(SqlConnection sqlConn = new SqlConnection(String ConnStr))
{
sqlConn.Open;
.
.
.
}

2. ...или Просто
SqlConnection sqlConn = new SqlConnection(String ConnStr)
sqlConn.Open();
.
.
.
sqlConn.Close();

Хочу реализовать класс который передает готовый объект подключения через свойства остальным классам. Т.е. один раз создал подключение и использовать его одно (открывать и закрывать когда надо). Вариант № 1 не подходит, так как там неявно вызывается Dispose() и подчищает строку подключения и другие значения. Приходиться постоянно создовать новый объект подключения.
Вариает 2 тоже не совсем подходит. Там нужно передавать строку подключения, хотя строка практически всегде одна и та же подключение берется из пула, но не красиво.

Вот вопрос: каким способом можно организовать еще такой механизм?
...
Рейтинг: 0 / 0
Подключения к SqlServer
    #34185677
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дак сделайте экзмепляр класса SqlConnection атрибутом какого-либо своего класса.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
Подключения к SqlServer
    #34185781
kluben
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sa, можно подробнее, пожадуйста.
...
Рейтинг: 0 / 0
Подключения к SqlServer
    #34186659
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вариант исполнения абстрактного класса, от которого наследуются все объекты бизнес-логики. Снаружи есть еще класс SqlConnectionManager, который занимается спрашиванием паролей и явок :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace DAL
{
  public abstract class StoredProcedure : MarshalByRefObject, IDisposable
  {
    private bool externalConnection = false;

    // Класс для выполнения вложенных процедур
    private class NestedProcedure : StoredProcedure
    {
      public NestedProcedure(StoredProcedure caller, string commandText, IDictionary<string, object> parameters)
        : base(caller)
      {
        Command.CommandText = commandText;
        Command.CommandType = CommandType.Text;
        foreach (string key in parameters.Keys)
        {
          Command.Parameters.AddWithValue(key, parameters[key]);
        }
      }
    }

    private static string connectionString = string.Empty;

    private SqlConnection connection = null;
    private SqlCommand command = null;

    protected SqlCommand Command
    {
      get
      {
        return command;
      }
    }

    private static string ConnectionString
    {
      get
      {
        return SqlConnectionManager.ConnectionString;
      }
    }

    private static SqlConnection NewConnection
    {
      get
      {
        return new SqlConnection(ConnectionString);
      }
    }

    protected SqlConnection Connection
    {
      get
      {
        if (connection == null)
          connection = StoredProcedure.NewConnection;
        return connection;
      }
    }

    #region IDisposable Members
    private bool disposed = false;

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

    protected void Dispose(bool disposing)
    {
      if (disposed) return;
      if (disposing)
      {
        //Если соединение було инициализировано не нами, то мы не должны его закрывать
        if (!externalConnection) this.connection.Dispose();
        this.connection = null;
      }
      disposed = true;
    }

    ~StoredProcedure()
    {
      Dispose(false);
    }

    #endregion

    protected StoredProcedure()
    {

      // Получаем ссылку на типа класса
      Type t = this.GetType();
      // Получаем атрибуты SqlCommand
      SqlCommandAttribute[] commandAtts = (SqlCommandAttribute[])t.GetCustomAttributes(typeof(SqlCommandAttribute), false);
      // Проверяем количество атрибутов (должно быть 1)
      if (commandAtts.Length > 1)
        throw new Exception(string.Format("%s: Слишком много атрибутов SqlCommandAttribute", t.Name));
      // Создаем SqlCommand с указанными параметрами для текущего соединения
      if (commandAtts.Length == 1)
      {
        // Если команда описана явно
        command = commandAtts[0].BuildCommand(Connection);
      }
      else
      {
        // Если описание отсутствует - берем имя текущего класса
        command = new SqlCommand(t.Name, Connection);
        command.CommandType = CommandType.StoredProcedure;
      }
      // Получаем список параметров вызова
      SqlParameterAttribute[] parameters = (SqlParameterAttribute[])t.GetCustomAttributes(typeof(SqlParameterAttribute), false);
      // Добавляем параметры к объекту SqlCommand
      foreach (SqlParameterAttribute parameter in parameters)
      {
        parameter.AddToSqlCommand(command);
      }
    }

    protected StoredProcedure(StoredProcedure caller) : this()
    {
      if (caller == null) throw new ArgumentNullException("caller");
      this.connection = caller.Connection;
      externalConnection = true;
    }

    private void Open()
    {
      Command.Connection = Connection;
      if (Connection.State != ConnectionState.Open)
      {
        Command.CommandTimeout = 0;
        Connection.Open();
      }
    }

    protected object ExecuteScalar()
    {
      Open();
      return Command.ExecuteScalar();
    }

    protected void ExecuteReader(DataSet dataSet, LoadOption loadOption, string[] tables)
    {
      Open();
      using (SqlDataReader reader = Command.ExecuteReader())
      {
        dataSet.Load(reader, loadOption, tables);
      }
    }

    protected XmlReader ExecuteXmlReader()
    {
      Open();
      return Command.ExecuteXmlReader();
    }

    protected void ExecuteNonQuery()
    {
      Open();
      // TODO: Здесь команду надо сначала запускать с параметрами проверки?
      Command.ExecuteNonQuery();
    }

    protected void ExecuteNonQuery(string commandText, IDictionary<string, object> parameters)
    {
      NestedProcedure proc = new NestedProcedure(this, commandText, parameters);
      proc.ExecuteNonQuery();
    }

  }
}

Ну и пример класса, который унаследован от этого абстрактного класса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;

namespace BLL
{
  public sealed class ReturnWork : StoredProcedure
  {
    IDictionary<string, object> parameters = new Dictionary<string, object>();

    public static void Execute(DataTable table, StoredProcedure caller)
    {
      using (ReturnWork proc = new ReturnWork(caller))
      {
        proc.Execute(table);
      }
    }

    private ReturnWork(StoredProcedure caller) : base(caller) { }

    private void Execute(DataTable table)
    {
      string cmdText = BLL.ReturnWork_GenerateQuery.Execute(table, this);
      if (cmdText == string.Empty) return;

      WorkDelete(table.TableName);

      int handler = PrepareXml(table);

      parameters.Add("@hdoc", handler);

      ExecuteNonQuery(cmdText, parameters);

      RemoveXml(handler);

    }
  }
}

Тут конечно будет многое непонятно, там еще атрибутами передается название процедуры и набор параметров, но сама суть - создать абстрактный класс, а потом для каждого действия бизнеслогики - свой класс, унаследованный от базового StoredProcedure и вызывать его статичный метод Execute, который создает копию класса бизнеслогики и собственно производит действия.
Полный код сейчас привести не могу, так как проект в жуткой переработке - в настоящий момент все разломано
...
Рейтинг: 0 / 0
Подключения к SqlServer
    #34187669
Фотография Ramin Hashimzade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlConnection SQLCon = new SqlConnection("connection string");
SQLCon.Open();

SqlCommand SQLCom = new SqlCommand();
SQLCom.CommandText = "select count(*) from mytable where data=@data";
SQLCom.Connection = SQLCon;
SQLCom.Parameters.Add("@data", SqlDbType.DateTime).Value = "текуший день"; // Date
SqlDataAdapter SQLAdap = new SqlDataAdapter();                    
SQLAdap.SelectCommand = SQLCom;
SQLAdap.SelectCommand.ExecuteNonQuery();
DataSet.MyTable.Clear();
SQLAdap.Fill(DataSet.MYTABLE);

----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
Подключения к SqlServer
    #34188493
kluben
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем. Роману особое.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Подключения к SqlServer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]