简体   繁体   English

Sql Reader循环包含选择,该选择确定要插入的数据

[英]Sql Reader Loop contains Select that determines which data to insert

Hello I am new to C#/ADO I wrote the following code. 您好,我是C#/ ADO的新手,我编写了以下代码。 I essentially want to open the database and create a reader using a select statement. 我本质上是想打开数据库并使用select语句创建阅读器。 I then want to loop through that reader and grab a column value for use in a second sql statement. 然后,我想遍历该读取器并获取一个列值以在第二个sql语句中使用。 If the ExecuteScaler is not null and I know there is only one record then I want to insert a record into a dataset with the Spindletime as the last parm. 如果ExecuteScaler不为null,并且我知道只有一条记录,那么我想将一条记录插入Spindletime作为最后一个参数的数据集中。 If it is null then I want to insert the same record but with a zero for the last parm. 如果为null,那么我想插入相同的记录,但最后一个参数为零。 I want to do this check and insert for every row in the reader. 我想进行此检查并为阅读器中的每一行插入。 Then close up shop. 然后关闭商店。 Tips on a better way to do this would be helpful. 更好的方法提示将很有帮助。 Can I use dataadapter.fill? 我可以使用dataadapter.fill吗?

here is my code 这是我的代码

conn.Open

using (SqlCommand cmd1 = new SqlCommand("Select Distinct PartName, OrderName, RequiredQuantity, StartDate, CompleteDate, NormalQuantity, ScrapQuantity, OrderComment from OrderResults"))
{
    using (SqlDataReader 1streader = cmd1.ExecuteReader())
    {
        while (1streader.Read())
        {
            string strordername = reader.GetString(2);  get the ordername

            using (SqlCommand cmd2 = new SqlCommand("Select OrderName,
            Sum(SpindleTime) as TotalSpindle Time from MachineResults 
            Where @OrderName = strordername"))
      {
            cmd2.CommmandType = CommandType.Text;
                cmd2.Parameters.AddWithValues(“@OrderName”, strordername)

                object o = cmd2.ExecuteScalar(); 
                if(o != null)  Check if record exists
                {

        SqlCommand cmd3 = new SqlCommand();
        cmd3.Connection = conn;
  cmd3.CommandText = "INSERT INTO PartResults(PartName,
      OrderName, RequiredQuantity, StartDate, CompleteDate, 
      NormalQuantity, ScrapQuantity, OrderComment,
      SpindleTime)
                         VALUES
                           (@param1, @param2, @param3, @param4, @param5, @param6, 
                            @param7, @param8, @param9)";

        cmd3.Parameters.AddWithValue("@param1", 
        reader.GetString(1));
        cmd3.Parameters.AddWithValue("@param2", 
         reader.GetString(2));
        cmd3.Parameters.AddWithValue("@param3", 
        reader.GetString(3));
        cmd3.Parameters.AddWithValue("@param4", 
        reader.GetString(4));
        cmd3.Parameters.AddWithValue("@param5", 
        reader.GetString(5));
        cmd3.Parameters.AddWithValue("@param6", 
        reader.GetString(6));
        cmd3.Parameters.AddWithValue("@param7",
        reader.GetString(7));
        cmd3.Parameters.AddWithValue("@param8", 
        reader.GetString(8));
        cmd3.Parameters.AddWithValue("@param9", TotalSpindle));

                cmd3.ExecuteNonQuery(); 
                   }
                    else 
                    {
          SqlCommand cmd4 = new SqlCommand();
         cmd4.Connection = conn;
   cmd4.CommandText = "INSERT INTO PartResults(PartName,
      OrderName, RequiredQuantity, StartDate, CompleteDate, 
      NormalQuantity, ScrapQuantity, OrderComment,
      SpindleTime)
                         VALUES
                           (@param1, @param2, @param3, @param4, @param5, @param6, 
                            @param7, @param8, @param9)";

        cmd4.Parameters.AddWithValue("@param1", 
        reader.GetString(1));
        cmd4.Parameters.AddWithValue("@param2", 
        reader.GetString(2));
        cmd4.Parameters.AddWithValue("@param3", 
        reader.GetString(3));
        cmd4.Parameters.AddWithValue("@param4",
        reader.GetString(4));
        cmd4.Parameters.AddWithValue("@param5", 
        reader.GetString(5));
        cmd4.Parameters.AddWithValue("@param6", 
        reader.GetString(6));
        cmd.Parameters.AddWithValue("@param7",
        reader.GetString(7));
        cmd4.Parameters.AddWithValue("@param8", 
        reader.GetString(8));
        cmd4.Parameters.AddWithValue("@param9", 0));

                cmd4.ExecuteNonQuery(); 
                  }
               }  

                }
        }
        1streader.Close();
    }
}
conn.Close();

You don't need a reader , loop or any dataset. 您不需要reader,loop或任何数据集。 If i understand clear , you can achieve this with a single query like below. 如果我明白clear,则可以通过以下单个查询来实现。 Try and tell me in case you need more help. 尝试告诉我,以防您需要更多帮助。 I should work though. 我应该工作。

INSERT INTO PartResults(PartName,
      OrderName, RequiredQuantity, StartDate, CompleteDate, 
      NormalQuantity, ScrapQuantity, OrderComment,
      SpindleTime)

  VALUES
                          Select Distinct PartName, OrderName, 
                                 RequiredQuantity, StartDate, CompleteDate, 
                                 NormalQuantity, ScrapQuantity, OrderComment,
                                 (SELECT
                                      CASE WHEN  Sum(SpindleTime) > 0 
                                     THEN            Sum(SpindleTime) 
                                      ELSE  0 END AS TotalSpindle  
                                  FROM MachineResults 
                                  WHERE OrderName =OrderResults.OrderName  ) 
                                  from OrderResults

Assuming OrderName is a relation/Foreign key between OrderResults and MachineResults .IF not then replace it with the relation between the two tables. 假设OrderName是OrderResults和MachineResults之间的关系/外键。如果不是,则不要用两个表之间的关系替换它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM