Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Портал .::2BakSa.WS::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > .NET

Уважаемые пользователи nowa.cc и 2baksa.ws. У нас сложилось тяжёлое финансовое положение. Мы работаем для вас вот уже более 15 лет и сейчас вынуждены просить о помощи. Окажите посильную поддержку проектам. Мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: 826074280762 Webmoney WME: 804621616710
PayPal PayPal_Email E-mail для связи по вопросу помощи
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!
Ответ
 
Опции темы Опции просмотра Language
Старый 06.01.2008, 20:49   #1
Неактивный пользователь
 
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
По умолчанию Динамический SQL запрос

Подскажите пожалуйста, как в запросе типа:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (100,200);
вместо VALUES использовать переменные.
saena вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама: подвесное кресло коконразмер ролл аппитание после имплантации зубов верхней челюститильда и дикидиhuawei matebook x


Старый 06.01.2008, 21:16   #2
pluton
ViP
 
Аватар для pluton
 
Пол:Мужской
Регистрация: 23.02.2007
Сообщений: 1,027
Репутация: 560
По умолчанию Ответ: Динамический SQL запрос

saena, может так:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (" + i + "," + j + ")";
__________________
THE TRUTH IS OUT THERE
pluton вне форума
 
Ответить с цитированием Вверх
Старый 06.01.2008, 21:33   #3
saena
Неактивный пользователь
 
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
По умолчанию Ответ: Динамический SQL запрос

Вариант, но у меня одна запись содержит 64 значения, имена переменных очень длиные, очень легко потеряться.
saena вне форума
 
Ответить с цитированием Вверх
Старый 06.01.2008, 21:48   #4
pluton
ViP
 
Аватар для pluton
 
Пол:Мужской
Регистрация: 23.02.2007
Сообщений: 1,027
Репутация: 560
По умолчанию Ответ: Динамический SQL запрос

Цитата:
Сообщение от saena Посмотреть сообщение
Вариант, но у меня одна запись содержит 64 значения, имена переменных очень длиные, очень легко потеряться.

не очень понял. делай массив переменных, и циклом записывай их в запрос
__________________
THE TRUTH IS OUT THERE
pluton вне форума
 
Ответить с цитированием Вверх
Старый 06.01.2008, 21:57   #5
saena
Неактивный пользователь
 
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
По умолчанию Ответ: Динамический SQL запрос

а пример можно или ссылку на пример, а то не совсем понял как записать в цикле в запрос.
saena вне форума
 
Ответить с цитированием Вверх
Старый 06.01.2008, 22:10   #6
pluton
ViP
 
Аватар для pluton
 
Пол:Мужской
Регистрация: 23.02.2007
Сообщений: 1,027
Репутация: 560
По умолчанию Ответ: Динамический SQL запрос

Цитата:
Сообщение от saena Посмотреть сообщение
а пример можно или ссылку на пример, а то не совсем понял как записать в цикле в запрос.

я думаю так:
Код:
insQuery = "INSERT INTO tablename (column1,column2) VALUES (";
for (int i = 0; i < vars.Count; i++)
  insQuery += (vars[i] + ",");
// тут нужно убрать последний символ строки. не помню как функция называется
insQuery += ");";
__________________
THE TRUTH IS OUT THERE
pluton вне форума
 
Ответить с цитированием Вверх
Старый 08.01.2008, 09:14   #7
Forger
Неактивный пользователь
 
Пол:Мужской
Регистрация: 04.08.2007
Сообщений: 38
Репутация: 52
По умолчанию Ответ: Динамический SQL запрос

Не рекомендую в прогах использовать SQL запросы в виде строки и еще и формировать ее в рантайм. Обычно и чаще всего это считается требованием использовать хранимые процедуры, во-первых это быстрее, во-вторых безопаснее, в-третьих правельнее.
Forger вне форума
 
Ответить с цитированием Вверх
Старый 09.01.2008, 18:19   #8
RaidenYN
Неактивный пользователь
 
Регистрация: 24.09.2007
Сообщений: 13
Репутация: 14
По умолчанию Ответ: Динамический SQL запрос

Уважаемый Forger, хранимые процедуры "почти всегда" быстрее, бывают исключения. Их использование правильнее только с академической точки зрения. При возникновения необходимости как-то обобщить однотипные операции хранимая процедура не самый лучший вариант. Скажем нужно выполнять похожие операции с 50 различными данными в разных таблицах и с разными названиями. Писать 50 различных хранимых процедур, выполняющих одно и тоже?
А вопросы безопасности легко снимаются использованием адаптеров и передачи значений через их параметры. Главное не допускать прямого попадания текста введенного пользователем в строку запроса.

saena, последнее может помочь тебе с передачей значений.
RaidenYN вне форума
 
Ответить с цитированием Вверх
Старый 11.01.2008, 14:00   #9
saena
Неактивный пользователь
 
Регистрация: 28.12.2007
Сообщений: 5
Репутация: 0
По умолчанию Ответ: Динамический SQL запрос

RaidenYN, не могли бы вы показать пример, как передать через параметры.
saena вне форума
 
Ответить с цитированием Вверх
Старый 11.01.2008, 18:50   #10
RaidenYN
Неактивный пользователь
 
Регистрация: 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();
Тут главное внимательно следить за названиеми полей таблицы при формировании запроса, и не допускать прямого введения этих названий от пользователя.
RaidenYN вне форума
 
Ответить с цитированием Вверх
Старый 15.01.2008, 02:35   #11
Crool
Неактивный пользователь
 
Регистрация: 11.01.2008
Сообщений: 1
Репутация: 0
По умолчанию Ответ: Динамический SQL запрос

При помощи http://bltoolkit.com/ можно динамически создавать запросы используя классы как контейнеры переменных.
Crool вне форума
 
Ответить с цитированием Вверх
Старый 14.02.2008, 10:31   #12
viaslav
Неактивный пользователь
 
Регистрация: 14.02.2008
Сообщений: 2
Репутация: 0
По умолчанию Ответ: Динамический SQL запрос

либо параметры, либо просто подстановкой значений 'VALUES'+Var1.TOString() etc
viaslav вне форума
 
Ответить с цитированием Вверх
Старый 18.02.2008, 09:10   #13
modavro
Неактивный пользователь
 
Пол:Мужской
Регистрация: 18.02.2008
Сообщений: 11
Репутация: 9
По умолчанию Ответ: Динамический SQL запрос

4RaidenYN
Но при таком подходе легко нарваться на SQL injection. Так что я бы все таки работал только через коллекцию Parameters. Динамический SQL это зло.
modavro вне форума
 
Ответить с цитированием Вверх
Старый 18.04.2008, 13:26   #14
serjs
Неактивный пользователь
 
Регистрация: 14.05.2007
Сообщений: 10
Репутация: 3
По умолчанию Ответ: Динамический SQL запрос

Лучше работать с параметрами запроса - получается управляемая безопасная модель.

Добавлено через 5 минут
Лучше работать с параметрами запроса - получается управляемая безопасная модель.

Последний раз редактировалось serjs; 18.04.2008 в 13:32.. Причина: Добавлено сообщение
serjs вне форума
 
Ответить с цитированием Вверх
Старый 21.05.2010, 15:15   #15
hawkhawk
ViP
 
Аватар для hawkhawk
 
Пол:Мужской
Регистрация: 19.11.2007
Адрес: Northern Сapital
Сообщений: 3,198
Репутация: 21382
По умолчанию 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

Спасибо.
__________________
Жизнь частенько вышибает из меня всю дурь, но я знаю, где достать ещё...
hawkhawk вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический том в логический 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

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 23:24. Часовой пояс GMT +3.


Copyright ©2004 - 2024 2BakSa.WS

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.20606 секунды с 11 запросами