powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры из Си Шарп
21 сообщений из 46, страница 2 из 2
Вызов хранимой процедуры из Си Шарп
    #39851082
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ВМоисеев<Если принять Ваше предложение, то вызывающий будет зависим от типа базы данных (провайдера). Что, на мой взгляд, не есть хорошо.
С точностью до наоборот. Такой вызов поддерживают все базы.
Ну, по крайней мере те, с которыми я работал: MS SQL, IBM DB2, Oracle, MySQL
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851137
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Cat2, сегодня, 13:23
>С точностью до наоборот. Такой вызов поддерживают все базы.
Ну, по крайней мере те, с которыми я работал: MS SQL, IBM DB2, Oracle, MySQL

<Интересно, Вы меня заинтриговали. Работаю только с MS SQL и Oracle. Имею для обертки:

- MS SL
. . .
using System.Data.SqlClient;
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
   . . . 
   using (SqlConnection connection = new SqlConnection(гп.str_Соединение)) {
     connection.Open();
     SqlCommand command = new SqlCommand("", connection);
     command.Parameters.Clear();
     command.Parameters.AddRange(asp);
     command.CommandText = spname;
     command.CommandType = CommandType.StoredProcedure;
   . . .


- Oracle
. . .
using Devart.Data.Oracle;
. . .
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
   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;
   . . .

SqlCommand command и OracleCommand command - это сугубо разные вещи.
Независимость вызывающего кода от типа базы данных (ну почти) достигается промежуточным хранением:
Код: c#
1.
2.
3.
4.
5.
6.
. . .
      object[][] psp = new object[3][];
      psp[0] = new object[2] { "@pk_Entity", гп.gd_0 };
      psp[1] = new object[2] { "@str_Группа", (string.IsNullOrEmpty(xstr)) ? DBNull.Value : (object)( xstr + "%") };
      psp[2] = new object[2] { "@int_max", гп.max_Выборка};
. . .
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851274
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевSqlCommand command и OracleCommand command - это сугубо разные вещи
И обе они наследуются от одного и того же базового класса System.Data.Common.DbCommand из стандартной библиотеки фреймворка - им воспользоватсья не судьба? Зачем эта возня с обёрткой в object[]?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851327
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Сон Веры Павловны, сегодня, 18:44 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1315008&msg=21952785][21952785]
>И обе они наследуются от одного и того же базового класса…
<Ну и?
Сейчас в вызывающем классе так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows;
using System.Windows.Controls;
. . .
      //-- Готовим параметры запроса
      string xstr = str_ГруппаПФ.Trim();
      object[][] psp = new object[3][];
      psp[0] = new object[2] { "@pk_Entity", гп.gd_0 };
      psp[1] = new object[2] { "@str_Группа", (string.IsNullOrEmpty(xstr)) ? DBNull.Value : (object)( xstr + "%") };
      psp[2] = new object[2] { "@int_max", гп.max_Выборка};
      xrow = null; lst_Entity = null; lst_Entity = new List<row_Entity>();
      при.tmrStart(); await wsp.Entity_SP("au_Группы_Sel", wsp.sp_Sel, psp, RowToEntity); при.tmrStop();
. . .

Как Вы видите, здесь нет ссылки на провайдер базы данных. Вся специфика работы с базой находится в обертке.
Покажите Ваш код без возни с обёрткой в object[]. Буду признателен.
Уточняю - обертка, это класс работы с базой данных
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851405
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевКак Вы видите, здесь нет ссылки на провайдер базы данных. Вся специфика работы с базой находится в обертке.
Покажите Ваш код без возни с обёрткой в object[]. Буду признателен.
Уточняю - обертка, это класс работы с базой данных
Вы в самом деле не знаете, как работать с базовыми классами и интерфейсами?
Код: 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.
using System;
using System.Data;

namespace App.Infrastructure
{
  public enum DatabaseProvider
  {
    SqlServer,
    Oracle
  }

  public interface IDatabaseUtil
  {
    IDbConnection GetConnection(string connectionString);
  }

  public static class DatabaseUtil
  {
    public static IDatabaseUtil Create(DatabaseProvider provider)
    {
      switch(provider)
      {
        case DatabaseProvider.SqlServer:
          return new SqlServerDatabaseUtil();
        case DatabaseProvider.Oracle:
          return new OracleDatabaseUtil();
        default:
          throw new ArgumentException(provider.ToString());
      }
    }

    public static void AddParameter(this IDbCommand command, string name, object value)
    {
      if (command==null)
        throw new ArgumentNullException(nameof(command));
      var p = command.CreateParameter();
      p.ParameterName = name;
      p.Value = value ?? DBNull.Value;
      command.Parameters.Add(p);
    }
  }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
using System.Data;
using System.Data.SqlClient;
using Oracle.ManagedDataAccess.Client;

namespace App.Infrastructure
{
  internal class SqlServerDatabaseUtil : IDatabaseUtil
  {
    public IDbConnection GetConnection(string connectionString)
      => new SqlConnection(connectionString);
  }

  internal class OracleDatabaseUtil: IDatabaseUtil
  {
    public IDbConnection GetConnection(string connectionString)
      => new OracleConnection(connectionString);
  }
}


Код: 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.
using App.Infrastructure;
using System;
using System.Collections.Generic;
using System.Data;

namespace test
{
  class Program
  {
    public static void Main(string[] args)
    {
      var dbUtil = DatabaseUtil.Create(DatabaseProvider.SqlServer);
      using(var cnn = dbUtil.GetConnection("Data Source=.;Initial Catalog=master;Integrated Security=True"))
        foreach(var s in GetColumns(
          cnn,
          @"
            select column_name
            from information_schema.columns
            where table_schema=@owner and table_name=@table_name
          ",
          "dbo", "spt_fallback_db"
        ))
          Console.WriteLine(s);
      dbUtil = DatabaseUtil.Create(DatabaseProvider.Oracle);
      using(var cnn = dbUtil.GetConnection("User Id=scott;Password=tiger;Data Source=oracle"))
        foreach(var s in GetColumns(
          cnn,
          @"
            select column_name
            from sys.dba_tab_columns
            where owner=:owner and table_name=:table_name
          ",
          "SYS", "USER$"
        ))
          Console.WriteLine(s);
      Console.WriteLine("done");
      Console.ReadKey(true);
    }

    static IEnumerable<string> GetColumns(
      IDbConnection connection,
      string commandText,
      string owner,
      string tableName
    )
    {
      if (connection.State!=ConnectionState.Open)
        connection.Open();
      using(var cmd = connection.CreateCommand())
      {
        cmd.CommandText = commandText;
        cmd.AddParameter("owner", owner);
        cmd.AddParameter("table_name", tableName);
        using(var rd = cmd.ExecuteReader())
          while (rd.Read())
            yield return rd.GetString(0);
      }
    }
  }
}


App.Infrastructure - это отдельная сборка, в клиентском коде нет никаких специфических для провайдера импортов типов.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851460
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Сон Веры Павловны, сегодня, 07:41 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1315008&msg=21953038][21953038]
>Вы в самом деле не знаете, как работать с базовыми классами и интерфейсами?...
<Пока посмотрел код по диагонали. Мало что понял.
Сразу есть уточнение - разговор идет о вызове ХП с параметрами.
Далее, не вижу особенностей использования провайдеров MS SQL и Oracle.
Пример:
- MS SQL
Код: 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.
    //-- Выполнение хранимой процедуры
    public static async Task Entity_SP(string spname, dlg_sp sp, object[][] psp, dlg_RowToEntity RowToEntity) {
      reader = null;wspErr = null;
      int n = (psp==null)? 0: psp.Length;
      SqlParameter[] asp = new SqlParameter[n];     !!!!!!!!!!!!!
      try {
        for (int i=0;i<n;i++) { 
          switch (psp[i].Length) {
            case 2: asp[i] = new SqlParameter((string)psp[i][0], psp[i][1]); break;
            case 3:
              asp[i] = new SqlParameter((string)psp[i][0], SqlDbType.Binary, (int)psp[i][1]);
              asp[i].SqlValue = (byte[])psp[i][2];
              break;
          }
        }
        //{
        //str= (string)psp[i][0]; str = str.IndexOf(@"@") == 0 ? str : @"@" + str;
        //asp[i] = new SqlParameter(str, psp[i][1]);
        //}
        using (SqlConnection connection = new SqlConnection(гп.str_Соединение)) {
          connection.Open();
          SqlCommand command = new SqlCommand("", connection);
          command.Parameters.Clear();
          command.Parameters.AddRange(asp);
          command.CommandText = spname;
          command.CommandType = CommandType.StoredProcedure;

          //-- Формируем коллекцию из выборки
          using (reader = await command.ExecuteReaderAsync()) { sp(RowToEntity); }
        }
      }
      catch (Exception ex){ wspErr = ex.Message; }
    }


- Oracle
Код: 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.
    //-- Выполнение хранимой процедуры
    public static void Entity_SP(string spname, dlg_sp sp, object[][] psp, dlg_RowToEntity RowToEntity) {
      reader = null; wspErr = null;
      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
Вызов хранимой процедуры из Си Шарп
    #39851499
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевПока посмотрел код по диагонали. Мало что понял.
Учите матчасть.
ВМоисеевДалее, не вижу особенностей использования провайдеров MS SQL и Oracle.
Вы хотите, чтобы я в тестовом наколеночном примере вывалил описание нюансов на все случаи жизни?
Всё это вполне можно сделать внутри обёрток, если функциональость поддерживают обе базы. Расписывать такую рутинную очевидность смысла не вижу.
А вот такое
Код: c#
1.
(string)psp[i][0]


где
Код: c#
1.
object[][] psp


по моему скромному, лютый трэш. Какую-никакую типизированную обертку в виде спец. класса сделать не судьба? Чтобы задавать имя параметра, тип параметра? Если уж пока не получается понять, как использвать тот же System.Data.Common.DbParameter.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851627
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Сон Веры Павловны, сегодня, 11:55 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1315008&msg=21953247][21953247]
>Учите матчасть.
<Спасибо за совет. Учу потихоньку.
>...А вот такое … где … по моему скромному, лютый трэш.
<Странно это скромненький Вы наш - psp[i][0] содержит текстовое имя параметра при вызове ХП.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851801
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевpsp[i][0] содержит текстовое имя параметра при вызове ХП.
И это текстовое имя не контролируется никак. Если кто-то, кто работет с той же кодовой базой, вместо строки поместит туда что угодно другое - это выяснится только на рантайме. А тот же DbParameter просто не позволит этого сделать, поскольку попытка засунуть в ParameterName что-то, что не является строкой, рванёт на этапе компиляции. Аналогично и с прочими передаваемыми свойствами. Типизация того же размера параметра избавляет от накладных расходов при боксинге-анбоксинге, неизбежных при передаче значимых типов через заворачивание в object. Итд итп.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851826
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я за Сон Веры Павловны

Не надо умножать сущности
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851879
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Cat2, сегодня, 19:50 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1315008&msg=21953773][21953773]
>… Не надо умножать сущности
< А если так (класс обертка):
Код: 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.
  public static class wsp {
    public static int nRow;
    static SqlDataReader reader;
    public static string wspErr;
    public static SqlParameter[] asp;

    //-- Построение вектора параметров
    public static void sp_Параметры(int n) { asp = null; asp = new SqlParameter[n]; }
    //-- Построение значений параметров вызова хранимой процедуры
    public static void sp_Параметр(int i, string name, object op) { asp[i] = new SqlParameter(name, op); }
    //-- Построение значений параметров вызова хранимой процедуры
    public static void sp_Параметр(int i, string name, int m, object op ) {
      asp[i] = new SqlParameter(name, SqlDbType.Binary, m);  asp[i].SqlValue = (byte[])op;
    }
    . . .
    //-- Выполнение хранимой процедуры
    public static async Task Entity_SP(string spname, dlg_sp sp, dlg_RowToEntity RowToEntity) {
      try {
        using (SqlConnection connection = new SqlConnection(гп.str_Соединение)) {
          connection.Open();
          SqlCommand command = new SqlCommand("", connection);
          command.Parameters.Clear();
          command.Parameters.AddRange(asp);
          command.CommandText = spname;
          command.CommandType = CommandType.StoredProcedure;
          //-- Формируем коллекцию из выборки
          using (reader = await command.ExecuteReaderAsync()) { sp(RowToEntity); }
        }
      }
      catch (Exception ex) { wspErr = ex.Message; }
    }
    . . .
Тогда пользователь:
     . . .
      //-- Готовим параметры запроса
      wsp.sp_Параметры(3);
      wsp.sp_Параметр(0,"@pk_Entity", гп.gd_0);
      wsp.sp_Параметр(1, "@str_Язык", (string.IsNullOrEmpty(xstr)) ? Convert.DBNull : xstr += "%");
      wsp.sp_Параметр(2, "@int_max", гп.max_Выборка, гп.gd_0);

      xrow = null; lst_Entity = null; lst_Entity = new List<row_Entity>();
      при.tmrStart(); await wsp.Entity_SP("au01_Языки_Sel", wsp.sp_Sel, RowToEntity); при.tmrStop();
      if (wsp.wspErr != null) { MessageBox.Show(wsp.wspErr, caption_Entity, MessageBoxButton.OK); }
     . . .
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851896
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
Код: c#
1.
2.
3.
4.
5.
  public static class wsp {
    public static int nRow;
    static SqlDataReader reader;
    public static string wspErr;
    public static SqlParameter[] asp;




Я это даже не буду комментировать.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39851988
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Сон Веры Павловны, сегодня, 06:45 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1315008&msg=21953919][21953919]
>Я это даже не буду комментировать.
<Жаль. Была возможность напомнить, что надо использовать свойства - чистота кода!.
Код: c#
1.
2.
3.
4.
5.
6.
  public static class wsp {
    private static SqlDataReader reader;
    private static string wsp_Ошибка;
    private static SqlParameter[] asp;
    . . .
    public static string wspErr  { get  { return wsp_Ошибка; } }


Спасибо за обсуждение, помогает шлифовке базовых элементов
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39852013
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев<Жаль. Была возможность напомнить, что надо использовать свойства - чистота кода!.прежде всего тут за статик надо руки отрывать, свойства не помогут чистоте этого кода ))
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39852066
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Shocker.Pro, сегодня, 11:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1315008&msg=21954137][21954137]
>прежде всего тут за статик надо руки отрывать, свойства не помогут чистоте этого кода ))
<Вообще то тут принято аргументировать, здесь не литературный кружок
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39852144
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае наоборот - от тебя нужна аргументация для использования статика, потому что ни в каком вменяемом источнике ты не найдешь рекомендаций по подобному построению приложения.

Ну или примерно так:
ВМоисеевА если так (класс обертка):Обертка по сути своей никак не может быть статической. У тебя есть 100 конфет и один фантик. Ну обертывай.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39852386
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProВ данном случае наоборот - от тебя нужна аргументация для использования статика, потому что ни в каком вменяемом источнике ты не найдешь рекомендаций по подобному построению приложения.

Ну или примерно так:
ВМоисеевА если так (класс обертка):Обертка по сути своей никак не может быть статической. У тебя есть 100 конфет и один фантик. Ну обертывай.

чисто для срача, а какие аргументы кроме "конфет"?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39852391
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachShocker.ProВ данном случае наоборот - от тебя нужна аргументация для использования статика, потому что ни в каком вменяемом источнике ты не найдешь рекомендаций по подобному построению приложения.

Ну или примерно так:
пропущено...
Обертка по сути своей никак не может быть статической. У тебя есть 100 конфет и один фантик. Ну обертывай.

чисто для срача, а какие аргументы кроме "конфет"?

зайдем напрмер так. Dapper - фактически хелпер. все статическое
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39852429
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachчисто для срачаЕсли разрабатываешь в стиле монолит-форевер-сингл-разраб - делай что хочешь. Вон Сон комментировать отказался, и у меня большого желания нет. Этот класс не заменяемый, не тестируемый, не потокобезопасный, к нему не прикрутишь интерфейсы, не засунешь в DI-контейнер, не унаследуешь.love_bachзайдем напрмер так. Dapper - фактически хелпер. все статическоеИ что, все его классы хелперов имеют состояние?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39852687
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachчисто для срача, а какие аргументы кроме "конфет"?

https://docs.automapper.org/en/stable/9.0-Upgrade-Guide.html
9.0 Upgrade Guide
The static API was removed
Switch to the instance based API, preferably using dependency injection. See here and here.


Вот и спроси их "чисто для срача"
...
Рейтинг: 0 / 0
Вызов хранимой процедуры из Си Шарп
    #39853003
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Shocker.Pro, сегодня, 13:24 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1315008&msg=21955396][21955396]
>Вот и спроси их "чисто для срача"
<А если посмотреть здесь .
Думаю так - не можешь, не применяй.
И потом, разве можно применить один connect для работы с ним из нескольких потоков. Думаю, что не стоит удерживать долго connect в открытом состоянии.
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры из Си Шарп
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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