Создавать параметры SQL программно - PullRequest
0 голосов
/ 21 марта 2012

Еще один раздражающий вопрос для меня, но, вероятно, что-то простое.

У меня есть несколько возможных предложений для запроса, основанного на пользовательском вводе, мой вопрос: как я могу добавить их программно?

Например:

wherequery = @"WHERE fieldname = @p_FieldName AND ";
if (txtValue.textLength > 0){
    wherequery += "fieldname2 = @p_FieldName2 AND ";
}
query = @"SELECT * FROM tabe" + wherequery;
sql = connection.CreateCommand();
sql.CommandText = query;

Как мне поступить с параметрами для этого?Я пробовал ArrayLists, Словари и несколько других методов, но не могу найти способ сделать это.В идеале я бы хотел сделать что-то вроде этого:

SqlParameter[] sqlparams;
wherequery = @"WHERE fieldname = @p_FieldName AND ";
if (txtValue.textLength > 0){
    wherequery += "fieldname2 = @p_FieldName2 AND ";
    sqlparams.Parameters.Add("@p_FieldName2 ", SqlDbType.VarChar).Value = txtValue.text;
}
query = @"SELECT * FROM tabe" + wherequery;
sql = connection.CreateCommand();
sql.CommandText = query;
sql.Parameters.Add(sqlparams);

Ответы [ 6 ]

2 голосов
/ 21 марта 2012

Проверьте ответ на этот вопрос.Должно быть применимо к вашей проблеме.

Как обрабатывать динамические параметры SQL

1 голос
/ 21 марта 2012

Я сделал небольшое изменение в вашем коде, которое, мы надеемся, должно указать вам правильное направление:

    sql = connection.CreateCommand();    
    wherequery = @"WHERE fieldname = @p_FieldName ";
    sql.Parameters.Add(new SqlParameter("@p_FieldName ", "some value for fieldname"));

    if (txtValue.textLength > 0){
        wherequery += " AND fieldname2 = @p_FieldName2 ";
        sql.Parameters.Add(new SqlParameter("@p_FieldName2 ", txtValue.text));
    }
    query = @"SELECT * FROM tabe" + wherequery;

    sql.CommandText = query;
1 голос
/ 21 марта 2012

Вместо того, чтобы программно добавлять параметры, добавьте их все, но включите условия NULL. Например:

SELECT * FROM tabe
WHERE fieldname=@p_FieldName 
AND (@p_FieldName2 IS NULL OR fieldname2=@p_FieldName2)

sqlparams.Parameters.Add("@p_FieldName2 ", SqlDbType.VarChar).Value = null;
if (txtValue.textLength > 0){
    sqlparams.Parameters("@p_FieldName2").Value = txtValue;
}

Здесь, если длина текста txtValue равна 0, тогда для параметра @p_FieldName2 установлено значение null.

Тогда в SQL-запросе следующее игнорирует fieldname2=@p_FieldName2, если значение равно NULL:

@p_FieldName2 IS NULL OR 
0 голосов
/ 21 марта 2012

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

Вы можете создать класс для обработки построения строк.Я украл эту идею с работы.=)

В псевдокоде это в основном выглядело бы так:

Class WhereObj
{
  //whatever container you want to use to hold the params
  //you could also create a params class and have a list of param objects
  //it'd basically be a constructor and two properties

  private Params(,)

  Public void AddParam(fieldname, value)
  //adds param to Params

  Public string ToSQLString() 
  //loops params and builds string (use stringbuilder!)
  //ex: "where FirstName= 'Neo' and MatrixSequelsSucked = 'true'"
}

Это должен быть действительно простой класс для кодирования - вероятно, менее 50 строк.Вы должны определенно создать свой собственный объект для обработки этого, особенно , если вам нужно сделать это в нескольких местах.Вы могли бы просто написать функцию, если она только в одном месте, но я думаю, что будет немного чище разделить ее на объект.

0 голосов
/ 21 марта 2012

Почему бы вам не использовать ORM, такой как Linq to SQL / Enties, Nhibernate, ...?

Потому что генерация оператора SQL вручную немного устарела!

0 голосов
/ 21 марта 2012

Используйте Dictionary<string,object>, где строковая часть является ключом, а объектная часть является значением.

...