![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
Подскажите пожалуйста, как в запросе типа:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (100,200); вместо VALUES использовать переменные. |
|
|
|
| Реклама: | Заходите на сайт MebelStol.ru: кресло для отдыха tetchair cloude home - отличные цены и большой выбор! | стол напрокат | плита flama ae 1409 | Решетка PG 125 Shuft | Круглый канальный вентилятор VK 125/1 |
|
|
#2
|
|
saena, может так:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (" + i + "," + j + ")";
__________________
THE TRUTH IS OUT THERE |
|
|
|
|
|
|
#3
|
|
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
Вариант, но у меня одна запись содержит 64 значения, имена переменных очень длиные, очень легко потеряться.
|
|
|
|
|
|
#4
|
|||||||||||||||||||||||
не очень понял. делай массив переменных, и циклом записывай их в запрос
__________________
THE TRUTH IS OUT THERE |
||||||||||||||||||||||||
|
|
|
|
|
#5
|
|
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
а пример можно или ссылку на пример, а то не совсем понял как записать в цикле в запрос.
|
|
|
|
|
|
#6
|
|||||||||||||||||||||||
я думаю так: Код:
insQuery = "INSERT INTO tablename (column1,column2) VALUES (";
for (int i = 0; i < vars.Count; i++)
insQuery += (vars[i] + ",");
// тут нужно убрать последний символ строки. не помню как функция называется
insQuery += ");";
__________________
THE TRUTH IS OUT THERE |
||||||||||||||||||||||||
|
|
|
| Сказали спасибо: |
|
|
#7
|
|
Неактивный пользователь
Пол:
Регистрация: 04.08.2007
Сообщений: 38
Репутация: 52
|
Не рекомендую в прогах использовать SQL запросы в виде строки и еще и формировать ее в рантайм. Обычно и чаще всего это считается требованием использовать хранимые процедуры, во-первых это быстрее, во-вторых безопаснее, в-третьих правельнее.
|
|
|
|
|
|
#8
|
|
Неактивный пользователь
Регистрация: 24.09.2007
Сообщений: 13
Репутация: 14
|
Уважаемый Forger, хранимые процедуры "почти всегда" быстрее, бывают исключения. Их использование правильнее только с академической точки зрения. При возникновения необходимости как-то обобщить однотипные операции хранимая процедура не самый лучший вариант. Скажем нужно выполнять похожие операции с 50 различными данными в разных таблицах и с разными названиями. Писать 50 различных хранимых процедур, выполняющих одно и тоже?
А вопросы безопасности легко снимаются использованием адаптеров и передачи значений через их параметры. Главное не допускать прямого попадания текста введенного пользователем в строку запроса. saena, последнее может помочь тебе с передачей значений. |
|
|
|
|
|
#9
|
|
Неактивный пользователь
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
|
RaidenYN, не могли бы вы показать пример, как передать через параметры.
|
|
|
|
|
|
#10
|
|
Неактивный пользователь
Регистрация: 24.09.2007
Сообщений: 13
Репутация: 14
|
У 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();
|
|
|
|
| Сказали спасибо: |
|
|
#11
|
|
Неактивный пользователь
Регистрация: 11.01.2008
Сообщений: 1
Репутация: 0
|
При помощи http://bltoolkit.com/ можно динамически создавать запросы используя классы как контейнеры переменных.
|
|
|
|
|
|
#12
|
|
Неактивный пользователь
Регистрация: 14.02.2008
Сообщений: 2
Репутация: 0
|
либо параметры, либо просто подстановкой значений 'VALUES'+Var1.TOString() etc
|
|
|
|
|
|
#13
|
|
Неактивный пользователь
Пол:
Регистрация: 18.02.2008
Сообщений: 11
Репутация: 9
|
4RaidenYN
Но при таком подходе легко нарваться на SQL injection. Так что я бы все таки работал только через коллекцию Parameters. Динамический SQL это зло. |
|
|
|
|
|
#14
|
|
Неактивный пользователь
Регистрация: 14.05.2007
Сообщений: 10
Репутация: 3
|
Лучше работать с параметрами запроса - получается управляемая безопасная модель.
Добавлено через 5 минут Лучше работать с параметрами запроса - получается управляемая безопасная модель. Последний раз редактировалось serjs; 18.04.2008 в 13:32.. Причина: Добавлено сообщение |
|
|
|
|
|
#15
|
|
Ребята, помогите, а то уже три клавы раздолбал, как тут:
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 21: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 22:30 |
| Динамический диск -> В обычный раздел | deepvic | Архив | 8 | 20.06.2007 08:02 |
|
|