我的问题是在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格式转换对象。
非常感谢您的帮助。提前谢谢。
答案 0 :(得分:2)
正如@Steve在他的评论中提到的,一个好的做法是在SQL查询中尽可能多地过滤。
有多种方法可以使用T-sql条件(WHERE
,GROUP BY
,HAVING
等来过滤和操作您的数据。与您在应用程序中可以执行的操作相比,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?
请在代码中查看我的意见/建议:
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();
}
}