2012-12-05 49 views
0

我想知道(在我的代碼下面),我確保dataID是一個文本(或varchar或int)在參數傳遞下面?C#和SQL參數,以防止注入

public T ExecuteQuery<T>(Func<IDataReader, T> getResult, string query, params IDataParameter[] parameters) 
    { 
     using (SqlConnection conn = new SqlConnection(this.DefaultConnectionString)) 
     { 
      conn.Open(); 

      // Declare the parameter in the query string 
      using (SqlCommand command = new SqlCommand(query, conn)) 
      { 
       foreach (var parameter in parameters) 
       { 
        command.Parameters.Add(parameter); 
       } 

       command.Prepare(); 

       using (SqlDataReader dr = command.ExecuteReader()) 
       { 
        return getResult(dr); 
       } 
      } 
     } 
    } 

    public string GetMySpecId(string dataId) 
    { 
     return ExecuteQuery(
      dr => 
      { 
       if (dr.Read()) 
       { 
        return dr[0].ToString(); 
       } 

       return string.Empty; 
      }, 
      "select specId from MyTable where dataId = @dataId", 
      new SqlParameter("dataId", dataId)); 
    } 

我用的代碼如下所示:

command.Parameters.Add(new SqlParameter("key", SqlDbType.Text)); 

command.Prepare(); 

command.Parameters[0].Value = dataId; 

要不然怎麼在上面的代碼,做我通過兩個或多個參數代入的executeQuery?

回答

1

該代碼使用params關鍵字,因此您應該只編寫額外的轉義SQL並將參數附加到方法的末尾。這裏是一個使用你的代碼作爲基礎的例子。

該鏈接提供了一個更完整的解釋,但params使得它可以在方法簽名結束時擁有可變數量的參數(只要它們是相同類型)。它將所有落在此變量中的最終參數放入數組中。

return ExecuteQuery(
     dr => 
     { 
      if (dr.Read()) 
      { 
       return dr[0].ToString(); 
      } 

      return string.Empty; 
     }, 
     "select specId from MyTable where dataId = @dataId and somethingelse = @else", 
     new SqlParameter("dataId", dataId), 
     new SqlParameter("else", elseVar); 
+0

它們是不同類型的? – cdub

+0

我也想通過不同的類型,也許我應該將其更改爲字典? – cdub

2

ExecuteQuery已經有多個參數。這是一個ParamArray這意味着它需要任意數量的參數並將它們變成一個數組。

舉例來說,如果我有這樣的功能:

public int Sum(params int[] numbersToSum) { ... } 

我可以這樣調用:

Sum(1, 2, 5, 6, 1) 

在你的情況,你可以這樣調用它:

ExecuteQuery(
    dr => { //snip }, 
    query, 
    new SqlParameter("dataId", dataId), 
    new SqlParameter("anotherParm", parm2), 
    new SqlParameter("anotherParm", parm3), 
    ...); 
+0

我該如何讓類型傳遞過來,比如SqlDBType.NVarchar? – cdub

+0

假設你在'System.Data.SqlClient'中使用'SqlParameter'類,那麼你可以在你正在傳遞的'SqlParameter'對象上設置('SqlDBType'屬性)。但是,'SqlDBType'是從構造函數中給出的.NET對象中推斷出來的,因此您並不需要指定它:http://msdn.microsoft.com/zh-cn/library/0881fz2y.aspx –