powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Соединение с разными серверами БД
53 сообщений из 53, показаны все 3 страниц
Соединение с разными серверами БД
    #35875893
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приложении используется класс для соединения с MS sql
Сейчас необходимо добавить возможность соединения с Oracle.
Доработал класс он работает но не уверен что "идеологически" правильно все написал и в дальнейшем не вылезут грабли.
Покритикуйте, выскажите мнения пожалуйста.

код ниже
Загрузка результатов через dataAdapter
Код: 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.
		/// <summary>
		/// Загрузка DataTable
		/// </summary>
		/// <param name="cmd"></param>
		public void LoadResult(System.Data.OracleClient.OracleCommand cmd)
		{
			LoadResult((System.Data.Common.DbCommand)cmd);
		}
                /// <summary>
		/// Загрузка DataTable
		/// </summary>
		/// <param name="cmd"></param>
		public void LoadResult(System.Data.SqlClient.SqlCommand cmd)
		{
			LoadResult((System.Data.Common.DbCommand)cmd);
		}

		/// <summary>
		/// Загрузка DataTable
		/// </summary>
		/// <param name="cmd"></param>
		public void LoadResult(System.Data.Common.DbCommand cmd)
		{
			if (cmd.GetType().FullName == "System.Data.OracleClient.OracleCommand")
			{
				OracleDataAdapter orada = new OracleDataAdapter();
				orada.SelectCommand = (OracleCommand)cmd;
				orada.Fill(DataTable);
				orada.Dispose();
			}
			else if (cmd.GetType().FullName == "System.Data.SqlClient.SqlCommand")
			{
				SqlDataAdapter mssqlda = new SqlDataAdapter();
				mssqlda.SelectCommand = (SqlCommand)cmd;
				mssqlda.Fill(DataTable);
				mssqlda.Dispose();
			}
		}

Выполнение запроса и обработка ошибок
Код: 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.
public enum runtype { nodata = 0, data = 1 }
/// <summary> выполнение запроса к серверу	/// </summary>
public class sqlRun
{
	/// <summary> Информация о последней ошибке	/// </summary>
	public string cError = "";
	public static int CommandTimeout = 300;

	/// <summary>выполнение запроса на сервере</summary>
	/// <param name="cmd">команда с заполнеными параметрами</param>
	/// <param name="result">nodata - без возврата данных; data - Если ожидается возврат данных </param>
	/// <returns> тип  sqlReturn </returns>
	public sqlReturn Run(OracleCommand cmd, runtype rntp)
	{
		return sRun(cmd, rntp);
	}//Run (oracle)

	/// <summary>выполнение запроса на сервере</summary>
	/// <param name="cmd">команда с заполнеными параметрами</param>
	/// <param name="result">nodata - без возврата данных; data - Если ожидается возврат данных </param>
	/// <returns> тип  sqlReturn </returns>
	public sqlReturn Run(SqlCommand cmd, runtype rntp)
	{
		return sRun(cmd, rntp);
	}//Run (oracle)

	/// <summary>выполнение запроса на сервере	oracle or mssql /// </summary>
	/// <param name="cmd">команда с заполнеными параметрами</param>
	/// <param name="result">nodata - без возврата данных; data - Если ожидается возврат данных </param>
	/// <returns> тип  sqlReturn </returns>
	private sqlReturn sRun(System.Data.Common.DbCommand cmd, runtype rntp)
	{
		cError = "";
		string RetMsg;
		RetMsg = "";
		sqlReturn retval = new sqlReturn();
		using (cmd.Connection)
		{
			try
			{
				cmd.Connection.Close();
				cmd.Connection.Open();
				cmd.CommandTimeout = CommandTimeout;
				if (rntp == runtype.data) //ожидаются данные
				{
					retval.searchResult = new SearchResult();
					retval.searchResult.LoadResult(cmd);
					retval.searchResult.PageIndex = -1;
					retval.searchResult.PageSize = -1;
					retval.searchResult.TotalRowCount = 1;
				}
				else
				{
					cmd.ExecuteNonQuery();
				}
				cmd.Connection.Close();
				retval.ok = true;
			}//try
			catch (Exception ex)
			{
				cmd.Connection.Close();
				RetMsg = "Выполнение команды на сервере неудачно.\n" + ex.Message + "\n" + ex.Data.ToString() + "\n";
				retval.ok = false;
				retval.searchResult = null;
			}
		} //using (cmd.Connection)
		if (cmd.Parameters.Contains("@Error") && (string)cmd.Parameters["@Error"].Value != "")
		{
			RetMsg = RetMsg + (string)cmd.Parameters["@Error"].Value;
		}
		retval.sqlError = RetMsg;
		cError = retval.sqlError;
		return retval;
	}//sRun (oracle or mssql)
	#endregion
}
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35875965
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откройте для себя интерфейсы IDbConnection,IDbCommand,IDbDataAdapter,IDbDataParameter,
класс DbProviderFactories

Когда надоест - посмотрите на ORM
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35875983
alexdr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я, конечно, дико извиняюсь ;), но ковыряться в коде лениво... сорри.

Тут в мелкософте наваяли бесплатную библиотеку Enterprise Library , в которой существует блок с классами, решающими сходные проблемы. Все что необходимо, это добавить референс на необходимые DLL и пользоваться готовыми классами, сконфигурировав соотвествующие датапровайдеры в конфигурационном файле (это полторы минуты работы). В библиотеке еще много чего вкусного найти можно. Код открыт. Сырцы прилагаются.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876002
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек...
Покритикуйте, выскажите мнения пожалуйста.
...
Все 3 LoadResult метода можно заменить одним:
Код: plaintext
1.
2.
3.
4.
public void LoadResult(System.Data.Common.DbCommand cmd)
{
	DataTable.Load((System.Data.IDataReader)cmd.ExecureReader());
}
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876110
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил
класс DbProviderFactories
+1
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876215
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилОткройте для себя интерфейсы IDbConnection,IDbCommand,IDbDataAdapter,IDbDataParameter,
класс DbProviderFactories

Когда надоест - посмотрите на ORM

Насчет ORM, боюсь я программ которые сами генерят запросы.
Собственно в приложении уже есть некое подобие ORM, средний слой, т.е. у классов есть методы сохраниться загрузиться и т.д.

Насчет DbProviderFactories можно меня ткнуть в доку какую нить или на пальцах обьяснить. в MSDN-е поискал что то не понял ни чего.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876217
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexdrEnterprise Library

Спасибо скачал, изучаю.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876228
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu5копеек...
Покритикуйте, выскажите мнения пожалуйста.
...
Все 3 LoadResult метода можно заменить одним:
Код: plaintext
1.
2.
3.
4.
public void LoadResult(System.Data.Common.DbCommand cmd)
{
	DataTable.Load((System.Data.IDataReader)cmd.ExecureReader());
}


Спасибо.

В случае если нужна подстройка для какого то конкретного источника данных.
Вопрос выбор источника данных через
Код: plaintext
cmd.GetType().FullName == "System.Data.OracleClient.OracleCommand"
правильный подход или источник будущих ошибок ?
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876316
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы не в тему, но, вроде и по теме: как в контексте фабрики подрывать xCommandBuilder (4 example, xCommandBuilder.DeriveParameters() )?
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876327
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек
В случае если нужна подстройка для какого то конкретного источника данных.
Вопрос выбор источника данных через
Код: plaintext
cmd.GetType().FullName == "System.Data.OracleClient.OracleCommand"
правильный подход или источник будущих ошибок ?
на мой взгляд - это не верный подход.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876336
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum5копеек
В случае если нужна подстройка для какого то конкретного источника данных.
Вопрос выбор источника данных через
Код: plaintext
cmd.GetType().FullName == "System.Data.OracleClient.OracleCommand"
правильный подход или источник будущих ошибок ?
на мой взгляд - это не верный подход.

Что бы вы посоветовали?
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876358
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек
Что бы вы посоветовали?
используйте DbProviderFactories для получения нужного вам провайдера (DbProviderFactory), который, в свою очередь создаст нужные вам экземпляры всех классов, заточенных именно под конкретную СУБД.
Код получите единый, т.е. менять ничего не придется, и сможете влёт переключаться на любой др. СУБД.
сейчас у меня нет под рукой кода, но дома лежит подробный развернутый демонстрационный код (написал для консольного приложения). Если захотите - вечером приду домой и выложу его в этом топике.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876379
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum5копеек
Что бы вы посоветовали?
используйте DbProviderFactories для получения нужного вам провайдера (DbProviderFactory), который, в свою очередь создаст нужные вам экземпляры всех классов, заточенных именно под конкретную СУБД.
Код получите единый, т.е. менять ничего не придется, и сможете влёт переключаться на любой др. СУБД.
сейчас у меня нет под рукой кода, но дома лежит подробный развернутый демонстрационный код (написал для консольного приложения). Если захотите - вечером приду домой и выложу его в этом топике.

Был бы весьма признателен.
Спасибо за помощь.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876566
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum...
сейчас у меня нет под рукой кода, но дома лежит подробный развернутый демонстрационный код (написал для консольного приложения)...
А у меня как раз под рукой это есть (может быть не такое подробное и развернутое, но работало когда-то):
Код: 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.
using System;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Text;
//using System.Data.Transactions;

public class Script {
	public static void Main (string[] args) {
   	if (args.Length < 3) {
   		Console.WriteLine ("Usage: <progname>[.exe] \"DbProviderFactoryName\" \"<connection_string>\" [\"<query_string1>\"|\"<script_file1>\" \"<query_string2>\"|\"<script_file2>\" ... \"<query_stringN>\"|\"<script_fileN>\"] ");
   		return;
   	}
		try {
			string dbProviderFactoryName = args[0];
			string dbConnectionString = args[1];
			string[] commandTexts = new string[args.Length - 2]; 
			Array.Copy(args, 2, commandTexts, 0, args.Length - 2);
			DbProviderFactory dbf = DbProviderFactories.GetFactory (dbProviderFactoryName);
				using (DbConnection cnn = dbf.CreateConnection ()) {
					cnn.ConnectionString = dbConnectionString;
					cnn.Open();
					DbTransaction trs = cnn.BeginTransaction();
					try {
						foreach (string commandText in commandTexts) {
							using (DbCommand cmd = dbf.CreateCommand()) {
								cmd.CommandType = CommandType.Text;
								cmd.CommandText = commandText;
								cmd.Connection = cnn;
								cmd.Transaction = trs;
								if (File.Exists(commandText)) {
									using (StreamReader sr = new StreamReader(commandText)) {
										cmd.CommandText = sr.ReadToEnd();
									}
								}
								Console.WriteLine (cmd.CommandText);
                        if (cmd.CommandText.Trim().ToLower().StartsWith("select")) {
                           using (DbDataReader dr = cmd.ExecuteReader()) {
                              while (dr.Read()) {
                                 object[] o = new object[dr.VisibleFieldCount];
                                 dr.GetValues(o);
                                 foreach (object v in o)
                                    Console.Write ("\t\t{0};", v);
                                 Console.WriteLine ();
                              }
                           }
                        }
                        else   
								   Console.WriteLine ("{0} rows affected.", cmd.ExecuteNonQuery());
							}
						}
						trs.Commit();
					}
					catch {
						trs.Rollback();
						throw;
					}
				}
		}
		catch (Exception ex) {
			Console.WriteLine (ex.ToString());
		}
	}
}
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876796
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum
используйте DbProviderFactories для получения нужного вам провайдера (DbProviderFactory), который, в свою очередь создаст нужные вам экземпляры всех классов, заточенных именно под конкретную СУБД

тынць ?
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876822
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
Compositum
используйте DbProviderFactories для получения нужного вам провайдера (DbProviderFactory), который, в свою очередь создаст нужные вам экземпляры всех классов, заточенных именно под конкретную СУБД

тынць ?
_________________
"Helo, word!" - 17 errors 56 warnings

нет это не оно. я именно о родном для .net framework классе: DbProviderFactories. там всё предельно ясно и удобно
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876839
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеекCompositum5копеек
Что бы вы посоветовали?
используйте DbProviderFactories для получения нужного вам провайдера (DbProviderFactory), который, в свою очередь создаст нужные вам экземпляры всех классов, заточенных именно под конкретную СУБД.
Код получите единый, т.е. менять ничего не придется, и сможете влёт переключаться на любой др. СУБД.
сейчас у меня нет под рукой кода, но дома лежит подробный развернутый демонстрационный код (написал для консольного приложения). Если захотите - вечером приду домой и выложу его в этом топике.

Был бы весьма признателен.
Спасибо за помощь.
нашел код (вспомнил, что я его выкладывал на форуме). Создайте новое консольное приложение, скопируйте в него весь код и запустите. поскольку все провайдеры данных реализуют единые интерфейсы, то не составит труда переключится с одной субд на др. без изменения в коде. просто в файле конфигурации храните строку подключения. А программно из нее узнаете, какой провайдер для нее используется и соответственно юзаете конкретного, нужного вам провайдера.
Код, демонструрующий это я привел когда-то здесь .
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876866
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum
нет это не оно

Почему это "не оно"?
Compositum
я именно о родном для .net framework классе: DbProviderFactories

Ну и я ж о нем, родимом...
Compositum
там всё предельно ясно и удобно

Я тоже так считал, пока речь шла о рукомашестве и ногодрыжестве (сиречЪ - теории)
А на практике:
1. DbProviderFactory ConnectionString - родил
2. DbConnection из DbProviderFactory - родил
3. DbCommand из DbConnection - родил
4. Получить параметры SP - балалайка Ж8-/ Пришлось enum по провайдеру городить и в соответствии xCommandBuilder специфичный рожать. Мне самому это не нравится. Вот и спросил - мо я что-то упустил в этой жизни?
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876930
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
4. Получить параметры SP - балалайка Ж8-/ Пришлось enum по провайдеру городить и в соответствии xCommandBuilder специфичный рожать. Мне самому это не нравится. Вот и спросил - мо я что-то упустил в этой жизни?

какие проблемы возникли с получением параметра SP ? =)
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876964
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumEx_Soft
4. Получить параметры SP - балалайка Ж8-/ Пришлось enum по провайдеру городить и в соответствии xCommandBuilder специфичный рожать. Мне самому это не нравится. Вот и спросил - мо я что-то упустил в этой жизни?

какие проблемы возникли с получением параметра SP ? =)
п.с. почему спрашиваю - потому, что точно знаю , что там никаких проблем нет кстати, в приведенном мною коде я показал как создается параметр для конкретного провайдера ;)

Так что у вас там с "балалайками", "рукомашеством и ногодрыжеством" уважаемый практик ?
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35876978
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum
какие проблемы возникли

как по выше описанной стройной схеме вызвать, соответственно, для:
M$ SQL - SqlCommandBuilder.DeriveParameters()
OLE DB - OleDbCommandBuilder.DeriveParameters()
FB - FbCommandBuilder.DeriveParameters()
Sybase ASE - AseCommandBuilder.DeriveParameters()
etc.
???
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877084
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
как по выше описанной стройной схеме вызвать, соответственно, для:
M$ SQL - SqlCommandBuilder.DeriveParameters()
OLE DB - OleDbCommandBuilder.DeriveParameters()
FB - FbCommandBuilder.DeriveParameters()
Sybase ASE - AseCommandBuilder.DeriveParameters()
etc.
???
_________________
"Helo, word!" - 17 errors 56 warnings

насчёт DeriveParameters - тут я согласен. Значит не верно вас понял - я так понял, что вы не смогли создать (а не считать параметры из хранимки бд) параметр нужного провайдера. В этом случае действительно - без enum не обойтись, однако этот момент, на мой взгляд, можно решить, единожды - упаковав код в расширяемый метод , который будет вызываться на классе DbCommandBuilder. И назвать его (метод) соответственно: DbDeriveParameters.
В конце концов в жизни у нас не так много СУБД, чтобы эту информацию (я о составе enum) пришлось бы менять часто (имхо).
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877225
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum
упаковав код в расширяемый метод , который будет вызываться на классе DbCommandBuilder

Маленький набросок, если можно...
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877251
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, почитал, подумал поэкспериментировал.
универсальный класс в моем случае порождает слишком много всяких если.
под каждую субд буду реализовывать свой класс обращения к данным.
В конце концов разные типы коннекшнов и т.д. для того и создавали.
Если бы все было так гладко, сделали бы один универсальный класс.
Всем спасибо...
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877355
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
Compositum
упаковав код в расширяемый метод , который будет вызываться на классе DbCommandBuilder

Маленький набросок, если можно...
_________________
"Helo, word!" - 17 errors 56 warnings


Я думаю, что как-то так:
Код: 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.
    public static class MyClass
    {
        public static DbCommand DbDeriveParameters(this DbCommandBuilder source, DbCommand cmd)
        {
            DbCommand ret;
            switch (cmd.ToString())
            {                
                //Если есть еще какие нужные провайдеры - следует добавить соответствующий блок case
                case "System.Data.OleDb.OleDbCommand":
                    OleDbCommand build = (OleDbCommand) cmd;
                    OleDbCommandBuilder.DeriveParameters(build);
                    ret = build; 
                    break;
                case "System.Data.OracleClient.OracleCommand":
                    OracleCommand build_1 = (OracleCommand) cmd;
                    OracleCommandBuilder.DeriveParameters(build_1);
                    ret = build_1;
                    break;
                case "System.Data.SqlClient.SqlCommand":
                    SqlCommand build_2 = (SqlCommand) cmd;
                    SqlCommandBuilder.DeriveParameters(build_2);
                    ret = build_2;
                    break;
                case "System.Data.SqlServerCe.SqlCeCommandBuilder":
                    SqlCeCommand build_3 = (SqlCeCommand) cmd;
                    //Для SqlCeCommandBuilder не существует метода DeriveParameters
                    ret = build_3;
                    break;
                default:
                    throw new Exception("Отсутствует информация по указанному провайдеру");
                    break;
            }
            return ret;
        }
    }
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877369
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеекВсем спасибо, почитал, подумал поэкспериментировал.
универсальный класс в моем случае порождает слишком много всяких если.
под каждую субд буду реализовывать свой класс обращения к данным.
В конце концов разные типы коннекшнов и т.д. для того и создавали.
Если бы все было так гладко, сделали бы один универсальный класс.
Всем спасибо...
плохо подумали. для того и реализован единый интерфейс для всех классов - чтобы по одному образцу работать со всеми. дело ваше (пожимает плечами...)
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877410
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
Compositum
упаковав код в расширяемый метод , который будет вызываться на классе DbCommandBuilder

Маленький набросок, если можно...
_________________
"Helo, word!" - 17 errors 56 warnings

правда я для метода реализовал на выходе не void, но это не проблема - можете подправить код на своё усмотрение. вроде должно работать...
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877465
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum5копеекВсем спасибо, почитал, подумал поэкспериментировал.
универсальный класс в моем случае порождает слишком много всяких если.
под каждую субд буду реализовывать свой класс обращения к данным.
В конце концов разные типы коннекшнов и т.д. для того и создавали.
Если бы все было так гладко, сделали бы один универсальный класс.
Всем спасибо...
плохо подумали. для того и реализован единый интерфейс для всех классов - чтобы по одному образцу работать со всеми. дело ваше (пожимает плечами...)

чем Ваш код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
case
                case "System.Data.OracleClient.OracleCommand":
                      тра та та
                    break;
                case "System.Data.SqlClient.SqlCommand":
                      тра та та
                    break;

отличается от моего изначального
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
case
                case "System.Data.OracleClient.OracleCommand":
                       OracleCommand cmd = ....

                    break;
                case "System.Data.SqlClient.SqlCommand":
                      SqlCommand cmd = ....
                    break;

Плюсы в чем ?
В вашем решении пока я вижу только лишние телодвижения и в результате те же проблемы: проверка по типу и кастомная логика для каждого типа, ручками.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877507
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек
Плюсы в чем ?
В вашем решении пока я вижу только лишние телодвижения и в результате те же проблемы: проверка по типу и кастомная логика для каждого типа, ручками.
плохо смотрите. вы знакомы с расширяющими методами (судя по вашей реплике - нет). Иначе бы знали, что данный класс добавляет к любому экземпляру класса DbCommandBuilder (или наследуемому от него) новый метод - DbDeriveParameters.Теперь любой экземпляр класса DbCommandBuilder имеет этот метод. Пояснять плюсы не буду, ибо они очевидны.

п.с. не ленитесь читать книжки...
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877584
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum5копеек
Плюсы в чем ?
В вашем решении пока я вижу только лишние телодвижения и в результате те же проблемы: проверка по типу и кастомная логика для каждого типа, ручками.
плохо смотрите. вы знакомы с расширяющими методами (судя по вашей реплике - нет). Иначе бы знали, что данный класс добавляет к любому экземпляру класса DbCommandBuilder (или наследуемому от него) новый метод - DbDeriveParameters.Теперь любой экземпляр класса DbCommandBuilder имеет этот метод. Пояснять плюсы не буду, ибо они очевидны.

п.с. не ленитесь читать книжки...

Я со всем этим согласен, но к выводу как раз пришел читая книжки,
Цитирую:
"Например не существует обобщенного способа перехватывать объекты исключений базы данных...."
"... разные поставщики могут подерживать специализированные средства, недоступные для общих базовых классов"

Я не говорю что предложенный вами подход неудачен. В вашем случае его возможно достаточно, в моем случае он может оказаться неоптимален. Причем неоптимален впоследствии.
В данном случае мне важнее возможность как можно более широко использовать возможности предоставляемые каждой СУБД. А универсальный поставщик как раз сужает эти возможности.
Условно говоря я лучше сейчас потрачу время, чем потом окажусь перед проблемой ради которой придется рефакторить пару-тройку-десятку приложений.

В любом случае спасибо за инфо, все это очень помогло.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877599
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеекА универсальный поставщик как раз сужает эти возможности.
Если честно - я не понял этой фразы. О каком универсальном поставщике идет речь? Ведь мы извлекаем каждый раз конкретного, нужного нам поставщика, просто упаковываем его в родительский класс. Но распаковать-то не проблема. Это в C++ (насколько я знаю) если бы мы упаковали объект дочернего класса в родительский, то все то, что было характерно чисто для дочернего класса - обрубалось, однако в шарпее это ведь не так - мы всегда может затем без каких либо потерь преобразовать в его настоящий тип и использовать его на все 100%.

Поясните пожалуйста.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877607
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,
В с++ то - же самое.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877616
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек
"... не существует обобщенного способа перехватывать объекты исключений базы данных...."
"... разные поставщики могут подерживать специализированные средства, недоступные для общих базовых классов"
но ведь все поставщики так или иначе пишут код под .net, а следовательно, как мне кажется, все исключения должны наследоваться от класса Exeption. Т.е. можно программно отслеживать его.
Видимо чего-то я не понимаю =)
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877621
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_LamerCompositum,
В с++ то - же самое.
значит путаю с др. языком...

странно, мне почему-то запомнилось, что это именно в C++...
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877624
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек,
Ничего нигде вы не сужаете.
Объясню по простому.
У вас есть конкретные классы для работы с разными серверами(с учетом их индивидуальных особенностей).
Фабрика вам дает упакованный объект, в этом конкретном классе вы его распаковываете, и работаете с учетом этих особенностей.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877632
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_Lamer5копеек,
Ничего нигде вы не сужаете.
Объясню по простому.
У вас есть конкретные классы для работы с разными серверами(с учетом их индивидуальных особенностей).
Фабрика вам дает упакованный объект, в этом конкретном классе вы его распаковываете, и работаете с учетом этих особенностей.
+1:
то, что я и пытаюсь объяснить человеку =)

видать хреново объясняю =(((
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877635
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_Lamer,

Мне почему-то казалось, что код, который я привел в самом начале для консольного приложения, довольно развёрнуто это раскрыл (просто для меня это очень наглядно, решил, что и для др. так же будет понятным)...
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877639
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumSQL_Lamer,

Мне почему-то казалось, что код, который я привел в самом начале для консольного приложения, довольно развёрнуто это раскрыл (просто для меня это очень наглядно, решил, что и для др. так же будет понятным)...

А я поленился читать первую страницу :))
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877643
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_LamerCompositumSQL_Lamer,

Мне почему-то казалось, что код, который я привел в самом начале для консольного приложения, довольно развёрнуто это раскрыл (просто для меня это очень наглядно, решил, что и для др. так же будет понятным)...

А я поленился читать первую страницу :))
а я там код не приводил, только ссылку на него.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877657
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

5копеек просто не вкурил гибкость этого шаблона.
Бывает.
Если ему еще интерестна эта тема - рекомендую Гамму - паттерны проектирования.

5копеек,
Прямой подход - который вы используете - ничем не плох, кроме отсутствия гибкости.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877898
PC_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
 switch (cmd.ToString())
            {                
                //Если есть еще какие нужные провайдеры - следует добавить соответствующий блок case
                case "System.Data.OleDb.OleDbCommand":


заменить на

Код: plaintext
1.
2.
3.
4.
if(cmd is System.Data.OleDb.OleDbCommand)
{
}

...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877900
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PC_2,

это еще зачем??? и что мы получим тогда?
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877908
PC_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что зачем ?
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877910
PC_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему вместо ?

Код: plaintext
1.
else if (cmd.GetType().FullName == "System.Data.SqlClient.SqlCommand")

нужно писать

Код: plaintext
1.
else if (cmd is System.Data.SqlClient.SqlCommand)

не знаю, посиди подумай
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35877930
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PC_2
не знаю, посиди подумай

чего мне-то думать? это не я написал, а ты, вот сиди и думай . смысл написанного мною ясен мне и так, а над этим не вижу смысла думать (ибо не вижу проблем в написанном мною коде, во всяком случае пока ;) )

Модератор: Тема перенесена из форума "C#.NET".
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878650
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PC_2
Код: plaintext
1.
cmd is System.Data.OleDb.OleDbCommand)


Спасибо, на мой взгляд верное замечание.

CompositumО каком универсальном поставщике идет речь? Ведь мы извлекаем каждый раз конкретного, нужного нам поставщика, просто упаковываем его в родительский класс. Но распаковать-то не проблема. Это в C++ (насколько я знаю) если бы мы упаковали объект дочернего класса в родительский, то все то, что было характерно чисто для дочернего класса - обрубалось, однако в шарпее это ведь не так - мы всегда может затем без каких либо потерь преобразовать в его настоящий тип и использовать его на все 100%.

Поясните пожалуйста.

В данном случае я понял вас так.
Есть некий класс или унаследованный метод - оболочка обрабатывающая запросы к серверу БД.
В него передаем класс DBcommand с заполнеными параметрами и строкой соединения.

В вашем случае имеем внутри этого класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
public чтото Run(cmdIn)
{
providerName =// берем из cmd.connection строку подключения и провайдера
DbProviderFactory provider = DbProviderFactories.GetFactory(providerName);
DbCommand cmdprov = provider.CreateCommand();
cmdprov = cmdIn;
// выполнение запроса
// обработка результатов
}

Я правильно понимаю или нет вашу идею?

В моем случае
Код: plaintext
1.
2.
3.
4.
5.
public чтото Run(cmd)
{
// выполнение запроса
// обработка результатов
}

в любом случае для каких то операций специфичных для каждого сервера БД нужно проверять тип провайдера и условно обрабатывать его.
В таком контексте не вижу смысла использовать DbProviderFactory. Т.к логика что с ним что без него одинакова, а сложность кода возрастает.
Возможно я чего то не понимаю, поясните.

SQL_Lamer
Ничего нигде вы не сужаете.
Объясню по простому.
У вас есть конкретные классы для работы с разными серверами(с учетом их индивидуальных особенностей).
Фабрика вам дает упакованный объект, в этом конкретном классе вы его распаковываете, и работаете с учетом этих особенностей.

я понимаю что фабрика дает мне объект, я не понимаю смысл писать под фабрику если можно написать new "то что мне нужно" точно так же в зависимости от строки подключения и получить объект заточеный под конкретную СУБД.
Я не отвергаю этого подхода, просто не понимаю зачем лишняя возня с "упаковыванием / распаковыванием" как вы выразились
Был бы смысл если бы все провайдеры были полностью взаимозаменяемы, но этого нет на 100%.

Пока для меня смысл использования фабрики представляется примерно такой же как для того что бы использовать trim строки преобразовать ее сначала в объект а затем обратно в строку.
В чем гибкость не понимаю.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878707
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек,

возможно понимание придет к вам со временем, я устал биться
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878733
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum5копеек,

возможно понимание придет к вам со временем, я устал биться

Если вы не в состоянии объяснить, возможно вы сами не понимаете?
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878754
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеекCompositum5копеек,

возможно понимание придет к вам со временем, я устал биться

Если вы не в состоянии объяснить, возможно вы сами не понимаете?
именно так, я не понимаю вместе с разработчиками Майкрософта, создавшими класс DbProviderFactopy, и вместе с Дэвидом Сеппой, который в конце своей книги в приложении подробно разъясняет все прелести данного подхода вы обсолютно правы, снимаю шляпу
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878859
5копеек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum5копеекCompositum5копеек,

возможно понимание придет к вам со временем, я устал биться

Если вы не в состоянии объяснить, возможно вы сами не понимаете?
именно так, я не понимаю вместе с разработчиками Майкрософта, создавшими класс DbProviderFactopy, и вместе с Дэвидом Сеппой, который в конце своей книги в приложении подробно разъясняет все прелести данного подхода вы обсолютно правы, снимаю шляпу

Ну если у вас самоцель обязательно использовать каждый класс фреймворка, то тогда конечно вы правы .

Ну раз Сеппа разъясняет, вам что стоит повторить то что он говорит?

Пока мое впечатление осталось прежним.
DbProviderFactopy для простеньких приложений , аля select * from employee годится. А когда требуются всякие извраты с БД с уже написанным приложением, лучше использовать свои методы/для каждой БД.
А из книг я использую то что оправданно а не слепо пихаю везде модные новые словечки.
Ни Сеппа ни разработчики microsofta мои проблемы решать потом не будут.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878902
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5копеек,

Ога.
Всмотрелся в ваш топик повнимательней.
Действительно, фабрика вам тут не катит :)
Писанины будет больше, и все.
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878958
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну х.з. может я автора не так понял...
...
Рейтинг: 0 / 0
Соединение с разными серверами БД
    #35878964
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Искать - лень, но кто-то из корифеев (каж-цо оракулист) сказал, что абсолютно кросс'СУБД'шное приложение - миф.
Из личного опыта (с чем столкнулся):
1. Версионники и блокировочники
2. call syntax
3. select from stored procedure
Так что, IMHO, прозрачный переход возможен только между близкими СУБД. Вот теоретически перегоняли свое приложение с Sybase ASE на M$ SQL - вроде д.б. без проблем. По крайней мере, если не выпендреваться, на T-SQL-уровне. А так, IMHO, эта фабричность для доступа к одной СУБД под разными провайдерами (Odbc/OleDb/Sql). Да и то - м.б. ньюансы.
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Соединение с разными серверами БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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