Как сделать «если» на основе значения, полученного из запроса? - PullRequest
2 голосов
/ 16 апреля 2019

Мне нужно вставить в таблицу «pass» или «fail», если из выполненного запроса есть один сбой вместо «RProva», я должен поставить «fail», если запрос не может найти ни одного сбоя вместо «RProva» я должен вставить «pass», запрос работает, но я не могу понять, как сделать if с результатами запроса, может быть, мне нужно использовать «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) это работает, но мне нужно вставить ТОП в RProva

1 Ответ

1 голос
/ 16 апреля 2019

На основании вашего вопроса и комментария, я думаю, что вы неправильно поняли ExecuteScalar:
ExecuteScalar выполняет запрос и возвращает первый столбец первой строки в наборе результатов, возвращенных запросом. docs.microsoft.com / EN-US / DotNet / апи / system.data.sqlclient.sqlcommand.executescalar

Я не знаю Тип "RD" или "PASS", но IF в вашем примере (при использовании ExecuteScalar) выглядит нормально. Иначе, когда вы используете ExecuteReader, вы должны использовать какой-то цикл для перебора элементов. Как это:

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();
        }
    }
}

Конечно, есть лучший способ, но, возможно, это поможет вам.

EDIT: Вот как я мог бы реализовать ваш пример кода:

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...