С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 08.01.2017
Сообщений: 7

Передача значений из DataTable в процедуру PL/SQL

12.01.2017, 15:52. Показов 3449. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите пожалуйста, как передать из DataTable все значения из столбца Id в процедуру SQL.
И как оформить эту процедуру, чтобы она принимала не по одному значению, а списком (выполнялась не 3 раза, а только 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
 static void Main()
        {
            Goo(k);
        }
        private static void Goo(int id)
        {
            SqlConnection sconn = new SqlConnection(@"Data Source=localhost\SQLEXP; Initial Catalog = master; Integrated Security=SSPI;");
            SqlCommand scmd = new SqlCommand();
            scmd.Connection = sconn;
            sconn.Open();
            System.Console.WriteLine("Connection Open ! ");
            
            scmd.CommandType = CommandType.StoredProcedure;
            scmd.CommandText = "[dbo].[usp_AddIdUOEMass]";
            id = Convert.ToInt32(Console.ReadLine());
            
            var dt = new DataTable();
            DataColumn idColumn = new DataColumn("id", Type.GetType("System.Int32"));
            dt.Columns.Add(idColumn);
            DataRow dr = dt.NewRow();
          
            cf = Convert.ToInt32(Console.ReadLine());*/
         
            dt.Rows.Add(36);
            dt.Rows.Add(18);
            dt.Rows.Add(19);
 
            foreach (DataRow r in dt.Rows)
            {
                foreach (DataColumn c in dt.Columns)
                {
                    Console.WriteLine(r[c]);
                   
                  ???                   
                }
            }
 
            Console.ReadKey();
           scmd.ExecuteNonQuery();
            sconn.Close();
        }
        public static int k { get; set; }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2017, 15:52
Ответы с готовыми решениями:

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

Передача значений в процедуру
Задание: Необходимо оформить подпрограмму удаления лишних пробелов в строке (лишними считаются пробелы в на-чале и конце строки, а также...

Передача NULL в процедуру MS SQL Server из C#
Здравствуйте, в таблице MS SQL Server есть поле с датой, которое может хранить null, для вставки записи в таблицу использую хранимую...

7
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
12.01.2017, 16:08
Хм... Я предлагаю тебе следующую схемку:
1) Создаешь Temporary табличку, которую наполняешь этими "передаваемыми данными"
2) в ХП описываешь запрос на основе данных из этого временного набора (т.е. используешь эту временную таблицу)
3) как говорят в интернете: Profit
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
12.01.2017, 17:49
Цитата Сообщение от Hikari Посмотреть сообщение
2) в ХП описываешь запрос на основе данных из этого временного набора (т.е. используешь эту временную таблицу)
А как ХП может обращаться к таблице, которая еще не существует? Конечно, можно в хп создавать скрипт на выполнение динамически, но гораздо проще использовать для этого C#, а не sql.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
12.01.2017, 18:48
Цитата Сообщение от Igr_ok Посмотреть сообщение
которая еще не существует?
Как это не существует, если ты ее создашь?
Цитата Сообщение от Igr_ok Посмотреть сообщение
гораздо проще использовать для этого C#, а не sql.
Не вижу ничего простого, ибо C# это клиент. Гораздо эффективнее доверить все операции с базой самой СУБД замкнув в ее системе и данные и алгоритмы их обработки.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
12.01.2017, 20:28
Цитата Сообщение от Hikari Посмотреть сообщение
Гораздо эффективнее доверить все операции с базой самой СУБД замкнув в ее системе и данные и алгоритмы их обработки.
Я тоже за эффективность
Цитата Сообщение от ElVencedor Посмотреть сообщение
Подскажите пожалуйста, как передать из DataTable все значения из столбца Id в процедуру SQL.
Вариант1. Передавать значения, как строку, где они перечислены через зпт. Строку надо распарсить, преобразовав в таблицу. Вот пример:
SQL
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
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Description: <Парсит строку с int значениями через зпт, формируя из нее таблицу>
-- =============================================
CREATE PROCEDURE [dbo].[ParceStringToTable] 
    @input_str VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @TABLE TABLE (id INT)
 
    -- создаем переменную, хранящую разделитель
    DECLARE @delimeter nvarchar(1) = ','
 
    -- определяем позицию первого разделителя
    DECLARE @pos INT = charindex(@delimeter,@input_str)
 
    -- создаем переменную для хранения одного айдишника
    DECLARE @id nvarchar(10)
 
    IF @pos=0 AND len(@input_str)>0
    BEGIN
        INSERT INTO @TABLE (id) VALUES(CAST(@input_str AS INT))
        SELECT * FROM @TABLE
    END
    ELSE
    BEGIN
        while (@pos != 0)
        BEGIN
            -- получаем айдишник
            SET @id = SUBSTRING(@input_str, 1, @pos-1)
            -- записываем в таблицу
            INSERT INTO @TABLE (id) VALUES(CAST(@id AS INT))
            -- сокращаем исходную строку на
            -- размер полученного айдишника
            -- и разделителя
            SET @input_str = SUBSTRING(@input_str, @pos+1, LEN(@input_str))
            -- определяем позицию след. разделителя
            SET @pos = CHARINDEX(@delimeter,@input_str)
            IF @pos=0 AND len(@input_str)>0
                INSERT INTO @TABLE (id) VALUES(CAST(@input_str AS INT))
        END
 
        SELECT * FROM @TABLE
    END
END
Передав строку в хп, как переменную @MyIDList, ее можно преобразовать в таблицу
SQL
1
2
3
DECLARE @IDList TABLE (ID INT)
    INSERT INTO @IDList(ID) 
    EXEC ParceStringToTable @MyIDList
Вариант 2. Передавать в качестве параметра xml-файл и также преобразовывать его в таблицу.
1
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
12.01.2017, 23:08
Вариант 3. Создать собственный табличный тип данных и передавать параметр этого типа в ХП; на уровне C# создавать и заполнять параметр ХП как DataTable с соответствующими столбцами.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
12.01.2017, 23:46
Цитата Сообщение от bax_tang Посмотреть сообщение
Вариант 3.
Обязательно)
Вот нашел статью, где есть примеры всех вариантов: строки с разделителями, временной таблицы и переменной табличного типа:
https://www.outcoldman.com/ru/... %80%D1%83/
0
0 / 0 / 0
Регистрация: 08.01.2017
Сообщений: 7
19.01.2017, 12:33  [ТС]
Спасибо всем!
Тут еще вопрос возник Когда передаю в хранимую процедуру один параметр DataTable всё успешно проходит (специально сделал чтобы значения записывались в таблицу), но как только добавляю второй параметр для передачи, обычный int возникает ошибка, как можно исправить процедуру для массовой вставки (причём если в DataTable только 1 значение всё отрабатывает хорошо)
Additional information: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
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
        
 private void ClearPlanDataMass(SqlConnection conn, DataTable id, int idWork)
        {
            var sqlCommand = conn.CreateCommand();
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.CommandText = "[dbo].[usp_AddMass]";
            sqlCommand.Parameters.Add("@IdService", SqlDbType.Int);
            DataTable table = new DataTable();
            table.Columns.Add("id", typeof(int));
 
           
            sqlCommand.Parameters["@IdService"].Value = idWork;
            sqlCommand.Parameters.AddWithValue("@categories", id);
 
            using (SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCommand))
            {
                dataAdapter.Fill(id);
            }
            
            try
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                   sqlCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                sqlCommand.Connection.Close();
                sqlCommand.Connection = null;
            }
        }
T-SQL
1
2
3
4
5
6
7
8
9
10
  CREATE proc dbo.usp_AddMass
(
    @categories intlist READONLY,
    @IdService INT = null
)as
begin
INSERT INTO TempTableTest 
    SELECT (select id from @categories) AS id, @IdService 
end 
GO
Добавлено через 15 минут
Всё разобрался))) Перегрелся)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2017, 12:33
Помогаю со студенческими работами здесь

Передача данных из клиента VB 6.0 в хранимую процедуру MS SQL Server 7.0 (+++)
В проге VB есть переменная Price as Currency Надо в хронимую процедуру на MS SQL Server 7.0 передать ее в переменную @Price money Когда...

Передача значений из БД(MS SQL) в переменную
При создании приложения по работе с БД встал такой вопрос: как получить значение из бд, например при подсчете суммы или среднего значения...

Передача значений переменных в Sql запрос
Привет. Как мне вместо %home% поставить eng_word? (21 строка) QString rus_word; QString eng_word = ui-&gt;lineEdit-&gt;text(); ...

Передача значений переменных в Sql запрос
Здравствуйте. Объясните пожалуйста как мне передать значения переменной в запрос. вот к примеру запрос. я хочу что бы значение n было в...

Передача DataTable клиенту
Здравствуйте!Помогите плиз разобраться с клиент-серверным приложением. Сервер получает SQL запрос от клиента через сокет, затем этот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru