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

Получение return'a из хранимой процедуры Microsoft SQL

04.05.2022, 20:25. Показов 832. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, сделал следующую хранимую процедуру для добавления данных в табличку и вывод созданного ключа:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE PROCEDURE [dbo].[ДОБАВИТЬ_В_ТАБЛИЧКУ]
 
    -- Add the parameters for the stored procedure here
    @РНомер nvarchar(255),
    @РДата datetime
    
AS
BEGIN
 
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
 
    -- Insert statements for procedure here
    INSERT INTO Табличка(Номер, Дата) VALUES (@РНомер, @РДата)
    RETURN SCOPE_IDENTITY()
END
И пытаюсь обратиться на форме(через кнопку получаю данные с textbox и datetimepicker) к процедуре через queriesTableAdapter
C#
1
int idTable = this.queriesTableAdapter1.ДОБАВИТЬ_В_ТАБЛИЧКУ(nnumb, ddate);
но при выводе переменной(допустим, у меня label.Text должен получить id) она равна -1. Как правильно будет сделать так, чтобы мне удалось получить id?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2022, 20:25
Ответы с готовыми решениями:

Получение параметров Хранимой процедуры с SQL Server
Создал следующую ХП: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE proverich(@id_zal_dob int) AS

Получение записей с помощью хранимой процедуры
Постарался все в коде описать public static List<T> SelectAll<T>() where T : new()// функция котороая должна вытащить мне из...

Получение объекта из хранимой процедуры с использованием EF Core
Добрый день. Хранимая процедура выводит объект (json) в единственном текстовом поле. Используя entity Framework core нужно вызвать эту...

4
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
04.05.2022, 22:17
alkodel, вернуть результат запроса вместо return
SQL
1
SELECT SCOPE_IDENTITY()
или возвращаемый параметр
SQL
1
2
3
4
5
6
7
8
9
10
CREATE PROCEDURE [dbo].[ДОБАВИТЬ_В_ТАБЛИЧКУ]
    @РНомер nvarchar(255),
    @РДата datetime
    @ID INT output
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO Табличка(Номер, Дата) VALUES (@РНомер, @РДата)
    SET @ID = SCOPE_IDENTITY()
END
0
0 / 0 / 0
Регистрация: 03.12.2018
Сообщений: 19
05.05.2022, 00:26  [ТС]
Igr_ok, здравствуйте, попробовал через Select, queriesTableAdapter1 начал писать, что не содержит определения "ДОБАВИТЬ_В_ТАБЛИЧКУ", нашёл её в DataSet'e, изменил строчку на
C#
1
int idTable = dbDataSet.ДОБАВИТЬ_В_ТАБЛИЧКУ(nnumb, ddate)
и теперь выходит ошибка неявного преобразования void в int.
С возвращаемым параметром тоже не получилось сильно разойтись, написал следующим способом
C#
1
2
int idTable;
this.queriesTableAdapter1.ДОБАВИТЬ_В_ТАБЛИЧКУ(nnumb, ddate, ref (int?)idTable);
Пишет, что "Значения ref или out должно быть переменной, которой можно присвоить значение".
Может я как-то не так обращаюсь к функции?

P.S. Также заметил, что в dbDataSet.Designer.cs функция ДОБАВИТЬ_В_ТАБЛИЧКУ выводит "returnValue", но почему тогда мой способ с return не работает, хотя в sql при ручном выполнении returnValue у меня возвращает айдишник.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
05.05.2022, 10:17
alkodel, не ждите, что синтаксис C# и SQL одинаковый. В методе C# return возвращает результат, в MS SQL в вашем случае он возвращает статус. Т.е. удачно или неудачно выполнилась хранимая процедура(хп).
Цитата Сообщение от alkodel Посмотреть сообщение
и теперь выходит ошибка неявного преобразования void в int.
Раньше ваша хп не возвращала данные, теперь возвращает. Нужно по новой сформировать TableAdapter и DataSet. Если вам уже советовали от них отказаться, теперь вы знаете, почему)
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
05.05.2022, 11:05
alkodel, вот так делается вставка записи в БД (EObject itemToAdd - объект для вставки) с получением нового ID в поле нового объекта. И не используйте DataSet, DataTable и т.д., работайте с "чистым" ADO .NET - проще и понятнее.
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
public async Task AddItemAsync(EObject itemToAdd)
{
    string sqlText =
        "INSERT INTO dbo.tblEObject(EObjectName) VALUES(@eoName); " +
        "SELECT @newID = SCOPE_IDENTITY();";
 
    using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
    {
        try
        {
            await sqlConnection.OpenAsync();
 
            using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection))
            {
                SqlParameter parameterEOName = new SqlParameter
                {
                    ParameterName = "@eoName",
                    Value = itemToAdd.EObjectName,
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 200,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(parameterEOName);
 
                SqlParameter parameterNewID = new SqlParameter
                {
                    ParameterName = "@newID",
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Output
                };
                sqlCommand.Parameters.Add(parameterNewID);
 
                await sqlCommand.ExecuteNonQueryAsync();
 
                itemToAdd.EObjectID = (int)sqlCommand.Parameters["@newID"].Value;
            }
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Ошибка записи нового объекта строительства.", ex);
        }
    }
}
Добавлено через 28 минут
alkodel, Вот с хранимой процедурой пример у себя нашел. Пример процедуры, а именно получение ID в запросе, есть выше. Выходной параметр в внизу списка параметров, после выполнения процедуры идёт присваивание значения переменной.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
public async Task AddONZDataPositionAsync(ONZDataT dataT)
{
    string sqlText = "dbo.spONZAddDataPosition";
 
    try
    {
        using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
        {
            await sqlConnection.OpenAsync();
 
            using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection) { CommandType = CommandType.StoredProcedure })
            {
                SqlParameter pDrawID = new SqlParameter
                {
                    ParameterName = "@drawID",
                    Value = dataT.DrawID,
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pDrawID);
 
                SqlParameter pDateONZ = new SqlParameter
                {
                    ParameterName = "@dateONZ",
                    Value = dataT.ONZDate.Date,
                    SqlDbType = SqlDbType.DateTime,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pDateONZ);
 
                SqlParameter pForeman = new SqlParameter
                {
                    ParameterName = "@foreman",
                    Value = dataT.Foreman,
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 50,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pForeman);
 
                SqlParameter pWorkName = new SqlParameter
                {
                    ParameterName = "@workName",
                    Value = dataT.WorkName,
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 255,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pWorkName);
 
                SqlParameter pMeasure = new SqlParameter
                {
                    ParameterName = "@measure",
                    Value = dataT.Measure,
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 10,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pMeasure);
 
                SqlParameter pWorkQty = new SqlParameter
                {
                    ParameterName = "@workQty",
                    Value = dataT.WorkQty,
                    SqlDbType = SqlDbType.Float,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pWorkQty);
 
                SqlParameter pLabor = new SqlParameter
                {
                    ParameterName = "@labor",
                    Value = dataT.Labor,
                    SqlDbType = SqlDbType.Float,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pLabor);
 
                SqlParameter pSheet = new SqlParameter
                {
                    ParameterName = "@sheet",
                    Value = dataT.DSheet,
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 50,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pSheet);
 
                SqlParameter pLaborCoeff = new SqlParameter
                {
                    ParameterName = "@laborCoeff",
                    Value = dataT.LaborCoeff,
                    SqlDbType = SqlDbType.Float,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pLaborCoeff);
 
                SqlParameter pDraw = new SqlParameter
                {
                    ParameterName = "@draw",
                    Value = dataT.DNumber,
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 50,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pDraw);
 
                SqlParameter pEOID = new SqlParameter
                {
                    ParameterName = "@eoID",
                    Value = dataT.EObjectID,
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pEOID);
 
                SqlParameter pIDDS = new SqlParameter
                {
                    ParameterName = "@idDrawSys",
                    Value = dataT.DrawSystemID,
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pIDDS);
 
                SqlParameter pWorkType = new SqlParameter
                {
                    ParameterName = "@drawWorkType",
                    Value = dataT.WorkDrawType,
                    SqlDbType = SqlDbType.NVarChar,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pWorkType);
 
                // Выходной параметр
                SqlParameter pNewID = new SqlParameter
                {
                    ParameterName = "@newID",
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Output
                };
                sqlCommand.Parameters.Add(pNewID);
 
                foreach (SqlParameter parameter in sqlCommand.Parameters)
                {
                    if (parameter.Value == null || parameter.Value as string == "")
                    {
                        parameter.Value = DBNull.Value;
                    }
                }
 
                await sqlCommand.ExecuteNonQueryAsync();
 
                // Полученное значение из процедуры
                dataT.ONZDataTID = (int)sqlCommand.Parameters["@newID"].Value;
            }
        }
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Ошибка записи позиции ОНЗ во временную таблицу.", ex);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2022, 11:05
Помогаю со студенческими работами здесь

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

Вызов хранимой процедуры SQL
я использую следующий код, чтобы при нажатии кнопки выполнилась процедура и моя таблица обновилась: private void button8_Click(object...

Вывод хранимой процедуры из SQL в C#
USE GO /****** Object: StoredProcedure . Script Date: 23.06.2017 22:00:19 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER...

Выполнение хранимой процедуры из SQL
Всем привет. Возникла проблема при выполнении хранимой процедуры. Я добавил на форму компоненты sqlConnection и sqlCommand. У sqlConnection...

QT+MS SQL забрать результаты из хранимой процедуры
void qryModel() { QSqlQueryModel *model = new QSqlQueryModel(); model->setQuery("exec up_select "); QTableView *view = new...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru