2013-04-04 88 views
0

重写的Sql我有参数如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 [email protected] AND [email protected] 
       or [email protected]"; 
     /** 
     * todo parse the sql and compare with passedRuntimeParameter. 
     * todo reconstruct the sql based on parsed parameters 
     */ 

     return sql; 
    } 
} 
+0

因此,使用ADO Sql参数 - http://csharp-station.com/Tutorial/AdoDotNet/Lesson06 – Alex 2013-04-04 12:12:33

+0

作为一种风格把parens放在明确使更容易知道的意图。例如:WHERE ID = @ ID和(名字= @名字或姓氏= @姓) – 2013-04-04 12:14:19

回答

0
if FirstName==NULL 
{ 
sqlQuery="ConstructYourQueryfor This condition"; 
} 
else 
{ 
sqlQuery="Another Construction for else Query"; 
} 

使用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(); 
    } 
} 
+0

感谢您的解释,这完美地看着我的方式框架的问题,但问题是,我拉从RDLC定义的SQL,所以我不是参数的名称,直到运行时。 – 2013-04-04 12:30:38

0

。你可以使用if块来做你想做的甚至是内联的if。

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

好运

+0

这可能是更清晰,少重复的代码:查询字符串= “SELECT * FROM WHERE人ID = @ ID AND(姓= @姓” +(string.IsNullOrEmpty(名字)的String.Empty:“或姓氏= @姓“”)+“)”; – 2013-04-04 12:28:26

+0

感谢这个解释这工作完全在看我诬陷问题的方式,但问题是,我从一个RDLC定义拉动SQL,所以我不姓名的洁具该参数,直到运行时和每个参数必须被视为独立 – 2013-04-04 12:28:32

+0

@jsobo我喜欢它有一个IsNullOrEmpty方法 - !我今天新学有所谢谢 – mikey 2013-04-04 12:30:22

2

那么你可以代替写:

SELECT * FROM persons WHERE 
    ([email protected] OR @id is null) AND 
    (
     ([email protected] OR @firstname is null) OR 
     ([email protected] OR @surname is null) 
    ) 

和发送空当你没有指定值

还是很好,如果你真的想省略参数,你可以像mikey或Patrick回答。

但是请记住,如果你真的想根据你的参数进行查询,(ID和姓,或者只是姓名,或名字+姓),你最终会得到很多如果您愿意自定义您的查询字符串,则为ifs。