从数据库中读取数据,然后在C#中的某些条件下过滤数据

时间:2017-07-02 19:45:39

标签: c# datatable linq-to-sql dataset sqldataadapter

我的问题是在Code Behind(使用查询)中从SQL Server获取数据的最佳方法是什么,然后对Code Behind(C#)中的某些参数应用过滤

就像我必须使用动态查询从SQL Server获取数据一样 - [TableName]应该按照输入传递

Select * From [TableName]

然后我想对结果应用过滤,例如应用有效日期过滤,isActive或任何其他..

string SqlString = "SELECT * FROM TableName;";
SqlDataAdapter sda = new SqlDataAdapter(SqlString, Conn);
DataTable dt = new DataTable();
try
{
    Conn.Open();
    sda.Fill(dt);
}
catch (SqlException se)
{
    DBErLog.DbServLog(se, se.ToString());
}
finally
{
    Conn.Close();
}

或者我会用

DataSet ds = new DatSet()
sda.Fill(ds)

如果我们不知道表列(生效日期或IsActive列除外),如何迭代到结果集(DataTable / DataSet)并过滤记录

然后创建对象并以XML格式转换对象。

非常感谢您的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:2)

正如@Steve在他的评论中提到的,一个好的做法是在SQL查询中尽可能多地过滤。  
有多种方法可以使用T-sql条件(WHEREGROUP BYHAVING等来过滤和操作您的数据。与您在应用程序中可以执行的操作相比,SQL Server非常有效。
这是关于此主题的有趣讨论:“Never do in code what you can get the SQL server to do well for you” - Is this a recipe for a bad design?

另一方面,有一些例外情况,使用sql steatments将会丢失资源而且不必要。例如高频GUI更改和更新,遇到类似这样的情况时,针对sql server的多个查询可能会浪费资源,在这种情况下,一种应对方法是从数据表或其他对象中提取数据。使用LinqLambda expressions,二进制搜索等缓存在您的程序中... 重要的是要注意,作为程序员,您应该掌握并理解什么是最有效的方法操纵数据。

请在代码中查看我的意见/建议:

private void foo()
{
    // add a much conditions as you can inside the query
    // for example "SELECT * FROM TableName WHERE Col2 IS NOT NULL AND col2 LIKE '%jr%' AND col3 > 3 AND YEAR(col4) = 2017"...
    string SqlString = "SELECT * FROM TableName";
    SqlDataAdapter sda = new SqlDataAdapter(SqlString, Conn);
    DataTable dt = new DataTable();
    try
    {
        Conn.Open();
        sda.Fill(dt);
        // you can add more conditions, filterring, sorting, grouping using LINQ or Lambda Expretions
        // for example create new datatable based on condition
        DataTable newDt = dt.AsEnumerable().Where(x => x.Field<int>("col3") > 3).Select(y => y).CopyToDataTable();

        // use WriteToXml() method and save as xml file
        string FilePath = @"C:\YOUR_FILE_PATH.xml";
        // give name to the datatable, WriteToXml() can not create xml with null table name
        newDt.TableName = "myTableName";
        // save
        newDt.WriteXml(FilePath);

    }
    catch (SqlException se)
    {
        DBErLog.DbServLog(se, se.ToString());
    }
    finally
    {
        Conn.Close();
    }
}