Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / передать параметры с разными соединениями одну хранимую процедуру на сервер / 18 сообщений из 18, страница 1 из 1
06.12.2013, 10:46
    #38491400
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Добрый день,
Может кто сталкивался
Есть проект на C#, в нем есть код, который вызывает хранимую процедуру на сервере 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.
try
                    {
                        // строка подключения вообще тянется из род. формы 
                        string conSQL = @"Data Source *******************************************";
                        SqlConnection con = new SqlConnection(conSQL);
                        SqlCommand sqlcom = new SqlCommand();
                        sqlcom = con.CreateCommand();
                        sqlcom.CommandType = CommandType.StoredProcedure;
                        sqlcom.CommandText = "CALC_DEPOSIT";
                        sqlcom.Parameters.Clear();
                        SqlParameter d1 = sqlcom.Parameters.Add("@dtn", SqlDbType.Date);
                        SqlParameter d2 = sqlcom.Parameters.Add("@dtx", SqlDbType.Date);
                        SqlParameter sql_line =sqlcom.Parameters.Add("@p", SqlDbType.VarChar);
                        d1.Direction = ParameterDirection.Input;
                        d2.Direction = ParameterDirection.Input;
                        sql_line.Direction = ParameterDirection.Input;
                        d1.Value = dateTimePicker1.Value;
                        d2.Value = dateTimePicker2.Value;
                        sql_line.Value = s1;
                        con.Open();
                        sqlcom.CommandTimeout = 1000;
                        sqlcom.ExecuteNonQuery();
                        sqlcom.Cancel();
                        con.Close();
                        MessageBox.Show("Хранимая процедура отработала без ошибок");
                    }
                    catch (SqlException ex)
                    {
                      //обработка ошибок
                    }



попробовал в лоб, в вызов добавить новую строку+создал комманду+сослался на туже хранимую, добавил параметр итд
в итоге при вызове ошибка
procedure or function expects parameter which was not supplied. в принципе понятное дело.
Но как можно в одном вызове хранимой передать параметры из разных соединений?

P.S. Разделять на два вызова не предлагайте.
...
Рейтинг: 0 / 0
06.12.2013, 10:58
    #38491412
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
denis_stellПараметр представляет из себя селект из другой базы, другого сервера.


Сделать селект, вытащить нужное значение, добавить значение в запрос к процедуре, вызвать процедуру.
...
Рейтинг: 0 / 0
06.12.2013, 11:01
    #38491417
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
denis_stellP.S. Разделять на два вызова не предлагайте.

Также предлагаю переписать весь код с использованием
Код: c#
1.
2.
3.
4.
using (SqlConnection con = new SqlConnection(conSQL))
{
....
}



и

Код: c#
1.
Parameters.AddWithValue(...);
...
Рейтинг: 0 / 0
06.12.2013, 11:18
    #38491436
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Pallarisdenis_stellПараметр представляет из себя селект из другой базы, другого сервера.


Сделать селект, вытащить нужное значение, добавить значение в запрос к процедуре, вызвать процедуру.

Правильно понимаю, до вызова процедуры, получить необходимые значения селекта из другой базы и полученеые значения передать параметром в процедуре?

Тут есть нюанс, может конечно не существенный:
1) Результат селекта это таблица с количеством строк порядка 30-40000
2) Хранимая процедура на серваке, получает параметр @p(см.код) - это селект с текущей базы, где он выпоняется и его значения вставляются во временную таблицу и далее идет разбор/вычисление/подсчет
3) Нужно проделать как в п.2 но с другим запросом
4) если заранее получить значение, как его потом передать, если можно пример
...
Рейтинг: 0 / 0
06.12.2013, 11:19
    #38491438
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Pallaris,

спасибо, позже перепишу.
А чем плох мой вариант?
...
Рейтинг: 0 / 0
06.12.2013, 11:29
    #38491451
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
denis_stellРезультат селекта это таблица с количеством строк порядка 30-40000


А, тогда мой вариант не подходит. Такое как параметр не надо передавать. Как параметры нужно передавать условия для запросов, которые будут выполняться в хранимке.

А чем плох мой вариант?


Много лишних строк, код вырвиглазный.
...
Рейтинг: 0 / 0
06.12.2013, 11:36
    #38491464
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Pallarisdenis_stellРезультат селекта это таблица с количеством строк порядка 30-40000


А, тогда мой вариант не подходит. Такое как параметр не надо передавать. Как параметры нужно передавать условия для запросов, которые будут выполняться в хранимке.

А чем плох мой вариант?


Много лишних строк, код вырвиглазный.


Как быть тогда?
...
Рейтинг: 0 / 0
06.12.2013, 11:40
    #38491470
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Выборку в ХП для MSSQL 2005 можно передать с помощью xml, для MSSQL 2008 и выше существуют Table-Valued Parameters . Третий вариант - слинковать сервера, и получить нужные данные внутри самой ХП запросом к linked server.
...
Рейтинг: 0 / 0
06.12.2013, 11:52
    #38491492
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Сон Веры ПавловныВыборку в ХП для MSSQL 2005 можно передать с помощью xml, для MSSQL 2008 и выше существуют Table-Valued Parameters . Третий вариант - слинковать сервера, и получить нужные данные внутри самой ХП запросом к linked server.

+1

denis_stellА чем плох мой вариант?
Не только тем, что код вырви глаз. Это еще ладно. Нужно вызывать Dispose у классов, поддерживающих интерфейс IDisposable. Это и Connection, и Command
...
Рейтинг: 0 / 0
06.12.2013, 12:19
    #38491533
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Сон Веры Павловныможно передать с помощью xml,
но лучше не надо.
...
Рейтинг: 0 / 0
06.12.2013, 12:46
    #38491587
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
ИзопропилСон Веры Павловныможно передать с помощью xml,
но лучше не надо.

а почему плох вариант с xml?
Много промежуточных шагов?


да, создание LinkedServer между ms server 2000 и 2008 r2 интересный вариант
...
Рейтинг: 0 / 0
06.12.2013, 13:07
    #38491627
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
denis_stell,

хорошего решения нет, но мне кажется использвание локальной временной таблицы будет лучше XML
...
Рейтинг: 0 / 0
06.12.2013, 13:38
    #38491702
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Изопропилно лучше не надо.
Можете предложить что-то другое на 2005-м сервере в отсутсвие возможности сделать linked server?
...
Рейтинг: 0 / 0
06.12.2013, 13:42
    #38491711
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
denis_stellпочему плох вариант с xml?
Много промежуточных шагов?

Он не плох. И не хорош. Это просто механизм, который стоит применять к месту.

Лично на мой взгляд, главный недостаток передачи данных через XML - это большой объем паразитного трафика и медленная скорость обработки.

Зато дает большую гибкость + расширенные проверки на корректность с помощью XSD-схем.

Что касается Linked Servers - то это неплохой выбор, но не идеальный. Нужно тоже смотреть его уместность. Основной минус - это распределенные транзакции.
...
Рейтинг: 0 / 0
06.12.2013, 14:23
    #38491817
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Сон Веры ПавловныМожете предложить что-то другое на 2005-м сервере в отсутсвие возможности сделать linked server?
см выше - использование временной таблицы
...
Рейтинг: 0 / 0
06.12.2013, 14:54
    #38491890
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Изопропилсм выше - использование временной таблицы

это из серии загрузить в таблицу Bulk insert-ом, а потом джойнить её?
...
Рейтинг: 0 / 0
06.12.2013, 15:08
    #38491920
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Изопропилсм выше - использование временной таблицы
Святым духом во временную таблицу данные не попадут. В обычную временную таблицу SqlBulkInsert'ом залить тоже не получится, т.к. команда на создание таблицы, и SqlBulkInsert в контексте сервера будут исполняться в двух разных батчах - т.е. в батче SqlBulkInsert временной таблицы уже не будет. Можно, конечно, использовать глобальную временную таблицу (##), но тут возможны грабли с параллельной работой.
Если не заливать через XML сотни мегабайт (я почему-то уверен, что у ТС именно не сотни мегабайт, а гораздо меньше), то я ничего плохого не вижу в способе с xml+openxml (XQuery, по моим наблюдениям, медленнее)+распарсенные данные в табличную переменную, или во временную таблицу [с нужными индексами].
...
Рейтинг: 0 / 0
06.12.2013, 15:26
    #38491949
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передать параметры с разными соединениями одну хранимую процедуру на сервер
Пардон, наврал. Батч будет один, временная таблицы зальется нормально. Перепутал с чем-то другим - помню, что на одном коннекте вторая SqlCommand не видела временную таблицу, созданную в первой.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / передать параметры с разными соединениями одну хранимую процедуру на сервер / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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