Правила Форума редакция от 22.06.2020 |
|
|
|
|
|
Опции темы | Опции просмотра | Language |
06.01.2008, 20:49 | #1 |
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
Динамический SQL запрос
Подскажите пожалуйста, как в запросе типа:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (100,200); вместо VALUES использовать переменные. |
Реклама: | Рекомендуем супермаркет KNS.ru - ноутбук хуавей 14 дюймов - билеты на футбол в подарок каждому покупателю | интернет-магазин КНС Нева предлагает hdd 8тб - КНС Санкт-Петербург - мы дорожим каждым клиентом! | детская стоматология вао | спектакль дублеры актеры | Всегда выгодно в KNSneva.ru - стоимость видеокарт - специальные условия для корпоративных клиентов в Санкт-Петербурге. |
06.01.2008, 21:16 | #2 |
Ответ: Динамический SQL запрос
saena, может так:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (" + i + "," + j + ")";
__________________
THE TRUTH IS OUT THERE |
|
06.01.2008, 21:33 | #3 |
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
Ответ: Динамический SQL запрос
Вариант, но у меня одна запись содержит 64 значения, имена переменных очень длиные, очень легко потеряться.
|
06.01.2008, 21:48 | #4 | |||||||||||||||||||||||
Ответ: Динамический SQL запрос
не очень понял. делай массив переменных, и циклом записывай их в запрос
__________________
THE TRUTH IS OUT THERE |
||||||||||||||||||||||||
06.01.2008, 21:57 | #5 |
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
Ответ: Динамический SQL запрос
а пример можно или ссылку на пример, а то не совсем понял как записать в цикле в запрос.
|
06.01.2008, 22:10 | #6 | |||||||||||||||||||||||
Ответ: Динамический SQL запрос
я думаю так: Код:
insQuery = "INSERT INTO tablename (column1,column2) VALUES ("; for (int i = 0; i < vars.Count; i++) insQuery += (vars[i] + ","); // тут нужно убрать последний символ строки. не помню как функция называется insQuery += ");";
__________________
THE TRUTH IS OUT THERE |
||||||||||||||||||||||||
Сказали спасибо: |
08.01.2008, 09:14 | #7 |
Неактивный пользователь
Пол: Регистрация: 04.08.2007
Сообщений: 38
Репутация: 52
|
Ответ: Динамический SQL запрос
Не рекомендую в прогах использовать SQL запросы в виде строки и еще и формировать ее в рантайм. Обычно и чаще всего это считается требованием использовать хранимые процедуры, во-первых это быстрее, во-вторых безопаснее, в-третьих правельнее.
|
09.01.2008, 18:19 | #8 |
Неактивный пользователь
Регистрация: 24.09.2007
Сообщений: 13
Репутация: 14
|
Ответ: Динамический SQL запрос
Уважаемый Forger, хранимые процедуры "почти всегда" быстрее, бывают исключения. Их использование правильнее только с академической точки зрения. При возникновения необходимости как-то обобщить однотипные операции хранимая процедура не самый лучший вариант. Скажем нужно выполнять похожие операции с 50 различными данными в разных таблицах и с разными названиями. Писать 50 различных хранимых процедур, выполняющих одно и тоже?
А вопросы безопасности легко снимаются использованием адаптеров и передачи значений через их параметры. Главное не допускать прямого попадания текста введенного пользователем в строку запроса. saena, последнее может помочь тебе с передачей значений. |
11.01.2008, 14:00 | #9 |
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
Ответ: Динамический SQL запрос
RaidenYN, не могли бы вы показать пример, как передать через параметры.
|
11.01.2008, 18:50 | #10 |
Неактивный пользователь
Регистрация: 24.09.2007
Сообщений: 13
Репутация: 14
|
Ответ: Динамический SQL запрос
У SqlCommand есть коллекция параметров. Допустим, у вас уже создано и открыто соединение с базой данных sqlConnection. Создадим запрос:
SqlCommand Command = new SqlCommand(“INSERT INTO Table(Column1, Column2) VALUES @Value1, @Value2”, sqlConnection); Теперь создадем параметры: SqlParameter Parameter = Command.Parameters.Add(new SqlParameter(ParameterName, Value)); Тут: ParamName - строковое имя, начинающаяся с собачки. Например - "@Value1". Value - Значение переменной, в вашем случае равное 100. После этого вызываете: Command.ExecuteNonQuery(); Если значений много можно воспользоваться таким приемом (значения лежат в массиве Value[]): Код:
//Cоздаем запрос SqlCommand Command = new SqlCommand(); Command.Connection = sqlConnection; //Создаем блоки запроса string Columns = “”; string Values = “”; for (int i = 1; I <= Values.Length; i++){ //Формируем список колонок Columns += “Column” + i.ToString(); //Формируем список названий параметров string CurrentValue = “@Values” + i.ToString(); Values += CurrentValue; //Заодно создаем параметры Command.Parameters.Add(new SqlParameter(CurrentValue, Value[i])); //Если параметры не последние в списке - ставим запятую if (i < Values.Length){ Columns += “, ”; Values += “, ”; } } //Формируем окончательный запрос Command.CommandText = “INSERT INTO Table (” + Columns + “) + “ VALUES ” + Values ; //Теперь выполняем запрос sqlc.ExecuteNonQuery(); |
Сказали спасибо: |
15.01.2008, 02:35 | #11 |
Неактивный пользователь
Регистрация: 11.01.2008
Сообщений: 1
Репутация: 0
|
Ответ: Динамический SQL запрос
При помощи http://bltoolkit.com/ можно динамически создавать запросы используя классы как контейнеры переменных.
|
14.02.2008, 10:31 | #12 |
Неактивный пользователь
Регистрация: 14.02.2008
Сообщений: 2
Репутация: 0
|
Ответ: Динамический SQL запрос
либо параметры, либо просто подстановкой значений 'VALUES'+Var1.TOString() etc
|
18.02.2008, 09:10 | #13 |
Неактивный пользователь
Пол: Регистрация: 18.02.2008
Сообщений: 11
Репутация: 9
|
Ответ: Динамический SQL запрос
4RaidenYN
Но при таком подходе легко нарваться на SQL injection. Так что я бы все таки работал только через коллекцию Parameters. Динамический SQL это зло. |
18.04.2008, 13:26 | #14 |
Неактивный пользователь
Регистрация: 14.05.2007
Сообщений: 10
Репутация: 3
|
Ответ: Динамический SQL запрос
Лучше работать с параметрами запроса - получается управляемая безопасная модель.
Добавлено через 5 минут Лучше работать с параметрами запроса - получается управляемая безопасная модель. Последний раз редактировалось serjs; 18.04.2008 в 13:32.. Причина: Добавлено сообщение |
21.05.2010, 15:15 | #15 |
SQL запрос. Запутался с синтаксисом
Ребята, помогите, а то уже три клавы раздолбал, как тут:
http://www.youtube.com/watch?v=kKT_09pARN4 Есть запросик, который сканирует папку с бакапами главной базы, выдергивает самый свежий архив и восстанавливает его в резервную базу в которой люди стряпают отчеты и занимаются другой чепухой, не мешая грести флагманскому авианосцу. --[начало запроса]-- declare @lvFile table ( stValue varchar(100) ,i int identity(1,1) ) declare @fullPath varchar(500) = 'dir e:\SQL\BACKUP\*.bak /o:d /t:w /b' ,@sSQL nvarchar(max) insert into @lvFile exec xp_cmdshell @fullPath --если тупо пишем полное имя файла, то все работает: select top 1 @sSQL = 'RESTORE DATABASE Base2 FROM DISK = N''E:\SQL\BACKUP\base1.bak''' from @lvFile where stValue is not null order by i desc exec sp_executesql @stmt = @sSQL --[конец запроса]-- Так вот, никак не удается подсунуть переменную stValue вместо имени файла (в нашем случае это base1.bak) Иными словами, как правильно символьные кавычки расставить тут: select top 1 @sSQL = 'RESTORE DATABASE Base2 FROM DISK = N''e:\SQL\BACKUP\' + stValue Спасибо.
__________________
Жизнь частенько вышибает из меня всю дурь, но я знаю, где достать ещё... |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Динамический том в логический | yurastef | Архив | 4 | 12.11.2009 20:20 |
SQL Запрос McAccess2007 (Запрос с 3 таблиц - дублирование ) | Dr Evil | Базы данных | 3 | 23.07.2009 09:06 |
IT: Как узнать динамический IP ? | Dmi3ii | Безопасность | 8 | 11.06.2009 11:41 |
Динамический раздел: как изменить размер | sibbora | Windows 200x Server | 3 | 07.02.2009 21:30 |
Динамический диск -> В обычный раздел | deepvic | Архив | 8 | 20.06.2007 08:02 |
|
|