Значение ID чтения всегда равно 0 - PullRequest
0 голосов
/ 12 мая 2019

У меня есть база данных, из которой я хочу прочитать определенное значение.

Когда я читаю, ID всегда отображается как 0.

public void ClustersStatus(Clusters cl)
{
    using (SqlConnection con = new SqlConnection("Data Source=DESKTOP-JMGPJ6J;Initial Catalog=Infinity;Integrated Security=True"))
    {
        using (SqlCommand cmd = new SqlCommand("Select Approved from Master_Cluster where ClusterID = @id", con))
        {
            con.Open();

            cmd.Parameters.AddWithValue("@id", cl.ClusterID);

            cmd.Connection = con;

            SqlDataReader rdr = cmd.ExecuteReader();

            if (rdr.HasRows)
            {
                rdr.Read();

                if (Convert.ToInt32(rdr["Approved"]) == 1)
                {
                }
                else
                {
                }
            }
        }

        // return cl;
    }
}

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Действительно трудно ответить на ваш вопрос без дополнительной информации о вашей конкретной проблеме, но я думаю, что реальная проблема в вашем

rdr.Read();

линия. SqlDataReader.Read метод переводит ваш считыватель данных в запись next , что означает, что вы читаете столбец rdr["Approved"] вашей строки next с помощью

if (Convert.ToInt32(rdr["Approved"]) == 1)

код, который кажется странным, и я думаю, что это не то, что вы хотите. Возможно, вы захотите удалить его.

Также у меня есть несколько предложений;

  • Не не вставляйте строку подключения прямо в ваш код. Эти настройки могут меняться со временем. Поместите его в какой-нибудь файл конфигурации или прочитайте его из файла настроек.
  • Откройте объект подключения непосредственно перед его использованием. Ничего страшного, но это хорошая практика.
  • Do not , используйте AddWithValue метод. Это может иногда давать неожиданные результаты . Вместо этого используйте метод Add (предпочтительно Add(String, SqlDbType, Int32) перегрузка )
0 голосов
/ 12 мая 2019

Предполагается, что ваш запрос предлагает вам то, что вы хотите, чтобы иметь возможность использовать данные, считанные с SqlDataReader, вам нужно использовать интерфейс IDataRecord. Вы не можете напрямую использовать переменную rdr.

Для простоты использования, я написал механизм чтения в функцию. Я пишу здесь идею для вас, чтобы адаптировать ее к вашим потребностям:

        private static int ReadSingleRow(IDataRecord record)
        {
//below is an example of processing using `record`. You adapt it to your needs
            int.TryParse(record[0].ToString(), out int temp);
            MessageBox.Show (temp.ToString());
//...do the processing you need
            return temp;
        }

После того, как вы написали функцию, основным становится:

              if (rdr.HasRows)
                {
                  while (rdr.Read());
                   int x=ReadSingleRow((IDataRecord) rdr); 
//or use, somehow, the above function
// other processing

                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...