Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Подключения к SqlServer / 6 сообщений из 6, страница 1 из 1
08.12.2006, 11:11
    #34185495
kluben
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключения к SqlServer
Помогите разобраться с подключением к 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
08.12.2006, 11:45
    #34185677
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключения к SqlServer
Дак сделайте экзмепляр класса SqlConnection атрибутом какого-либо своего класса.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
08.12.2006, 12:22
    #34185781
kluben
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключения к SqlServer
Sa, можно подробнее, пожадуйста.
...
Рейтинг: 0 / 0
08.12.2006, 15:40
    #34186659
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключения к SqlServer
Вот вариант исполнения абстрактного класса, от которого наследуются все объекты бизнес-логики. Снаружи есть еще класс 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
09.12.2006, 11:05
    #34187669
Ramin Hashimzade
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключения к SqlServer
Код: 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
10.12.2006, 15:26
    #34188493
kluben
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключения к SqlServer
Спасибо всем. Роману особое.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Подключения к SqlServer / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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