C# 在运行时重写Sql

C# 在运行时重写Sql,c#,C#,我有一个带参数的SQL语句,例如 SELECT * FROM persons WHERE id = @id AND firstName = @firstname OR surname = @surname 我想使用c根据运行时提供的参数重写语句 例如,如果在运行时未提供@firstname,则应将我的SQL重新写入 SELECT * FROM persons WHERE id = @id OR surname = @surname 这就是我目前所拥有的 public cl

我有一个带参数的SQL语句,例如

SELECT * 
FROM persons 
WHERE id = @id 
  AND firstName = @firstname
   OR surname = @surname
我想使用c根据运行时提供的参数重写语句

例如,如果在运行时未提供@firstname,则应将我的SQL重新写入

SELECT * 
FROM persons 
WHERE id = @id OR surname = @surname
这就是我目前所拥有的

public class SqlRewriter
{
    public string RewriteSql(List<string> passedRuntimeParameter )
    {
        var sql = @"SELECT * FROM persons 
                 WHERE id=@id AND firstName=@firstname
                 or surname=@surname";
        /**
         * todo parse the sql and compare with passedRuntimeParameter.
         * todo reconstruct the sql based on parsed parameters
         */

        return sql;
    }
}
使用SQLCommand参数

using(var connection = new SqlConnection("your connectionstring goes here"))
{
    using(var command = new SqlCommand(sqlQuery,                                                                          connection))
    {
        command.Parameters.AddWithValue("@id ", yourIDvalue);
        command.Parameters.AddWithValue("@firstname ", FirstName);    
        command.Parameters.AddWithValue("@surname", surname);    
        var reader = command.ExecuteReader();
    }
}
使用SQLCommand参数

using(var connection = new SqlConnection("your connectionstring goes here"))
{
    using(var command = new SqlCommand(sqlQuery,                                                                          connection))
    {
        command.Parameters.AddWithValue("@id ", yourIDvalue);
        command.Parameters.AddWithValue("@firstname ", FirstName);    
        command.Parameters.AddWithValue("@surname", surname);    
        var reader = command.ExecuteReader();
    }
}

您正在使用参数化查询,这很好。您可以使用if块来执行所需操作,甚至可以使用内联if

string query = "SELECT * FROM persons WHERE id=@id" + ((firstname!=null&&firstname!=string.Empty) ? " AND firstname=@firstname OR surname=@surname" : " AND surname=@surname");
// setup command with query
// setup parameters (remember to check if you need to provide a firstname parameter or not)

祝您好运

您正在使用参数化查询,这很好。您可以使用if块来执行所需操作,甚至可以使用内联if

string query = "SELECT * FROM persons WHERE id=@id" + ((firstname!=null&&firstname!=string.Empty) ? " AND firstname=@firstname OR surname=@surname" : " AND surname=@surname");
// setup command with query
// setup parameters (remember to check if you need to provide a firstname parameter or not)

祝你好运你可以改写:

SELECT * FROM persons WHERE
    (id=@id OR @id is null) AND
    (
        (firstName=@firstname OR @firstname is null) OR
        (surname=@surname OR @surname is null)
    )
并在没有指定值时发送空值

如果你真的想省略这个参数,你可以像mikey或Patrick回答的那样


但是请记住,如果您真的想根据您拥有的参数、id和姓氏,或者仅仅是名字,或者名字+姓氏进行查询,那么如果您愿意自定义查询字符串,您将得到很多ifs。

那么您可以改为编写:

SELECT * FROM persons WHERE
    (id=@id OR @id is null) AND
    (
        (firstName=@firstname OR @firstname is null) OR
        (surname=@surname OR @surname is null)
    )
并在没有指定值时发送空值

如果你真的想省略这个参数,你可以像mikey或Patrick回答的那样


但请记住,如果您真的想根据您拥有的参数、id和姓氏,或者只是名字,或者名字+姓氏进行查询,如果您愿意自定义查询字符串,您将得到大量的ifs。

因此,请使用ADO Sql参数-作为一种风格,将paren放在显式中可以更容易地了解意图。例如:其中id=@id和firstName=@firstName或姓氏=@nameso使用ADO Sql参数-作为一种风格,将paren放在显式中可以更容易地了解意图。例:其中id=@id和firstName=@firstName或姓氏=@lasname感谢您的解释从我构建问题的方式来看,这非常有效,但问题是,我从RDLC定义中提取sql,因此,直到运行时我才知道参数的名称。感谢您的解释,从我构建问题的方式来看,这非常有效,但问题是,我从RDLC定义中提取sql,所以直到运行时,我才知道参数的名称。这可能更清楚,更少重复代码:string query=SELECT*FROM persons,其中id=@id和姓氏=@nam姓氏+string.IsNullOrEmptyfirstname?string.Empty:或姓氏=@姓氏+;感谢您的解释,从我构建问题的方式来看,这非常有效,但问题是,我从RDLC定义中提取sql,所以直到运行时我才知道参数的名称,并且每个参数都必须被视为独立的。@jsobo我喜欢它!有一种方法是空的——我今天学到了一些新东西。谢谢大家!@Gyidasare-如果您只是获取一个字符串列表作为方法的输入,那么如何知道参数是什么?i、 e.您如何知道列表中的哪个项目用于哪个参数?如果您知道这一点,那么您应该能够按照自己的意愿重写SQL,非常简单。问题是RDLC提供了它需要的参数。基于这些参数,我构建了一个接口来在运行时获取参数值。但我不确定将提供哪些价值。和,或在查询中使用这可能更清晰,重复次数更少的代码:string query=SELECT*FROM persons,其中id=@id和姓氏=@name+string.IsNullOrEmptyfirstname?string.Empty:或姓氏=@姓氏+;感谢您的解释,从我构建问题的方式来看,这非常有效,但问题是,我从RDLC定义中提取sql,所以直到运行时我才知道参数的名称,并且每个参数都必须被视为独立的。@jsobo我喜欢它!有一种方法是空的——我今天学到了一些新东西。谢谢大家!@Gyidasare-如果您只是获取一个字符串列表作为方法的输入,那么如何知道参数是什么?i、 e.您如何知道列表中的哪个项目用于哪个参数?如果您知道这一点,那么您应该能够按照自己的意愿重写SQL,非常简单。问题是RDLC提供了它需要的参数。基于这些参数,我构建了一个接口来在运行时获取参数值。但我不确定将提供哪些价值。而and,或用于QueryTanks中,用于此解释。从我构建问题的方式来看,这非常有效,但问题是,我从RDLC定义中提取sql,所以直到运行时我才知道参数的名称。感谢此解释,从我构建问题的方式来看,这非常有效,但问题是,我从RDLC定义中提取sql,所以直到运行时我才知道参数的名称。