2016-07-07 4 views
-1

У меня есть эта функция для выполнения параметризованных выберите запрос:выражение не-логического типа, указанного в контексте, где ожидается условие, paramerization использованием DbCommand в C#

public string LookUp(string sColuna, string sTabela, string sWhere) 
{ 
    string[] Parameters = { "@column", "@table", "@where" }; 
    var comando = @"SELECT @column FROM @table WHERE @where"; 
    var cmd = this.OraConnection.CreateCommand(); 
    cmd.CommandText = comando; 
    cmd.Parameters.AddRange(Parameters.Select(item => { var param = cmd.CreateParameter(); param.ParameterName = item; param.Value = 1; return para; }).ToArray()); 
    cmd.Parameters[0].Value = sColuna; 
    cmd.Parameters[1].Value = sTabela; 
    cmd.Parameters[2].Value = sWhere; 
    DbDataReader Reader = cmd.ExecuteReader(); 
    return Reader.GetString(0); 
} 

, когда он достигает DbDataReader Reader = cmd.ExecuteReader(); он бросает me исключение: Дополнительная информация: выражение небулевого типа, указанное в контексте, где ожидается условие, рядом с «@where». Нельзя ли иметь параметр в предложении where?

Теперь я изменил его:

var cmd = this.OraConnection.CreateCommand(); 
      cmd.CommandText = string.Format("SELECT {} FROM {} WHERE", sColuna, sTabela, sWhere); 
      DbDataReader Reader = cmd.ExecuteReader(); 
      return Reader.GetString(0); 
+0

где положение должно определять логическое выражение ... например Где xyz = @where – Kevin

+0

Могу ли я иметь что-то вроде WHERE @something = @something? Я передаю это sWhere var: UserName = 'Joao' – LikeIfYouCaredAboutMyName

+0

is '@ where' содержит строку типа' WHERE val = val' ?? –

ответ

0

String sWhere является параметром, необходимым для оценки логического выражения

[The Begining вашего запроса] WHERE [что-то] = [Ваш параметр]
[Начало вашего запроса] ГДЕ [Что-то] = @ где

Для @where значения = sWhere

Если вы хотите получить более Complexe ответа на вопрос о построении ИНЕК, взгляните на этом ответ about the same question

+0

ok Я понимаю, что вы имеете в виду, t [Кое-что] также является var? может ли он быть параметром, или он должен быть исправлен? – LikeIfYouCaredAboutMyName

+0

Если вы перейдете по ссылке, вы увидите, что она не может быть непосредственно параметром при попытке, но вы можете разработать альтернативный вариант, используя объект в качестве параметра для левого члена булевого выражения. В основном вы можете построить параметризованное предложение where, но не так, как вы пытаетесь;) – JeromeVOB

+0

Хорошо, я прочитал ответы, и я признаю, что это работает, но не для моего случая, потому что я не могу сейчас определить, что имя поля будет так что я не могу это исправить. все параметры в запросе могут измениться, так как это означает работать как для oracle, так и для sql, а также для широкого круга пользователей и баз данных. есть ли другие альтернативы этому? Я мог бы просто передать команду в целом, но тогда я не смог бы параметризовать. Оператор select представляет собой риск с точки зрения SQL-инъекции? – LikeIfYouCaredAboutMyName