2017-10-20 128 views
3

我正在擴展項目中的類,我需要將特定數據從SQL表中拉出到DataTable中。之前,數據是在一個SQL過程中計算和修改的,但是我已經修改了這個,以便將計算的數據傳遞到一個新表中。現在,我正在編寫一個方法,根據它的ID值將這些數據從數據庫中提取出來。根據參數將數據從SQL表中提取到DataTable中

很多這種代碼是由另一個開發人員編寫的,他有一個元組的東西,我不知道太多,並且讓我有點困惑。邏輯上來說,我做了類似的事情,但我只是拉下了一張桌子,而不是一個特定的行。

這是我的方法,第一遍:

public DataTable ReadSqlTableToDataTable(List<Tuple<string, string>> parameterValueMappings, DataTable dt) 
    { 
     string query = "SELECT * FROM dbo.Mytable WHERE IdValue= "; 

     using (var conn = new SqlConnection(_config.ConnectionString)) 
     { 
      conn.Open(); 

      SqlCommand cmd = new SqlCommand(query + parameterValueMappings, conn); 


      using (var da = new SqlDataAdapter(cmd)) 
      { 
       da.SelectCommand.CommandTimeout = 600; 
       da.Fill(dt); 
      } 
     }       
     return dt; 
    } 

然後,我用它的一類,像這樣:

private readonly IDbRepository _repo; 
private readonly DataTable _revisedDatabTable; 
private List<Tuple<string, string>> _commandParameters; 
private readonly int _batchId; 

public FooClass(IDbRepository repository, DataTable revisedDatabTable, int batchId) //pass in structure 
    { 
     _repo = repository; 
     _revisedDatabTable = revisedDatabTable; 
     _batchId = batchId; 
    } 

    public void Execute() 
    { 

     _commandParameters = new List<Tuple<string, string>> 
     { 
      new Tuple<string, string>("@IDValue",_idValue.ToString()) 
     }; 


     _repo.ReadSqlTableToDataTable(_commandParameters, _revisedDatabTable); 
    } 

之前最後調用類是這樣的:

new FooClass(_repo, dtRevisedData, idValue).Execute(); 

idValue通過文件讀入並被引入到我的新SQL表中。

現在,當我運行這個時,我沒有得到任何回報。我的桌子上有數據,所以我知道這不是問題。我有一個感覺,問題在於我如何使用元組。我是否正確設置了它?如果不是,我做錯了什麼?

+0

把休息的ReadSqlTableToDataTable並檢查您的查詢 - IM想它不看你怎麼想它 – BugFinder

+0

你希望得到什麼,當你用「+」操作符與'string'和'名單<組<字符串,stirng >>'在線'新的SqlCommand(query + parameterValueMappings,conn);'? – Fabio

+0

@Fabio我期望它是一個整數值來完成我傳入的SQL語句。由於我的SQL查詢不完整 – N0xus

回答

2

您錯用了SqlCommand。不應串聯字符串,而應將查詢指定爲字符串並使用SqlCommand.Parameters傳遞所有參數。 請參閱樣本here

在你的情況下,它應該是這樣的。沒有元組,沒有連接。

string query = "SELECT * FROM dbo.Mytable WHERE IdValue = @IDValue;"; 

SqlCommand command = new SqlCommand(query , conn); 
command.Parameters.Add("@IDValue", SqlDbType.Int); 
0

爲什麼不把值分成逗號分隔的字符串,並使用IN而不是=?

string allTuperValues = string.Join(",", parameterValueMappings.Select(t => 
string.Format("{0}", t.Item2))); 
string query = "SELECT * FROM dbo.Mytable WHERE IdValue IN(" + allTuperValues 
+ ")"; 
+1

不是最佳方法和壞建議,你應該總是使用'SqlParameter'。保持安全的SQL注入和更有效地執行查詢(通過重用使用符合的查詢計劃) – Fabio