如何根据从Query中检索的值创建“if”?

问题描述 投票:2回答:1

我需要插入一个表“通过”或“失败”,如果从查询完成有一个单一的失败而不是'RProva'我必须把“失败”如果查询找不到单个失败而不是' RProva'我必须插入“传递”,查询工作但我无法弄清楚如何使用查询的结果,也许我必须使用“for”?不知道。它是尝试制作它,第二个是查询,我必须插入可能的结果“IF”

1.

    SqlCommand cmdRD = new SqlCommand("SELECT ResItem AS RD FROM tSE JOIN tL ON tSE.idSE=tL.idL WHERE tL.Selection=1");
    var RD = cmdRD.ExecuteScalar();

    var values = new List<string>();
    using (cmdRD,sqliteCon)
    {
        using (SqlDataReader reader = cmdRD.ExecuteReader())
         {
            while (reader.Read())
            {
                values.Add(reader[0].ToString());
            }
        }
    }

2.

    SqlCommand cmd1 = new SqlCommand("INSERT INTO tSD(NomeItem,ResItemDet,DateStartDet,DateEndDet) OUTPUT inserted.Id VALUES (@NI,@RProva,@DATESE,@DATEED)");
    cmd1.Parameters.AddWithValue("@DATESE", DATESE);
    cmd1.Parameters.AddWithValue("@DATEED", DATEED);
    cmd1.Parameters.AddWithValue("@NI", NI);


    using (cmd1,sqliteCon)
    {
          foreach (var value in values)
          {
             if (value.Equals(pass))
             {
                        cmd1.Parameters.AddWithValue("@RProva", value);
             }
             else
             {
                        cmd1.Parameters.AddWithValue("@RProva", fail);
             }
                    cmd1.ExecuteNonQuery();
          }
    }

    int generatedId = Convert.ToInt32(cmd1.ExecuteScalar());
    cmd1.Parameters.Clear();


    SqlCommand cmd2 = new SqlCommand("UPDATE tSE SET FK_TSD_id = @tsdId FROM tL JOIN tSE ON tL.idL = tSE.idSE WHERE tL.Selection=1 ", sqliteCon);
    cmd2.Parameters.AddWithValue("@tsdId", generatedId);
    cmd2.ExecuteNonQuery();

    MessageBox.Show("Dato Aggiunto");

  }
  sqliteCon.Close();

1.1

    SqlCommand cmdRD = new SqlCommand("SELECT ResItem AS RD FROM tSE JOIN tL ON tSE.idSE=tL.idL WHERE tL.Selection=1", sqliteCon);
    var RD = cmdRD.ExecuteScalar();

    var tot =pass;
    using (cmdRD)
    {
        using (SqlDataReader reader = cmdRD.ExecuteReader())
         {
            while (reader.Read())
            {
                if(reader[0].ToString()==fail)
                {
                            tot = fail;
                            break;
                }
            }
            MessageBox.Show(tot);
        }
    }

我到了那里(1.1)它有效,但我要将TOT插入RProva

c# sql
1个回答
1
投票

根据你的问题和评论,我认为你误解了ExecuteScalar: ExecuteScalar执行查询,并返回查询返回的结果集中第一行的第一列。 docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executescalar

我不知道“RD”或“PASS”的类型,但您的示例中的IF(使用ExecuteScalar时)似乎没问题。另外,当您使用ExecuteReader时,您应该使用某种循环来遍历Items。像这样:

string pass = "abc"; // guessing types and values
string fail = "failed";
string sqliteCon = "Data Source=(localdb)\\MSSQLLocalDB;Database=BooksDb";

using (SqlConnection connection = new SqlConnection(sqliteCon))
{
    connection.Open();

    var queryString = @"SELECT ResItem AS RD 
                FROM tSE 
                JOIN tL ON tSE.idSE = tL.idL 
                WHERE tL.Selection=1";

    var values = new List<string>();
    using (SqlCommand command = new SqlCommand(queryString, connection))
    {
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                values.Add(reader[0].ToString());
            }
        }
    }

    var queryInsert = @"INSERT INTO tSD (NomeItem,ResItemDet,DateStartDet,DateEndDet) 
                                VALUES (@NI, @RProva, @DATESE, @DATEED)";
    using (SqlCommand command2 = new SqlCommand(queryInsert, connection))
    {
        foreach(var value in values)
        {
            command2.Parameters.Clear();
            if (value.Equals(pass))
            {
                command2.Parameters.AddWithValue("@RProva", value);
            }
            else
            {
                command2.Parameters.AddWithValue("@RProva", fail);
            }
            command2.ExecuteNonQuery();
        }
    }
}

Theres肯定是一个更好的方法,但也许这可以帮助你。

编辑:这是我将如何实现您的代码示例:

using (SqlConnection sqliteCon = new SqlConnection(connection))
{
    sqliteCon.Open();
    var values = new List<string>();
    var query = "SELECT ResItem AS RD FROM tSE JOIN tL ON tSE.idSE=tL.idL WHERE tL.Selection=1";
    using (SqlCommand cmdRD = new SqlCommand(query, sqliteCon))
    {
        var RD = cmdRD.ExecuteScalar();
        using (SqlDataReader reader = cmdRD.ExecuteReader())
        {
            while (reader.Read())
            {
                values.Add(reader[0].ToString());
            }
        }
    }

    int generatedId = 0;
    var query2 = "INSERT INTO tSD(NomeItem,ResItemDet,DateStartDet,DateEndDet) OUTPUT inserted.Id VALUES (@NI,@RProva,@DATESE,@DATEED)";
    using (SqlCommand cmd1 = new SqlCommand(query2, sqliteCon))
    {
        foreach (var value in values)
        {
            cmd1.Parameters.Clear();
            cmd1.Parameters.AddWithValue("@DATESE", DATESE);
            cmd1.Parameters.AddWithValue("@DATEED", DATEED);
            cmd1.Parameters.AddWithValue("@NI", NI);

            if (value.Equals(pass))
            {
                cmd1.Parameters.AddWithValue("@RProva", value);
            }
            else
            {
                cmd1.Parameters.AddWithValue("@RProva", fail);
            }
            cmd1.ExecuteNonQuery();
        }

        generatedId = Convert.ToInt32(cmd1.ExecuteScalar());
    }

    var query3 = "UPDATE tSE SET FK_TSD_id = @tsdId FROM tL JOIN tSE ON tL.idL = tSE.idSE WHERE tL.Selection=1 ";
    using (SqlCommand cmd2 = new SqlCommand(query3, sqliteCon))
    {
        cmd2.Parameters.AddWithValue("@tsdId", generatedId);
        cmd2.ExecuteNonQuery();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.