C# 让这个ForEach更有效率
我有大约30-40辆车,它们有单独的呼号(4位数字),这些呼号将是字符串。每辆车都有自己的表。我需要检查这些表中的每一个,看看清除日期是否与传入的日期相同(使用“CleanDate”变量)。目前,我与以下ForEach循环有一个打开的连接,如果date=CleanDate,该循环将标记为选中C# 让这个ForEach更有效率,c#,sql,asp.net,C#,Sql,Asp.net,我有大约30-40辆车,它们有单独的呼号(4位数字),这些呼号将是字符串。每辆车都有自己的表。我需要检查这些表中的每一个,看看清除日期是否与传入的日期相同(使用“CleanDate”变量)。目前,我与以下ForEach循环有一个打开的连接,如果date=CleanDate,该循环将标记为选中 SqlConnection cnn = new SqlConnection(constr); cnn.Open(); foreach (ListItem item in
SqlConnection cnn = new SqlConnection(constr);
cnn.Open();
foreach (ListItem item in checkboxlistAM.Items)
{
string callsignstring = item.Text;
string queryTable = "SELECT [date made ready AM] FROM [" + callsignstring + "]";
SqlCommand cmd = new SqlCommand(queryTable, cnn);
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
if (rdr[0].ToString()!="")
{
if ((DateTime)rdr[0] == CleanDate)
{
item.Selected = true;
}
}
}
rdr.Close();
}
cnn.Close();
这是没有效率的。我怎样才能让它变得更好
我的想法是-
SQL存储过程-有人能帮我解决这个问题吗?
是否可以使用SPmsforeachtable,或者这会降低效率
将“呼号”(字符串)添加到数组或列表并以某种方式传递
TIA通常,您不应该太担心性能,但在循环中执行数据库调用通常会大大降低速度,只要您得到的不仅仅是几个
checkboxlistAM.Items
正如Kevin在评论中提到的,真正的问题是您正在使用相同的数据创建新表
如果所有车辆都具有相同的结构,则可以添加一个鉴别器列,该列的值将是您当前的表名
或者,您可以使用UNION
消除循环查询:
SELECT Id, PlateNumber, '1' AS Descriminator FROM Vehicles1
UNION
SELECT Id, PlateNumber, '2' FROM Vehicles2
UNION
SELECT Id, PlateNumber, '3' FROM etc
您可以使用视图并单独从该视图中选择,而不是自己构建此查询:
SELECT * FROM VehiclesView WHERE Descriminator IN ('1', '2', ...);
为了避免Sql注入,您可能不应该自己构建Sql,而应该使用ORM或SqlCommand.Parameters
如果每种类型的车辆的数据完全不同,则仍可使用活接头:
SELECT Id AS INTEGER1, PlateNumber AS STRING1, xxx AS STRING2 From Vehicles1
UNION
SELECT ID, yyy AS STRING1, zzz AS STRING2 FROM Vehicles2
这将是相当混乱的,但您可以实现某种类型的反腐败层,将无法识别的STRING1、STRING2。。。回到人类可读的东西
如果所有的车辆都如此不同,也许你可以使用NoSql数据库(比如MongoDb)来代替
如果某个东西可IDisposable
,请使用构造。这是一个很好的清理实践:
using (SqlConnection cnn = new SqlConnection(constr))
{
// do your stuff
// .Close() will be called automatically
}
通常情况下,您不应该太担心性能,但在循环中执行数据库调用通常会大大降低速度,因为您得到的不仅仅是几个checkboxlistAM.Items
正如Kevin在评论中提到的,真正的问题是您正在使用相同的数据创建新表
如果所有车辆都具有相同的结构,则可以添加一个鉴别器列,该列的值将是您当前的表名
或者,您可以使用UNION
消除循环查询:
SELECT Id, PlateNumber, '1' AS Descriminator FROM Vehicles1
UNION
SELECT Id, PlateNumber, '2' FROM Vehicles2
UNION
SELECT Id, PlateNumber, '3' FROM etc
您可以使用视图并单独从该视图中选择,而不是自己构建此查询:
SELECT * FROM VehiclesView WHERE Descriminator IN ('1', '2', ...);
为了避免Sql注入,您可能不应该自己构建Sql,而应该使用ORM或SqlCommand.Parameters
如果每种类型的车辆的数据完全不同,则仍可使用活接头:
SELECT Id AS INTEGER1, PlateNumber AS STRING1, xxx AS STRING2 From Vehicles1
UNION
SELECT ID, yyy AS STRING1, zzz AS STRING2 FROM Vehicles2
这将是相当混乱的,但您可以实现某种类型的反腐败层,将无法识别的STRING1、STRING2。。。回到人类可读的东西
如果所有的车辆都如此不同,也许你可以使用NoSql数据库(比如MongoDb)来代替
如果某个东西可IDisposable
,请使用构造。这是一个很好的清理实践:
using (SqlConnection cnn = new SqlConnection(constr))
{
// do your stuff
// .Close() will be called automatically
}
这里真正的问题是数据模型。“呼号”应该是表中的一列,而不是每个呼号的一个不同的表。我不认为您可以更改它?如果您不能更改现有的表,创建一个聚合所有呼号表的视图可能是一种替代方法(从呼号1 UNION选择[date Make ready AM]从呼号2 UNION选择[date Make ready AM]。
)。通过这种方式,您可以将复杂性留在数据库端,并且如果添加了新的调用号,“主表”中确实有一列用于调用号,但是,我需要为每个呼号创建一个表格,以保存关于实际上不适合主表的车辆的特定信息。为什么它实际上不适合主表?因为主表包含大约30-40的信息,所以每次“清洁”时,每个呼号都需要一个新列完成以记录所有已完成清洗的日期。然而,如果我们为每个呼号都有一个表,那么这些可以在1列下输入,这里真正的问题是数据模型。“呼号”应该是表中的一列,而不是每个呼号的一个不同的表。我不认为您可以更改它?如果您不能更改现有的表,创建一个聚合所有呼号表的视图可能是一种替代方法(从呼号1 UNION选择[date Make ready AM]从呼号2 UNION选择[date Make ready AM]。
)。通过这种方式,您可以将复杂性留在数据库端,并且如果添加了新的调用号,“主表”中确实有一列用于调用号,但是,我需要为每个呼号创建一个表格,以保存关于实际上不适合主表的车辆的特定信息。为什么它实际上不适合主表?因为主表包含大约30-40的信息,所以每次“清洁”时,每个呼号都需要一个新列完成以记录所有已完成清洗的日期。然而,如果我们为每个呼号都有一个表,它们可以在1列下输入OK,像往常一样,你们是对的,我已经改变了数据的存储方式,现在有一个带有呼号列的“清理”表,然后添加了一个新的日期。然后查询该表。谢谢,像往常一样,你们是对的,我已经改变了数据的存储方式,现在有了一个带有callsign列的“清理”表,然后添加了一个新的日期。然后查询该表。谢谢