2017-10-20 74 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