powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
41 сообщений из 41, показаны все 2 страниц
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681294
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Есть несколько версий оракла (9 и 11).
На пользовательских компьютерах стоят клиенты соответствующей версионности.
Таблицы на серверах одни и те же - так что выборка данных получается универсальная.

Делать две версии проекта - под каждую Oracle.DataAccess.dll не хочется.
Подскажите, если нельзя добавить обе в проект, как их подключать динамически? (Желательно с примером подключения и обращения к OracleConnection, OracleCommand).
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681302
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1,

Используй клиента от 11й и проверь, что работает.

Мне лень лезть на саппорт, да и ты не указал точные версии клиента и сервера -ниже есть ссылки на патчноты
http://www.dba-oracle.com/t_oracle_client_versions_higher_lower_database_release.htm
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681317
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1,
Ну уж девятку то надо сменить.
Десятка куда ни шло, а девятка это как виндовс 3.1)))
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681322
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123BRS_1,
Ну уж девятку то надо сменить.
Десятка куда ни шло, а девятка это как виндовс 3.1)))Вопрос спорный.

9ка ничем плохим не вспоминается, а вот отладочный ОЕМ в 10ке просто пипец, сколько волос стоил, особенно в первых версиях. Допилили его только в 11.

Не нашел, работает ли 9ка на системах после ХР или нет..
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681335
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl,

авторИспользуй клиента от 11й и проверь, что работает.

Проект собранный с Oracle.DataAccess.dll (версия 2.112.1.0) от Oracle 11 - на компьютере с установленным клиентом от Oracle 9 не запускается.
Наоборот с Oracle.DataAccess.dll (версия 9.2.0.700) от Oracle 9 - на компьютере с установленным клиентом Oracle 11, впрочем, тоже не работает.

Переставлять клиентов на компьютерах пользователей не вариант.
Хочется универсальности от будущей программы.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681337
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1,

Клиентов придется, конечно, переставлять.

Или будешь иметь две версии(сборки) программы.

Конец вечно оттягивать не получится.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681346
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglBRS_1,
Клиентов придется, конечно, переставлять.
Или будешь иметь две версии(сборки) программы.
Конец вечно оттягивать не получится.


Может есть вариант с динамическим подключением библиотеки?
С экселем же можно работать (позднее связывание) не замарачиваясь какой офис, стоит на компе.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681372
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1Может есть вариант с динамическим подключением библиотеки?
С экселем же можно работать (позднее связывание) не замарачиваясь какой офис, стоит на компе.
Это потому что эксель - COM-приложение. И позднее связывание - оно исключительно из области работы с COM.
В данном случае вариантов 2:
1. Хардкорный: определять версию установленного клиента оракла, после этого грузить нужную сборку через Assembly.LoadFile, дальше - работать через рефлекшн.
2. Разработку вести на референсе к сборке какой-то одной версии (видимо, неважно какой). После компиляции выкладывать сборки в две разных папки внутри папки сборки. При установке приложения в зависимости от версии ораклового клиента в конфиге указывать ту или иную папку в assemblyBinding/probing , и прописывать bindingRedirect версии сборки.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681375
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Если есть возможность пересобрать:
Качаем Oracle Developer Tools for Visual Studio для своей весрии студии.
1.1. В проекте убираем ссылки Oracle.DataAccess заменяем на Oracle.ManagedDataAccess
1.2. соотвественно using Oracle.ManagedDataAccess.Client;
2. Собираем проект (ы)
3. С исполняемым файлом и всем что поставляем клиенту, добавляем в каталог исполняемого файла
Oracle.ManagedDataAccess.dll и tnsnames.ora
4. Забиваем на клиентов, можно их удалить вообще.
Все страшный сон с версионностью пропал.

Если нет возможности пересобрать - кусаем локти :) Но, не так все плохо.
Ставим предпоследнего клиента (11.х) - он будет работать с вашими БД. Важно, ставте 32-х разрядного клиента.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681376
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* Уточню:
1 клиент на машине 32-х разрядный 11.х.
Не надо ставить под каждую версию БД своего клиента.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681377
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1Проект собранный с Oracle.DataAccess.dll

Значит есть возможность сборки
BRS_1Переставлять клиентов на компьютерах пользователей не вариант.
Выше озвученый вариант вообще не требует клиента на компьютере пользователя.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681378
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglВопрос спорный.вопрос однозначный. Зайди в ветку оракла и поспорь.

Siemarglособенно в первых версиях.
Так всю жизнь вспоминать будем?
Я себе давно в прошлой жизни уже 12 версию поставил.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681442
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры ПавловныВ данном случае вариантов 2:
1. Хардкорный: определять версию установленного клиента оракла, после этого грузить нужную сборку через Assembly.LoadFile, дальше - работать через рефлекшн.

Можно примеры кода с рефлекшеном? Что бы, так сказать, "понимать всю глубину наших глубин" (с).
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681449
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1SiemarglBRS_1,
Клиентов придется, конечно, переставлять.
Или будешь иметь две версии(сборки) программы.
Конец вечно оттягивать не получится.


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

stells2BRS_1Проект собранный с Oracle.DataAccess.dll

Значит есть возможность сборки
BRS_1Переставлять клиентов на компьютерах пользователей не вариант.
Выше озвученый вариант вообще не требует клиента на компьютере пользователя.
ManagedDataAccess официально может коннектиться >= 10.2

Надо проверять.

Официально для 9.2 нужен ODAC11.2, а он только unmanaged
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681501
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglКстати, если убрать жесткий биндинг к версии Ассембли, то вроде так и работает - подсовывай только нужную версию, соотв версии клиента.
Нет, прописывать в конфиге bindingRedirect всё равно будет нужно, даже если у референса в свойствах будет указано Use specific version=False.
BRS_1Можно примеры кода с рефлекшеном? Что бы, так сказать, "понимать всю глубину наших глубин" (с).
Как-то вот так:
Код: c#
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.
class Program
{
  static void Main()
  {
    var reflector = new OraReflector();
    using (var cnn = reflector.GetConnection("........."))
    using (var cmd = reflector.GetCommand(@"
      select object_name, object_id
      from sys.all_objects
      where owner=:owner and rownum<10", cnn)
    )
    {
      reflector.AddParameter(cmd, "owner", "Varchar2", 100, "PUBLIC");
      using (var rd = cmd.ExecuteReader())
        while(rd.Read())
          Console.WriteLine("{0} {1}", rd.GetString(0), rd.GetDecimal(1));
    }
    Console.WriteLine("done");
    Console.ReadKey(true);
  }

}

class OraReflector
{
  readonly Assembly _oraAssembly;
  public OraReflector()
  {
    _oraAssembly = Assembly.LoadFile(@"D:\Trash\2\Oracle.ManagedDataAccess.dll");
  }

  public DbConnection GetConnection(string connectString)
  {
    var connectionType = GetOraType("OracleConnection");
    var connection = (DbConnection)Activator.CreateInstance(connectionType);
    connection.ConnectionString = connectString;
    connection.Open();
    return connection;
  }

  public DbCommand GetCommand(string command, DbConnection connection)
  {
    var commandType = GetOraType("OracleCommand");
    var ctor = commandType.GetConstructor(new[] {typeof(string), GetOraType("OracleConnection")});
    if (ctor==null)
      throw new ApplicationException("OracleCommand constructor notfound");
    return (DbCommand) ctor.Invoke(new object[] {command, connection});
  }

  public DbParameter AddParameter(DbCommand command, string name, string dataType, int size, object value)
  {
    var paramType = GetOraType("OracleParameter");
    var parameter = (DbParameter)Activator.CreateInstance(paramType);
    parameter.ParameterName = name;
    if (!string.IsNullOrEmpty(dataType))
      paramType.GetProperty("OracleDbType", BindingFlags.Public | BindingFlags.Instance)
        .SetValue(parameter, Enum.Parse(GetOraType("OracleDbType"), dataType, false), null);
    if (size != -1)
      parameter.Size = size;
    parameter.Value = value;
    command.Parameters.Add(parameter);
    return parameter;
  }

  const string DefaultNs = "Oracle.ManagedDataAccess.Client";
  Type GetOraType(string name)
  {
    return GetOraType(DefaultNs, name);
  }

  Type GetOraType(string @namespace, string name)
  {
    return _oraAssembly.GetType(string.Concat(@namespace, ".", name), true, false);
  }
}
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681526
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglManagedDataAccess официально может коннектиться >= 10.2
Надо проверять.
Официально для 9.2 нужен ODAC11.2, а он только unmanaged
Что-то не обнаружил явного указания.
По сути, что пропишем в tnsnames.ora (SID или службу, туда и подключимся), или нет?
Согласен, лично не цеплялся через ManagedDataAccess к 9-ке. Можно проверить, не сложно же.
С другой стороны, тогда вообще клиенты станут не нужны.

ps: конечно, надо бы уж как минимум на 11g перейти, но, это не вопрос топика
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681540
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2конечно, надо бы уж как минимум на 11g перейти, но, это не вопрос топика
Все впереди). Автор ещё не помучился).
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681553
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2SiemarglManagedDataAccess официально может коннектиться >= 10.2
Надо проверять.
Официально для 9.2 нужен ODAC11.2, а он только unmanaged
Что-то не обнаружил явного указания....
https://www.oracle.com/technetwork/topics/dotnet/install122010-3711118.html
ODAC 12.2c Release 1 (12.2.0.1.0) Installation Instructions, Setup, and NotesThe following items are required for ODAC:

Windows x64 operating system

Windows 10 (Pro, Enterprise, and Education editions), Windows 8.1 and Windows 8 (Pro and Enterprise editions), Windows 7 (Professional, Enterprise, Ultimate editions), Windows Server 2016 (Standard, Datacenter, and Essentials Editions), Windows Server 2012 R2 and Windows Server 2012 (Standard, Datacenter, Essentials, and Foundation editions)

Access to an Oracle Database Server ( Oracle 10g Release 2 or later )

аналогично читать для ODAC11
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681563
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,
Я говорю о ODAC for Visual Studio 2015 (например), там я не увидел ограничений по версии oracle
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39681582
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры ПавловныКак-то вот так:


Благодарю!!!
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805658
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался, может кому пригодится:

Итак, начало программы, глобальные типы и переменные:
(Enum (скопирован по образцу OracleDbType) – понадобится позже, при работе с параметрами)

Код: c#
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.
public partial class MainForm : Form
    {
        IniFile ini;

        Assembly assembly = null;
        Type t_ora_connection = null;
        Type t_ora_param_collection = null;
        Type t_ora_oracledbtype = null;
        
        object obj_ora_connection = null;   

        public enum MyOracleDbType
        {
            BFile = 101,
            Blob = 102,
            Byte = 103,
            Char = 104,
            Clob = 105,
            Date = 106,
            Decimal = 107,
            Double = 108,
            Long = 109,
            LongRaw = 110,
            Int16 = 111,
            Int32 = 112,
            Int64 = 113,
            IntervalDS = 114,
            IntervalYM = 115,
            NClob = 116,
            NChar = 117,
            NVarchar2 = 119,
            Raw = 120,
            RefCursor = 121,
            Single = 122,
            TimeStamp = 123,
            TimeStampLTZ = 124,
            TimeStampTZ = 125,
            Varchar2 = 126,
            XmlType = 127,
        }



Старт программы и подключение к БД:

Код: c#
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.
        private void MainForm_Load(object sender, EventArgs e)
        {
            #region выбор библиотеки
            s_temp = ini.IniReadValue("ConnectSection", "version");
            if (!string.IsNullOrEmpty(s_temp))
            {
                string s_dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                
                switch (s_temp)
                {
                    case "9":
                        s_dir += "\\Ora9\\Oracle.DataAccess.dll";
                        break;

                    case "11":
                        s_dir += "\\Ora11\\Oracle.DataAccess.dll";
                        break;
                }
                assembly = Assembly.LoadFrom(s_dir); 
            }
            #endregion

            string s_login = ini.IniReadValue("ConnectSection", "login");
            string s_pass = ini.IniReadValue("ConnectSection", "pass");
            string s_alias = ini.IniReadValue("ConnectSection", "alias");

            if (!do_connect(s_login, s_pass, s_alias))
            {
                  this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
                  this.Close();
                  return;
            }
            ...
       }



Код: c#
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.
        private bool do_connect(string s_login, string s_pass, string s_alias)
        {
            t_ora_connection = assembly.GetType("Oracle.DataAccess.Client.OracleConnection");
            t_ora_param_collection = assembly.GetType("Oracle.DataAccess.Client.OracleParameterCollection");
            t_ora_oracledbtype = assembly.GetType("Oracle.DataAccess.Client.OracleDbType");

            obj_ora_connection = assembly.CreateInstance("Oracle.DataAccess.Client.OracleConnection");

            bool b_result = false;
            string s_con = "User Id=" + s_login +
                           ";Password=" + s_pass +
                           ";Data Source=" + s_alias;

            MethodInfo mi_set_conn_str = t_ora_connection.GetMethod("set_ConnectionString");
            MethodInfo mi_state = t_ora_connection.GetMethod("get_State");
            MethodInfo mi_open = t_ora_connection.GetMethod("Open");

            Object[] o_arr = new Object[1];
            o_arr[0] = s_con;

            mi_set_conn_str.Invoke(obj_ora_connection, o_arr);           //добавили строку подключения
            
            try
            {
                mi_open.Invoke(obj_ora_connection, null);               //открыли соединение
                
                if ((ConnectionState)mi_state.Invoke(obj_ora_connection, null) == System.Data.ConnectionState.Open)     //проверили состояние подключения
                {
                    Append_Log("Подключение к БД: " + System.Data.ConnectionState.Open.ToString());
                    b_result = true;
                }
            }
            catch (Exception ex)
            {
                Append_Log(ex.ToString());
            }            
            
            return b_result;
        }
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805659
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переходим к самому вкусному, к получению данных:

Код: c#
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.
        private DataTable GetDataFrom_Oracle4(
                                                int i_s1,
                                                int i_n1,
                                                int i_n2,
                                                DateTime dt                                                                                                
                                                )
        {

            Type t_ora_command = null;
            object obj_ora_command = null;

            try
            {
                string s_query = "select " +
                                 [вырезано цензурой]
                                  "where  a.s1 = :P_S1 " +
                                 "and    a.n1 = :P_N1 " +
                                 "and    a.n2 = :P_N2 " +
                                 "and    a.dd_mm_yyyy = :P_DD_MM_YYYY " +
                                 "order by 1,2,3";                                                                  

                t_ora_command = assembly.GetType("Oracle.DataAccess.Client.OracleCommand");
                obj_ora_command = assembly.CreateInstance("Oracle.DataAccess.Client.OracleCommand");

                MethodInfo mi_set_cmd_text = t_ora_command.GetMethod("set_CommandText", new Type[] { typeof(System.String) });
                mi_set_cmd_text.Invoke(obj_ora_command, new object[1] { s_query });                                                     //засунули строку запроса

                MethodInfo mi_set_connection = t_ora_command.GetMethod("set_Connection", new Type[] { t_ora_connection });
                mi_set_connection.Invoke(obj_ora_command, new object[1] { obj_ora_connection });

                MethodInfo mi_set_commandtype = t_ora_command.GetMethod("set_CommandType", new Type[] { typeof(System.Data.CommandType) });
                mi_set_commandtype.Invoke(obj_ora_command, new object[1] { System.Data.CommandType.Text });

                MethodInfo mi_bindbyname = t_ora_command.GetMethod("set_BindByName", new Type[] { typeof(bool)});
                mi_bindbyname.Invoke(obj_ora_command, new object[1] { true });

                MethodInfo mi_get_parameters = t_ora_command.GetMethod("get_Parameters");
                object obj_ora_param_collection = mi_get_parameters.Invoke(obj_ora_command, null);             

                MethodInfo mi_param_add = t_ora_param_collection.GetMethod("Add", new Type[] { typeof(System.String), t_ora_oracledbtype, typeof(System.Object), typeof(System.Data.ParameterDirection) });

                object obj_ora_param_s1 = mi_param_add.Invoke(obj_ora_param_collection, new object[] { "P_S1", MyOracleDbType.Int32, i_s1, ParameterDirection.Input });
                object obj_ora_param_n1 = mi_param_add.Invoke(obj_ora_param_collection, new object[] { "P_N1", MyOracleDbType.Int32, i_n1, ParameterDirection.Input });
                object obj_ora_param_n2 = mi_param_add.Invoke(obj_ora_param_collection, new object[] { "P_N2", MyOracleDbType.Int32, i_n2, ParameterDirection.Input });
                object obj_ora_param_dd_mm_yyyy = mi_param_add.Invoke(obj_ora_param_collection, new object[] { "P_DD_MM_YYYY", MyOracleDbType.Date, dt.Date, ParameterDirection.Input });

                MethodInfo mi_executereader = t_ora_command.GetMethod("ExecuteReader", new Type[] { });
                object obj_ora_reader = mi_executereader.Invoke(obj_ora_command, null);

                DataTable DT = new DataTable();
                DT.Load((IDataReader)obj_ora_reader);

                obj_ora_param_collection = obj_ora_param_s1 = obj_ora_param_n1 = obj_ora_param_n2 = obj_ora_param_dd_mm_yyyy = obj_ora_reader = null;

                return DT;
                
            }
            catch (Exception asc_exc)
            {
                Append_Log(asc_exc.ToString());

                return null;
            }
            finally
            {
                if (obj_ora_command != null)
                {
                    ((IDisposable)obj_ora_command).Dispose();
                }                
            }
        }        
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805669
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То, что хотел реализовать (что бы один проект использовал разные DLL для подключения) - получилось.

Примечания:

1) Без объявления MethodInfo можно обойтись, но с ними удобнее вести отладку.
2) При вызове do_connect код

Код: c#
1.
            MethodInfo mi_set_conn_str = t_ora_connection.GetMethod("set_ConnectionString");



отработал без ошибок, хотя правильнее его было бы вызывать вот так:

Код: c#
1.
            MethodInfo mi_set_conn_str = t_ora_connection.GetMethod("set_ConnectionString",new Type[] { typeof(System.String) });



наверное, дело в том что у типа Oracle.DataAccess.Client.OracleConnection есть только один такой метод set_ConnectionString(System.String)

3) Использовать using , как раньше:

Код: c#
1.
2.
3.
4.
5.
6.
using (OracleCommand cmd = new OracleCommand(s_query, oc))
{
     cmd.CommandType = CommandType.Text;
     cmd.BindByName = true;
     ...
}



Не получилось, т.к. obj_ora_command не имеет явного преобразования в System.IDisposable


Ну, вот как-то так.
Критика кода приветствуется.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805676
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1,
Какая критика. Субд 9ка это субд прошлого тысячилетия. От того что нет апдейта ПО страдают все. И код в том числе.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805695
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1....Ну, вот как-то так.
Критика кода приветствуется.Это называется "приколхозил" =)
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805702
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
объясните, зачем городить рефлексию в данным случае?
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805720
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123BRS_1,
Какая критика. Субд 9ка это субд прошлого тысячилетия. От того что нет апдейта ПО страдают все. И код в том числе.

Субд у нас сейчас 11 версия, а вот клиент остался местами 9 версии, местами 11.
Насчет страданий - все зависит от обстоятельств. В нашем случае с повышением ничего не измениось, как впрочем не изменилось бы и с понижением с 11 на 9 субд.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805722
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesобъясните, зачем городить рефлексию в данным случае?

Есть более простое решение? С удовольствием ознакомлюсь.

Всё переинсталить, отформатировать, перейти на линукс, сменить страну/планету - не предлагать.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805724
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1Есть более простое решение? С удовольствием ознакомлюсь.
Ну, хотя бы всю работу с рефлекшеном вынести в отдельный класс, чтобы на каждое действие с базой не писать огромную простыню работы с рефлекшеном.
Ну, и как бы выше я еще предлагал вариант с перенаправлением сборок в конфиге.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805725
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1Субд у нас сейчас 11 версия, а вот клиент остался местами 9 версии, местами 11.не понял.
Так в чем изначальная ПРОБЛЕМА?
Как автоматом проапгрейдить клиента оракла у клиентов?
Или использовать подключение к базе не требуещее клиента оракле на машине?
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805732
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать 2 поставщика данных для 11 и 9 версии, определить интерфейсы взаимодействия которые будут общими для обоих поставщиков . Это всяко лучше, чем городить вот такой говнокод, от которого кровь из глаз, а потом и из зада пойдет, если надо будет это поддерживать.
Таким образов вы абстрагируйтесь от клиента СУБД и его версии, будет совершенно не важно, Oracle это или MSSQL.
Динамически загружать нужный и возвращать интерфейс взаимодействия. И работать с ним по человечески, а не вот таким чудесным образом, как у вас...
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805745
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesданных для 11 и 9 версиида. Но выше он вообще сказал что 9ку убрали.
Непонятно.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805753
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры ПавловныНу, хотя бы всю работу с рефлекшеном вынести в отдельный класс, чтобы на каждое действие с базой не писать огромную простыню работы с рефлекшеном.

Согласен, но поленился т.к. программа примитивная (старт, один запрос данных, сохранение в файл, завершение работы).

Сон Веры ПавловныНу, и как бы выше я еще предлагал вариант с перенаправлением сборок в конфиге.

Было дело, но на тот момент не смог разобраться.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805788
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1Согласен, но поленился т.к. программа примитивная (старт, один запрос данных, сохранение в файл, завершение работы).
как это согласуется с:
BRS_1Есть более простое решение? С удовольствием ознакомлюсь.
Всё переинсталить, отформатировать, перейти на линукс, сменить страну/планету - не предлагать.
?
Я так понял, что такого решение как вы привели - нельзя использовать в реальной жизни.
Удачи!
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805869
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Я так понял, что такого решение как вы привели - нельзя использовать в реальной жизни.
Удачи!

Наверное, мы друг друга не понимаем.

Есть два файла Oracle.DataAccess.dll (v.9.2.0.700) и Oracle.DataAccess.dll (v.2.112.1.0) .
В программу я могу подключить только один из них.
На одних компьютерах программа скомпилированная с DLL от 9 оракла будет работать, на других нет.
И наоборот, на тех компьютерах, где не работает программа с DLL от 9 оракла - там будет работать программа с DLL от 11 оракла.

Что хотелось - получить один универсальный билд программы, который будет подключать необходимую DLL из двух и работать.
(При этом ничего и нигде не переустанавливать, не приводить все компы к одному программному единообразию и не менять ландшафт вручную).

В результате написания - программа работает как и хотелось, но получился такой вот страшный код.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805871
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1Наверное, мы друг друга не понимаем.ну дак разговаривай, для этого и форум.
Где ответ - какие у тебя сервера для коннекта?
У меня вот вроде, из NuGet дрова к ораклу стоят.
Получается, что не ответив на вопросы выше ты зря написал это:
BRS_1Есть два файла Oracle.DataAccess.dll (v.9.2.0.700) и Oracle.DataAccess.dll (v.2.112.1.0) .
В программу я могу подключить только один из них.
На одних компьютерах программа скомпилированная с DLL от 9 оракла будет работать, на других нет.
И наоборот, на тех компьютерах, где не работает программа с DLL от 9 оракла - там будет работать программа с DLL от 11 оракла.

Что хотелось - получить один универсальный билд программы, который будет подключать необходимую DLL из двух и работать.
(При этом ничего и нигде не переустанавливать, не приводить все компы к одному программному единообразию и не менять ландшафт вручную).

В результате написания - программа работает как и хотелось, но получился такой вот страшный код.
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805873
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BRS_1,

создаете сборку Х, описывайте в ней все интерфейсы взаимодействия вашего клиентского приложения с базой или более примитивные вещи
создаете сборку У, подключаете к ней сборку X и сборку клиента 9 версии, создаете в сборке классы реализующие интерфейсы из сборки X, через 9 клиент
создаете сборку Z, подключаете к ней сборку X и сборку клиента 11 версии, создаете в сборке классы реализующие интерфейсы из сборки X, через 11 клиент
подключаете сборку X в свою клиентскую программу, пишите код который осуществляет вызов нужных вам методов через интерфейсы определенные в сборке X. Во время запуска в Runtime загружает либо сборку У, либо сборку Z, создаете экземпляр объектов реализующий интерфейс из сборки X и используйте его через интерфейс.

интерфейсы именно для этого и придумали.
есть подозрения, что клиент 9 и 11 версии уже реализуют интерфейсы пространства имен System.Data
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39805998
BRS_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Благодарю, попробую
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39806022
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>BRS_1, 30 июл 18, 22:03 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300032&msg=21616255][21616255]
>...Подскажите, если нельзя добавить обе в проект…
<Посмотрите здесь .
Работаю так:
Код: plsql
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.
    //-- Выполнение хранимой процедуры
    public static void Entity_SP(string spname, dlg_sp sp, object[][] psp, dlg_RowToEntity RowToEntity) {
      reader = null; wspErr = null; bMax = false;
      int n = (psp==null)? 0: psp.Length;
      OracleParameter[] asp = new OracleParameter[n+1];
      asp[0]= new OracleParameter("cur_viborka", OracleDbType.Cursor, ParameterDirection.Output);
      try {
        for (int i=0;i<n;i++) {
          switch (psp[i].Length) {
            case 2: asp[i+1] = new OracleParameter((string)psp[i][0], psp[i][1]); break;
            case 3: asp[i+1] = new OracleParameter((string)psp[i][0], OracleDbType.Raw, (int)psp[i][1], psp[i][2], ParameterDirection.Input); break;
          }
        }
        using (OracleConnection connection = new OracleConnection(гп.str_Соединение)) {
          connection.Open();
          OracleCommand command = new OracleCommand("", connection);
          command.Parameters.Clear();
          command.Parameters.AddRange(asp);
          command.CommandText = spname;
          command.CommandType = CommandType.StoredProcedure;

          //-- Формируем коллекцию из выборки
          using (reader = (OracleDataReader)command.ExecuteReader()) { sp(RowToEntity); }
        }
      }
      catch (Exception ex){ wspErr = ex.Message; }
    }
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39806025
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>BRS_1, 30 июл 18, 22:03 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300032&msg=21616255][21616255]
>...Подскажите, если нельзя добавить обе в проект…
<Посмотрите здесь .
Работаю так:
Код: plsql
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.
    //-- Выполнение хранимой процедуры
    public static void Entity_SP(string spname, dlg_sp sp, object[][] psp, dlg_RowToEntity RowToEntity) {
      reader = null; wspErr = null; bMax = false;
      int n = (psp==null)? 0: psp.Length;
      OracleParameter[] asp = new OracleParameter[n+1];
      asp[0]= new OracleParameter("cur_viborka", OracleDbType.Cursor, ParameterDirection.Output);
      try {
        for (int i=0;i<n;i++) {
          switch (psp[i].Length) {
            case 2: asp[i+1] = new OracleParameter((string)psp[i][0], psp[i][1]); break;
            case 3: asp[i+1] = new OracleParameter((string)psp[i][0], OracleDbType.Raw, (int)psp[i][1], psp[i][2], ParameterDirection.Input); break;
          }
        }
        using (OracleConnection connection = new OracleConnection(гп.str_Соединение)) {
          connection.Open();
          OracleCommand command = new OracleCommand("", connection);
          command.Parameters.Clear();
          command.Parameters.AddRange(asp);
          command.CommandText = spname;
          command.CommandType = CommandType.StoredProcedure;

          //-- Формируем коллекцию из выборки
          using (reader = (OracleDataReader)command.ExecuteReader()) { sp(RowToEntity); }
        }
      }
      catch (Exception ex){ wspErr = ex.Message; }
    }
...
Рейтинг: 0 / 0
Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
    #39806028
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть из всего кода что ты скопипастил по теме только это:
ВМоисеев
Код: plsql
1.
new OracleConnection(гп.str_Соединение))
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Oracle.DataAccess.dll двух версий в одном проекте. Как реализовать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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