powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / передать параметры с разными соединениями одну хранимую процедуру на сервер
18 сообщений из 18, страница 1 из 1
передать параметры с разными соединениями одну хранимую процедуру на сервер
    #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
передать параметры с разными соединениями одну хранимую процедуру на сервер
    #38491412
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellПараметр представляет из себя селект из другой базы, другого сервера.


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

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



и

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


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

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

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

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


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

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


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


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

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


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


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

+1

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

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


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

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

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

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

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

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

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


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