Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 让这个ForEach更有效率_C#_Sql_Asp.net - Fatal编程技术网

C# 让这个ForEach更有效率

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

我有大约30-40辆车,它们有单独的呼号(4位数字),这些呼号将是字符串。每辆车都有自己的表。我需要检查这些表中的每一个,看看清除日期是否与传入的日期相同(使用“CleanDate”变量)。目前,我与以下ForEach循环有一个打开的连接,如果date=CleanDate,该循环将标记为选中

  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列的“清理”表,然后添加了一个新的日期。然后查询该表。谢谢