2012-07-17 33 views
1

我想在我的C#代码中添加一条简单的select语句。示例如下所示。像fname中的y这样的值来自一个参数。 //从myTable中选择lname其中fname ='y'用于C中的SQL的逃逸字符

下面是我在做什么。我很明显得到Sql异常。我如何纠正它?谢谢。

string strOrdersOrigSQL = "SELECT LastName FROM Employees"; 
// Concatenate the default SQL statement with the "Where" clause and add an OrderBy clause 
     strOrdersSQL = strOrdersOrigSQL + "where FirstName ="+ 'strFname'; 
+1

使用SQL参数与sqlcommand – 2012-07-17 17:57:22

回答

1

但它是可以做到

string strOrdersOrigSQL = "SELECT LastName FROM Employees"; 
// Concatenate the default SQL statement with the "Where" clause and add an OrderBy clause 
     strOrdersSQL = strOrdersOrigSQL + " where FirstName ='"+ strFname + "'"; 

这是没有这样做,因为它可以通过SQL注入的影响的正确方法。改用参数化查询。

12

你不应该手动连接sql命令。使用类SqlCommand并添加参数

using (var cmd = new SqlCommand("SELECT LastName FROM Employees where FirstName = @firstName", conn)) 
{ 
    cmd.Parameters.AddWithValue("@firstName", strFname); 
    var reader = cmd.ExecuteReader(); 
} 
+2

我认为它应该是ExecuteScalar或ExecuteReader – 2012-07-17 17:59:27

+0

@rs。真的,改变它 – 2012-07-17 17:59:52

+0

它石化我,人们仍然这样做。 – 2012-07-17 18:00:02

0

首先,使用SqlCommand。但是,如果您选择直接编写SQL,只要您避开您的输入即可。你应该非常小心,并知道你在做什么。否则,您的代码将显示一个SQL Injection。这里是正确的代码:

string strOrdersOrigSQL = "SELECT LastName FROM Employees "; 
// Concatenate the default SQL statement with the "Where" clause and add an OrderBy clause 
strOrdersSQL = strOrdersOrigSQL + "where FirstName = '" + strFname.Replace("'", "''") + "'"; 

假设strFname是一个变量。

+0

是的,作为用户,我要做的第一件事就是将我的名字命名为“';从员工中删除;” :) – 2012-07-17 18:02:38

+0

对,当然:-) – 2012-07-17 18:03:34

+0

我会用“; TRUNCATE TABLE EMPLOYEES;” :P没有记录和快速 – 2012-07-17 18:50:24

3

其他一些问题,您的查询是你缺少一个空格和引号去字符串文字里:

strOrdersSQL = strOrdersOrigSQL + " where FirstName = '"+ strFname + "'"; 
//        ^    ^   ^

但这如果变量包含引号字符或反斜线仍然无法工作。

而不是试图逃避字符串,你应该使用参数化查询

3

你不需要担心从C#

路过时在SQL逃逸charaters

的Sql会为你

所有你需要做的SI:

string strOrdersOrigSQL = "SELECT LastName FROM Employees Where FirstName = @FirstName" 

NWO你可以传递@FirstName的值通过SqlParameter这将保护您从Sql注入查询

0

我使用下一个:

/// <summary> 
/// Escape SQL. 
/// </summary> 
/// <param name="value">Value</param> 
/// <param name="emptyToNull">Convert EMPTY to NULL?</param> 
/// <param name="test">Default: "=". Values: = | != | &lt;&gt; | &lt; | &gt; | LIKE</param> 
/// <returns>String SQL</returns> 
public static string EscapeSql(object value, bool emptyToNull = true, string test = "=") 
{ 
    // Test 
    if (string.IsNullOrWhiteSpace(test)) 
    { 
     test = "="; 
    } 
    else 
    { 
     test = test.Trim().ToUpper(); 
     if (test == "!=") 
      test = "<>"; 
    } 
    // Null 
    if (value == null) 
     return EscapeSql_NullTest(test); 
    // DateTime 
    if (value is DateTime) 
     return string.Concat(test, " '", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); 
    // Number 
    if ((value is decimal) || (value is int) || (value is Int16) || (value is Int32) || (value is Int64)) 
     return string.Concat(test, " ", value.ToString()); 
    // Boolean 
    if (value is bool) 
     return string.Concat(test, " ", (bool)value ? 1 : 0); 
    // String 
    string s = value.ToString(); 
    if (emptyToNull && string.IsNullOrEmpty(s)) 
     return EscapeSql_NullTest(test); 
    // Replace ' -> '' 
    return string.Concat(test, " '", string.Join("''", s.Split('\'')), "'"); 
} 

private static string EscapeSql_NullTest(string test) 
{ 
    return (test == "<>") ? "IS NOT NULL" : "IS NULL"; 
}