2013-09-20 5 views
-2

у меня есть некоторые переменные, как этотвзрывать некоторые переменные в C#

string cond; 

if(cond1){ 
    cond += "[email protected]"; 
} 

if(cond2){ 
    cond += "[email protected]"; 

} 

if(cond3){ 
    cond += "[email protected]"; 
} 


query="select * from students where"+string.Join(" and ",cond); 

я хочу сделать это

query="select * from students where if exists cond1 (cond) and if exists cond2 (cond)"; 

я хочу взрывать все conds в одну переменную с конд (и).

+1

Вы имеете в виду «объединить» в одну переменную? Это не имеет смысла расколоть .. в один ... –

+2

Зачем вы хотите это сделать? Манипулирование необработанным SQL опасно и может легко привести к инъекционным атакам. Вы не будете лучше использовать ORM – Kane

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

2

Во-первых, чтобы ответить на ваш вопрос , вы можете сделать что-то подобное, чтобы построить свой пункт:

List<string> conditions = new List<String>(); 

if (cond1) { 
    conditions.Add("[email protected]"); 
} 

if (cond2) { /* etc.. */ } 

string query = "select * from students"; 
if (conditions.Any()) { 
    query += " where " + string.Join(" AND ", conditions); 
} 

Хотя с Linq вы можете динамически строить запрос и защищать себя от SQL-инъекции.

IQueryable<Student> students = myDataContext.Students; //eg DbSet<Students> 

if (cond1) { 
    students = students.Where(s => s.Name == "Adam"); 
} 

if (cond2) { 
    students = students.Where(s => s.Age > 20); 
} 

var matchedStudents = students.ToList(); 

При вызове .ToList(), вы итерируете IQueryable и результирующий SQL-запрос будет содержать все соответствующие WHERE положения.

+0

там ошибка!. запрос вроде этого (выберите * from students wherename = @ name), а не пробел между именем и именем в запросе! – adam

+0

спасибо. Теперь корректно работает – adam

+1

В SQL-коде также нет риска SQL-инъекции, поскольку OP, по-видимому, использует параметры. – Blorgbeard

0

Вы можете сделать это следующим образом:

List<string> conds = new List<string>(); 

if(cond1){ 
    conds.Add("[email protected]"); 
} 

if(cond2){ 
    conds.Add("[email protected]"); 
} 

if(cond3){ 
    conds.Add("[email protected]"); 
} 

query="select * from students where " + string.Join(" and ", conds.ToArray()); 

Я предположил, что всегда будет по крайней мере одно условие (в противном случае, вы получите select * from students where - недопустимый синтаксис SQL).

Поскольку вы уже используете параметры (хорошо!), Вы также можете отслеживать параметры вместе с условиями SQL.

Добавить List<SqlParameter> и заполнить его, как вы идете:

List<SqlParameter> parameters = new List<SqlParameter>(); 

if (cond1) { 
    conds.Add("[email protected]"); 
    parameters.Add(new SqlParameter("@name") { Value = text1.Text; }); 
} 
// etc. 

// later.. 
cmd.Parameters.AddRange(parameters); 
+0

есть ошибка!запрос вроде этого «select * from students wherename = @ name» не пробел между тем где и имя в запрос – adam

+0

@adam мой код говорит 'query =" select * от студентов, где «', с пробелом после 'where'. У вас есть пространство? – Blorgbeard

+0

спасибо. Теперь работает правильно – adam

1
string cond; 

if(cond1){ 
    cond += "[email protected]"; 
} 

if(cond2){ 
    cond += "[email protected]"; 

} 

if(cond3){ 
    cond += "[email protected]"; 
} 

Это даст вам строку как [email protected][email protected][email protected], потому что вы просто добавляющим строк.

, если вы хотите использовать String.Join() оператора, вам нужно нажать на отдельные части к List<String>, например, так:

List<string> cond = new List<string>(); 

if(cond1){ 
    cond.add("[email protected]"); 
} 

if(cond2){ 
    cond.add("[email protected]"); 

} 

if(cond3){ 
    cond.add("[email protected]"); 
} 

query="select * from students where"+string.Join(" AND ",cond.ToArray()); 

будет приводить к

"select * from students where [email protected] AND [email protected] AND [email protected]" 
+0

Я получаю ошибку с запросом! запрос вроде этого «select * from students wherename = @ name» не пробел между где и имя в запрос – adam

0

Если вы используете SQL использовать случай заявление

SELECT CASE(@intCode) 
       WHEN 1 THEN 'Country_1' 
       WHEN 2 THEN 'Country_2' 
       WHEN 3 THEN 'Country_3' 
       WHEN 4 THEN 'Country_4' 
       WHEN 5 THEN 'Country_5' 
       WHEN 6 THEN 'Country_6' 
       WHEN 7 THEN 'Country_7' 
       WHEN 8 THEN 'Country_8' 
       WHEN 9 THEN 'Country_9' 
       WHEN 10 THEN 'Country_10'   
         ELSE 'Unknown' END 
Смежные вопросы