Компьютерный форум NoWa.cc

Компьютерный форум NoWa.cc (https://nowa.cc/index.php)
-   .NET (https://nowa.cc/forumdisplay.php?f=298)
-   -   Динамический SQL запрос (https://nowa.cc/showthread.php?t=136751)

saena 06.01.2008 21:49

Динамический SQL запрос
 
Подскажите пожалуйста, как в запросе типа:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (100,200);
вместо VALUES использовать переменные.

pluton 06.01.2008 22:16

Ответ: Динамический SQL запрос
 
saena, может так:
string myInsertQuery = "INSERT INTO tablename (column1,column2) VALUES (" + i + "," + j + ")";

saena 06.01.2008 22:33

Ответ: Динамический SQL запрос
 
Вариант, но у меня одна запись содержит 64 значения, имена переменных очень длиные, очень легко потеряться.

pluton 06.01.2008 22:48

Ответ: Динамический SQL запрос
 
Цитата:

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

не очень понял. делай массив переменных, и циклом записывай их в запрос

saena 06.01.2008 22:57

Ответ: Динамический SQL запрос
 
а пример можно или ссылку на пример, а то не совсем понял как записать в цикле в запрос.

pluton 06.01.2008 23:10

Ответ: Динамический SQL запрос
 
Цитата:

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

я думаю так:
Код:

insQuery = "INSERT INTO tablename (column1,column2) VALUES (";
for (int i = 0; i < vars.Count; i++)
  insQuery += (vars[i] + ",");
// тут нужно убрать последний символ строки. не помню как функция называется
insQuery += ");";


Forger 08.01.2008 10:14

Ответ: Динамический SQL запрос
 
Не рекомендую в прогах использовать SQL запросы в виде строки и еще и формировать ее в рантайм. Обычно и чаще всего это считается требованием использовать хранимые процедуры, во-первых это быстрее, во-вторых безопаснее, в-третьих правельнее.

RaidenYN 09.01.2008 19:19

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

saena, последнее может помочь тебе с передачей значений.

saena 11.01.2008 15:00

Ответ: Динамический SQL запрос
 
RaidenYN, не могли бы вы показать пример, как передать через параметры.

RaidenYN 11.01.2008 19:50

Ответ: Динамический 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();

Тут главное внимательно следить за названиеми полей таблицы при формировании запроса, и не допускать прямого введения этих названий от пользователя.

Crool 15.01.2008 03:35

Ответ: Динамический SQL запрос
 
При помощи http://bltoolkit.com/ можно динамически создавать запросы используя классы как контейнеры переменных.

viaslav 14.02.2008 11:31

Ответ: Динамический SQL запрос
 
либо параметры, либо просто подстановкой значений 'VALUES'+Var1.TOString() etc

modavro 18.02.2008 10:10

Ответ: Динамический SQL запрос
 
4RaidenYN
Но при таком подходе легко нарваться на SQL injection. Так что я бы все таки работал только через коллекцию Parameters. Динамический SQL это зло.

serjs 18.04.2008 13:26

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

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

hawkhawk 21.05.2010 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

Спасибо.


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

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2025 NoWa.cc

Время генерации страницы 0.07584 секунды с 9 запросами