Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
karim_
0 / 0 / 2
Регистрация: 16.09.2014
Сообщений: 68
1

Вызов sql-функции

28.12.2017, 18:19. Просмотров 2119. Ответов 15
Метки нет (Все метки)

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ALTER FUNCTION [dbo].[TicketPrice](@id_route INT,@discount BIT,@goods BIT)
RETURNS FLOAT
AS
BEGIN
    DECLARE @price FLOAT
    IF @discount = 0 AND @goods = 0
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    ELSE IF @discount = 1 AND @goods = 0
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route) - (SELECT discount_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    ELSE IF @discount = 0 AND @goods = 1
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route) + (SELECT goods_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    ELSE IF @discount = 1 AND @goods = 1
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route) + (SELECT goods_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)  - (SELECT discount_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    RETURN @price 
END
ExecuteScalar() - выкидывает исключение: + Заданное приведение является недопустимым.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public float getPrice(int id_route,bool discount, bool goods)
        {
            float price = 0;
            int d = (discount) ? 1 : 0;
            int g = (goods) ? 1 : 0;
            using (SqlConnection con = new SqlConnection(connectionStr))
            {
                string query = string.Format("SELECT dbo.TicketPrice({0},{1},{2})", id_route, d, g);
                SqlCommand cmd = new SqlCommand(query,con);
                try
                {
                    con.Open();
                    price = (float)cmd.ExecuteScalar();
                }
                catch
                { }
            }
            return price;
        }
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2017, 18:19
Ответы с готовыми решениями:

Вызов запроса из SQL 2008
Всем привет... Появился такой вопрос. Можно ли как то сделать так чтобы на форме в VS2008 при...

Вызов триггера, созданного в SQL Server, в Visual Studio
Здравствуйте! Подскажите, пожалуйста, как использовать триггер, созданный в SQL Server, в Visual...

Вызов функции в службе
Необходимо написать службу которая будет отслеживать подключение USB устройств. public partial...

Вызов функции из dll написанной на C
Привет всем! Возникла такая задача, решить не могу ни как. Есть dll. В ней есть функция (вроде...

Подключение сторонних DLL и вызов функции
Добрый день всем! Меня беспокоит следующий вопрос, который мне необходимо решить как можно скорее:...

15
OwenGlendower
Супер-модератор
Эксперт .NET
11219 / 9451 / 4003
Регистрация: 17.03.2014
Сообщений: 18,914
Записей в блоге: 1
Завершенные тесты: 2
28.12.2017, 18:32 2
Лучший ответ Сообщение было отмечено karim_ как решение

Решение

karim_, попробуй к double привести
0
Apollon_11
1 / 1 / 0
Регистрация: 07.01.2017
Сообщений: 6
06.01.2018, 15:18 3
Maybe ---
C#
1
float.Parse(cmd.ExecuteScalar());
0
OwenGlendower
Супер-модератор
Эксперт .NET
11219 / 9451 / 4003
Регистрация: 17.03.2014
Сообщений: 18,914
Записей в блоге: 1
Завершенные тесты: 2
06.01.2018, 15:31 4
Apollon_11, or may be not, потому что Parse принимает строку, а не object и, что более важно, float (T-SQL) ⇔ double (C#).
0
06.01.2018, 15:31
pincet
1417 / 996 / 136
Регистрация: 23.07.2010
Сообщений: 5,507
06.01.2018, 20:46 5
Цитата Сообщение от karim_ Посмотреть сообщение
SQL
1
2
3
4
5
6
7
8
9
10
    DECLARE @price FLOAT
    IF @discount = 0 AND @goods = 0
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    ELSE IF @discount = 1 AND @goods = 0
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route) - (SELECT discount_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    ELSE IF @discount = 0 AND @goods = 1
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route) + (SELECT goods_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    ELSE IF @discount = 1 AND @goods = 1
        SET @price = (SELECT price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route) + (SELECT goods_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)  - (SELECT discount_price FROM [Тарифная сетка стоимости билетов] WHERE id_route = @id_route)
    RETURN @price
как, как это развидеть-то? из-за какого угла вы смотрели лекции по сиквелу?
0
karim_
0 / 0 / 2
Регистрация: 16.09.2014
Сообщений: 68
07.01.2018, 14:20  [ТС] 6
Цитата Сообщение от pincet Посмотреть сообщение
как, как это развидеть-то? из-за какого угла вы смотрели лекции по сиквелу?
Лекций не смотрел, просто немного знаком с запросами, а функцию писал интуитивно. Расскажите пожалуйста как надо?
0
Igr_ok
530 / 428 / 200
Регистрация: 04.08.2015
Сообщений: 1,178
08.01.2018, 15:44 7
karim_, интуиция не заменит знания.
1.Почитайте про JOIN.
2.Все ваши if-ы можно заменить одним выражением:
@price=price - discount_price * @discount + goods_price * @goods
0
OwenGlendower
Супер-модератор
Эксперт .NET
11219 / 9451 / 4003
Регистрация: 17.03.2014
Сообщений: 18,914
Записей в блоге: 1
Завершенные тесты: 2
08.01.2018, 16:51 8
karim_, это одним запросом можно сделать
T-SQL
1
2
3
4
5
SELECT price
    + (CASE WHEN @goods = 1 THEN goods_price ELSE 0 END)
    - (CASE WHEN @discount = 1 THEN discount_price ELSE 0 END)
FROM [Тарифная сетка стоимости билетов]
WHERE id_route = @id_route
0
karim_
0 / 0 / 2
Регистрация: 16.09.2014
Сообщений: 68
09.01.2018, 23:26  [ТС] 9
Цитата Сообщение от OwenGlendower Посмотреть сообщение
karim_, это одним запросом можно сделать
Посоветуйте книгу по sql, где все эти вещи разобраны
0
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
10.01.2018, 07:26 10
karim_, вот тут всё можно посмотреть. Бесплатно.
0
hoolygan
10.01.2018, 12:48
  #11

Не по теме:

Usaga, Ну как можно советовать читать машинный перевод? :D Там если начать читать - то голова отвалится на 3-ем предложении )

0
Usaga
10.01.2018, 12:56
  #12

Не по теме:

hoolygan, там есть кнопка переключения на родной английский.

0
karim_
0 / 0 / 2
Регистрация: 16.09.2014
Сообщений: 68
10.01.2018, 22:15  [ТС] 13
Цитата Сообщение от Usaga Посмотреть сообщение
karim_, вот тут всё можно посмотреть. Бесплатно.
Обожаю читать документацию от микрософт "нет", неужели нет ни одной годной книжки по tsql
0
pincet
1417 / 996 / 136
Регистрация: 23.07.2010
Сообщений: 5,507
10.01.2018, 22:48 14
А ты искал сам?
А начинать нужно не с транзактсиквел, а с прочтения (мое имхо) трудов дядьдки Дейта
1
Usaga
Эксперт .NET
6125 / 4340 / 758
Регистрация: 21.01.2016
Сообщений: 16,894
Завершенные тесты: 2
11.01.2018, 07:03 15
karim_, а что вам в документации не нравится? Операторы SQL там не описаны? Функции? Синтаксис? Гайды и рекомендации отсутствуют?
0
MsGuns
549 / 546 / 60
Регистрация: 04.04.2011
Сообщений: 2,039
11.01.2018, 21:03 16
karim_, Обожаю читать документацию от микрософт "нет", неужели нет ни одной годной книжки по tsql

На счет справки "мелкомягких" совершенно с Вами согласен. По TSQL хороших книг очень мало, мне попадалась только одна - какого-то то ли хорвата, то ли серба, не помню. Сам учился на собственных шишках и конспектах, ну и SQL.ru, конечно, сильно помог.
0
11.01.2018, 21:03
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2018, 21:03

Лямбда Выражение как простой вызов функции.
Здравствуйте, подскажите несведующему, чтобы использовать лямбда выражения нужен делегат и и какое...

Вызов функций зная название класса и функции
Пишу свою библиотеку. Как мне создать вызов функций из отдельного класса зная название класса и...

Вызов функции другого процесса (неверные регистры)
Всем привет. Я пытаюсь вызвать функцию из другого процесса, но вот беда - регистры формируются не...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.