Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
1

Как параметр в SQL-запросе можно использовать в строковом типе данных?

08.04.2014, 17:16. Показов 2762. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Подскажите, как параметр в SQL-запросе можно использовать в строковом типе данных? Я имею ввиду что-то такое:
C#
1
2
3
4
string param="some value";
string query = @"SELECT * FROM myTable WHERE _param='Param value is @param'";
SqlCommand command = new SqlCommand(query);
command.Parameters.Add("@param", System.Data.SqlDbType.VarChar).Value = param;
Вышеприведённый код не работает, а хотелось бы. Помогите, плиз.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2014, 17:16
Ответы с готовыми решениями:

Можно ли использовать имя колонки как SQL параметр?
Недавно начал изучать SQL и дело дошло до того что надо в определённую колонку вставить некоторое...

Можно ли использовать в SQL запросе кириллицу
Доброго всем времени суток. Есть скрипт который выбирает данные из одной базы данных, затем второй...

Как использовать параметр GET при запросе к БД?
У меня задание - сформировать скрипт, который выводит список стран по алфавиту с использованием...

Как использовать в запросе параметр типа int
Доброго времени суток. Требуется выполнить SQL-запрос, используя параметр типа int. Листинг: ...

12
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
08.04.2014, 17:33 2
vJRoF, так и использовать:
C#
1
2
3
4
5
string param="some value";
//исправил немного запрос
string query = @"SELECT * FROM myTable WHERE _param=@param";
SqlCommand command = new SqlCommand(query);
command.Parameters.Add("@param", System.Data.SqlDbType.VarChar).Value = param;
P.S. лучше использовать NVarChar
0
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
08.04.2014, 17:39  [ТС] 3
Learx, я понимаю, что так оно будет работать. Вопрос я формулировал именно про то, чтобы включить параметр в уже имеющуюся строку. Если смущает формулировка этой строки, то поясню - хотелось бы добавлять в БД парметризованный комментарий, т.е. вместо 'Param value is @param' может быть написано 'Сегодня на улице было @param градусов тепла' или что угодно в этом духе.
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
08.04.2014, 18:02 4
Уважаемый совсем не понимает сути параметризированных запросов.
0
6280 / 3565 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
08.04.2014, 22:14 5
Лучший ответ Сообщение было отмечено vJRoF как решение

Решение

T-SQL
1
2
3
SELECT * 
FROM myTable 
WHERE _param = 'Сегодня на улице было ' + CONVERT(NVARCHAR(32), @param) + ' градусов тепла';
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
09.04.2014, 15:38 6
vJRoF,
первый вариант:
C#
1
command.Parameters.Add("@param", System.Data.SqlDbType.VarChar).Value = string.Format("Сегодня на улице было {0} градусов тепла",  param);
если хотите найти любую строчку в середине которой содержится value, тогда используя Like:
C#
1
2
3
4
5
string param="some value";
//исправил немного запрос
string query = @"SELECT * FROM myTable WHERE _param like @param";
SqlCommand command = new SqlCommand(query);
command.Parameters.Add("@param", System.Data.SqlDbType.VarChar).Value = string.Format("%{0}%", param);
1
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
10.04.2014, 14:39  [ТС] 7
Learx, терзали сомнения по поводу первого варианта, но проверил - код не внедряется. Получается, видимо, что параметризованный запрос компилируется без значений параметров, а они потом туда вставляются без перекомпиляции. А в том запросе, который я написал изначально (где @param входит в строку) этот самый @param не воспринимается компилятором как параметр и в дальнейшем в него ничего не подставляется.
Интересно другое - вообще задача у меня стояла передать собранную строку в качестве параметра хранимой процедуры - и вот тут-то уже конкатенация не работает ни в том виде, в котором её предложил уважаемый Петррр, ни в каком-то ещё. Решил форматированием строки в отдельном курсоре, с последующим его присваиванием требуемому параметру.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
10.04.2014, 16:26 8
лично у меня все работает. может вы сами не понимаете чего хотите, или не понимаете как работает, или не можете объяснить
привожу полный текст первого варианта:
C#
1
2
3
4
5
6
7
int param=20;
//обратите внимания: никаких кавычек не надо - то, что это строка задается типом параметра
string query = @"SELECT * FROM myTable WHERE _param=@param";
SqlCommand command = new SqlCommand(query);
command.Parameters.Add("@param", System.Data.SqlDbType.VarChar).Value = string.Format("Сегодня на улице было {0} градусов тепла",  param);
//после этого вернет все строки из таблицы myTable в который столбец _param содержит 
//значение:  Сегодня на улице было 20 градусов тепла
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
10.04.2014, 17:37 9
Не могу не согласиться с Learx
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
 
 
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            MSSQLServerFun some = new MSSQLServerFun();
            some.GetParamQuery();
        }
    }
    class MSSQLServerFun
    {
        string connectionString="Server=(local);Initial Catalog=master;Integrated Security=true";
        public void GetParamQuery()
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand command = connection.CreateCommand();
                    command.CommandType = CommandType.Text;
                    command.CommandText = @"select name
                                            from spt_values
                                            where name like @par
                                           ";
                    command.Parameters.AddWithValue("@par", string.Format("YES {0} NO", "OR"));
                    connection.Open();
                    Console.WriteLine(command.ExecuteScalar().ToString());
 
                }
            }
 
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
 
        }
    }
}
а вот это говорит товарищ профайлер
T-SQL
1
2
3
4
5
exec sp_executesql N'select name
                                            from spt_values
                                            where name like @par
                                           ',N'@par nvarchar(9)',@par=N'YES OR NO'
go
с LIKE поспешил. Но сути не меняет
0
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
10.04.2014, 17:57  [ТС] 10
Господа, спасибо всем за ответы. Параметризованные запросы у меня работают (и, я думаю, не только у меня). Фраза "код не внедряется" означает, что попытка внедрить в параметр код sql через параметр ожидаемо проваливается.
Не работает у меня следующее:
SQL
1
2
EXEC dbo.ProcedureName
    @p1 = 'ваиваи' + '1234'
Но так, наверное, и должно быть.
Работает так:
SQL
1
2
3
4
DECLARE @cur AS nvarchar(20)
SET @cur = 'ваиваи' + '1234'
EXEC dbo.ProcedureName
    @p1 = @cur
0
6280 / 3565 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
10.04.2014, 18:23 11
Да, так и должно быть.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
11.04.2014, 19:41 12
vJRoF, а зачем такая необходимость, не могу понять?
мы можем вполне программно получить строку 'ваиваи1234' и дать ее значение параметру @p1! собственно, только так и надо
0
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
14.04.2014, 12:08  [ТС] 13
Learx, да незачем, в общем-то. Единственное, кажется идеологически более правильным оставлять у запроса торчащими наружу в виде параметров только те части, которые меняются.
0
14.04.2014, 12:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2014, 12:08
Помогаю со студенческими работами здесь

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

Вывести уравнение в строковом типе
Здравствуйте, помогите, пожалуйста. Мне нужно создать метод, который выводит уравнение в строковом...

как использовать Цикл в Запросе sql
Пользователь водит в поле Edit1.Text желаемое кол-во столбцов в таблице бд mssql. Вопрос: как...

Как использовать boolean в sql запросе?
Доброе время суток! Создаю БД (использую access). У меня возникают проблемы во время отбора из...

Как использовать конструкцию Если в запросе (SQL)
Есть такой запрос: (в смысле его код) SELECT * FROM WHERE ((( . BETWEEN () AND ())));...

Как использовать константу вместо переменной в SQL запросе?
IF EXISTS(select * from tempdb..sysobjects where id = object_id('tempdb..#select1')) DROP TABLE...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru