powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / TableAdapter и хранимые процедуры
15 сообщений из 15, страница 1 из 1
TableAdapter и хранимые процедуры
    #35024965
b0ris98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Я использую для доступа к хранимой функции на сервере TableAdapter.
Функция возвращает число тип real, т.е. явно скалярное значение.
Тест в DataSet'е (контектное меню->Preview Data) проходит нормально, т.е.функция с тестовыми входными параметрами возвращает значение типа Object с правильным числовым значением.
Но при попытке вызвать эту процедуру непосредственно внутри моей программы через объект Query упорно возвращается null.
Убив несколько часов на эксперименты я выяснил, что если поменять у запроса ExecuteMode со Scalar на NonQuery, то все работает.

Объясните, что происходит?
В чем смысл тогда Scalar? Я по наивности считал, что это обозначает, что запрос возвращает единственное значение (не набор записей), а NonQuery - если он ничего не возвращает вообще (запросы типа delete * from ... ).
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35025190
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А заголовок SP и как ее дергаете посредством Query показать можно?
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028004
b0ris98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для экспериментов я создал простенькую хранимую процедуру, которая умножает входной параметр на 0.5 и возвращает это произведение:

CREATE FUNCTION [dbo].[TestFunction](@val real )
RETURNS real
AS
BEGIN
DECLARE @Result real
set @Result =@val*0.5
RETURN @Result
END

В моем проекте на VB2005 я добавил Dataset, в котором создал новый Query по правой кнопочке мышки:
"Add Query->поключение_к_серверу->Use existing Stored procedure->TestFunction->A single Value-> TestFunction"
Затем, на формочке создал кнопочку и написал в обработке события Click следующее:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim res As Object
res = Me.QueriesTableAdapter1.TestFunction(25)
Debug.WriteLine(res.ToString)
End Sub

При запуске в строке Debug.WriteLine... выскакивает ошибка "Object reference not set to an instance of an object.", т.е. res = null.
Если поменять ExecuteMode со Scalar на NonQuery, или в мастере при создании вместо "A single Value" выбрать "No value", то возвращается 12.5.
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028086
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте

Select @Result
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028513
b0ris98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал, вот что получилось:
Msg 444, Level 16, State 3, Procedure TestFunction, Line 10
Select statements included within a function cannot return data to a client.
Msg 455, Level 16, State 2, Procedure TestFunction, Line 10
The last statement included within a function must be a return statement.


Да и не в этом дело. ИМХО, это какой-то косяк самой среды разработки...
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028540
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b0ris98Попробовал, вот что получилось:
Msg 444, Level 16, State 3, Procedure TestFunction, Line 10
Select statements included within a function cannot return data to a client.
Msg 455, Level 16, State 2, Procedure TestFunction, Line 10
The last statement included within a function must be a return statement.


Да и не в этом дело. ИМХО, это какой-то косяк самой среды разработки...

Я не заметил что у вас функция. :(
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028568
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только для очистки совести, что встрял. :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
                   расчеты_с_клиентамиTA.Connection.Open();
                    SqlCommand sqlComm = new SqlCommand("dbo.Saldo", расчеты_с_клиентамиTA.Connection);
                    sqlComm.CommandType = CommandType.StoredProcedure;
                    sqlComm.Parameters.Add("Клиент_ID", SqlDbType.UniqueIdentifier);
                    sqlComm.Parameters.Add("Склад_ID", SqlDbType.UniqueIdentifier);
                    sqlComm.Parameters["Клиент_ID"].Value = Klient_ID;
                    sqlComm.Parameters["Склад_ID"].Value = Sklad_ID;

                    decimal ret = (decimal)sqlComm.ExecuteScalar();
                    расчеты_с_клиентамиTA.Connection.Close();

Вы лучше верните резальсет через процедуры или работайте с параметрами.
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028569
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Select ВашаФункция(параметр)
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028653
b0ris98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил я тоже все попробовать ручками делать не используя все эти типизированные датасеты с типизированными тейбладаптерами.
Сделал еще одну кнопочку и в обработчике клика прописал:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim conn As New SqlConnection
Dim sqlComm As SqlCommand
Dim res As Object
conn.ConnectionString = My.Settings.MyConnectionString
conn.Open()
sqlComm = New SqlCommand("dbo.TestFunction", conn)
sqlComm.CommandType = CommandType.StoredProcedure
sqlComm.Parameters.Add("val", SqlDbType.Real)
sqlComm.Parameters("val").Value = 25
res = sqlComm.ExecuteScalar
Debug.WriteLine(res.ToString)
conn.Close()
End Sub
При запуске возникает "Object reference not set to an instance of an object", т.е. res = sqlComm.ExecuteScalar=null.
Если res = sqlComm.ExecuteNonQuery, то возвращается -1 (а раньше через типизированный тейбладаптер возвращалось 12.5).
После этого я модифицировал комманду, добавив селект:
sqlComm = New SqlCommand("select dbo.TestFunction(@val)", conn)
sqlComm.CommandType = CommandType.Text
sqlComm.Parameters.Add("val", SqlDbType.Real)
sqlComm.Parameters("val").Value = 25
res = sqlComm.ExecuteScalar
Стало возвращаться 12.5, т.е. то что нужно.
res = sqlComm.ExecuteNonQuery, тоже возвращает -1.
Получается, что если требуется обратиться к функции на сервере, лучше это делать через "select function_name... ", а не напрямую (хотя напрямую тоже можно (см. выше), только как-то это неестественно получается ;-) )
Странно все это, некорректно как-то :-(
А какие интересные глюки возникают, если хранимая процедура возвращает содержимое временных таблиц (select * from #a order by NameResource ) .... Эти визарды при создании типизированного тейбладаптера вообще не понимают, какие поля процедурой возвращаются. Как показали эксперименты, наличие знака "#" вводит в ступор... Кошмар ! :-(
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028659
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b0ris98Получается, что если требуется обратиться к функции на сервере, лучше это делать через "select function_name... ", а не напрямую (хотя напрямую тоже можно (см. выше), только как-то это неестественно получается ;-) )


Я вам пр это и написал.

b0ris98Странно все это, некорректно как-то :-(


Очень даже корректно. Резальтсет и возворат функции - разные вещи.

b0ris98А какие интересные глюки возникают, если хранимая процедура возвращает содержимое временных таблиц (select * from #a order by NameResource ) .... Эти визарды при создании типизированного тейбладаптера вообще не понимают, какие поля процедурой возвращаются. Как показали эксперименты, наличие знака "#" вводит в ступор... Кошмар ! :-(

Это есть. Потому что никому не охота анализировать ваш код построения временной таблицы и взять на себя ответственность за его правильность.
Вообще то подход простой - либо учимся пользоваться тем, что имеется или пишем свое и продаем. :)
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028674
b0ris98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сахават Юсифов
Я вам пр это и написал.

Спасибо.
Сахават Юсифов
b0ris98Странно все это, некорректно как-то :-(


Очень даже корректно. Резальтсет и возворат функции - разные вещи.

Так это-то понятно, некорректность в смысле "там можно, но криво", а "тут - нельзя совсем".
Если нет - так нет, а если да - так да ;-)
Сахават Юсифов
b0ris98А какие интересные глюки возникают, если хранимая процедура возвращает содержимое временных таблиц (select * from #a order by NameResource ) .... Эти визарды при создании типизированного тейбладаптера вообще не понимают, какие поля процедурой возвращаются. Как показали эксперименты, наличие знака "#" вводит в ступор... Кошмар ! :-(

Это есть. Потому что никому не охота анализировать ваш код построения временной таблицы и взять на себя ответственность за его правильность.
Вообще то подход простой - либо учимся пользоваться тем, что имеется или пишем свое и продаем. :)

Да, с этим тоже пришлось помучиться. Но я догадался, как выйти из полжения ;-) .
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028678
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot b0ris98]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE FUNCTION [dbo].[TestFunction](@val real )
RETURNS real
AS
BEGIN
DECLARE @Result real
set @Result =@val* 0 . 5 
RETURN @Result
END
А
Код: plaintext
1.
2.
3.
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="TestFunction";
SqlCommandBuilder.DeriveParameters(cmd);
что в cmd.Parameters запихивает? С функциями не работал, но, по идее, вы должны дернуть SqlCommand.ExecuteNonQuery и забрать рез-т из cmd.Parameters["RETURN_VALUE"] (или как тамо оно назовецо)...
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028702
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто добавить параметр ParameterDirection.ReturnValue

Код: plaintext
1.
2.
3.
4.
5.
SqlParameter pret=new SqlParameter();
pret.Direction = ParameterDirection.ReturnValue;
pret.SqlDbType = SqlDbType.Real;
cmd.Parameters.Add(pret);

cmd.ExecuteNonQuery();

P.S. А вообще-то лучше репу не морщить, а писать SELECT FROM dbo.TESTFUNCTION(@val)
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028751
b0ris98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все верно, специально проверил ;-)
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim conn As New SqlConnection
Dim sqlComm As SqlCommand
Dim res As Object
Dim pret As New SqlParameter
conn.ConnectionString = My.Settings.MyConnectionString
conn.Open()
sqlComm = New SqlCommand("dbo.TestFunction", conn)
sqlComm.CommandType = CommandType.StoredProcedure
SqlCommandBuilder.DeriveParameters(sqlComm)
sqlComm.Parameters("@val").Value = 25
pret.Direction = ParameterDirection.ReturnValue
pret.SqlDbType = SqlDbType.Real
sqlComm.Parameters.Add(pret)
sqlComm.ExecuteNonQuery
res = sqlComm.Parameters("@RETURN_VALUE").Value
Debug.WriteLine(res.ToString)
conn.Close()
End Sub
Согласен на все 100%, что проще и понятнее все-таки использовать sql запрос "select function_name ..."
Спасибо всем, кто откликнулся.
...
Рейтинг: 0 / 0
TableAdapter и хранимые процедуры
    #35028762
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
res = sqlComm.Parameters("@RETURN_VALUE").Value

достаточно res=pret.Value
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / TableAdapter и хранимые процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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