Попытка получить данные в текстовое поле из SQL. в позиции 0 исключение отсутствует - PullRequest
0 голосов
/ 02 мая 2018
 public void doldur()
    {
        SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Odev.mdf;Integrated Security=True");
        con.Open();

        SqlDataAdapter da = new SqlDataAdapter("Select * From ogrenciler Order By adsoyad ASC", con);
        DataSet dts = new DataSet();

        da.Fill(dts, "ogrenciler");
        comboBox1.DataSource = dts.Tables["ogrenciler"];
        comboBox1.ValueMember = "adsoyad";
        comboBox1.DisplayMember = "adsoyad";

        comboBox2.DataSource = dts.Tables["ogrenciler"];
        comboBox2.ValueMember = "adsoyad";
        comboBox2.DisplayMember = "adsoyad";

        con.Close();
    }

- combobox2 получает данные правильно -

 private void ogrenci_Load(object sender, EventArgs e)
    {
        doldur();

    }

- работает либо -

 private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        textBox7.Text = "";
        textBox8.Text = "";
        textBox9.Text = "";
        textBox10.Text = "";

        SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Odev.mdf;Integrated Security=True");
        con.Open();

        SqlDataAdapter du = new SqlDataAdapter("Select * From ogrenciler Where adsoyad='"+ comboBox2.SelectedValue.ToString() +"'", con);
        DataSet dy = new DataSet();

        du.Fill(dy, "ogrenciler");

        textBox7.Text = dy.Tables[0].Rows[0]["adsoyad"].ToString();
        textBox8.Text = dy.Tables[0].Rows[0]["mail"].ToString();
        textBox9.Text = dy.Tables[0].Rows[0]["sinif"].ToString();
        textBox10.Text = dy.Tables[0].Rows[0]["sube"].ToString();

        con.Close();
    }

Здесь я получаю:

«Исключение типа« System.IndexOutOfRangeException »произошло в System.Data.dll, но не было обработано в коде пользователя» (в строке textbox7)

Я проверил свою таблицу, чтобы убедиться, что я написал правильный оператор SQL. (Все правильно) Затем я понимаю, что мой dataadapter или набор данных не получает буквально никаких данных. Вот почему я не могу заполнить свои текстовые поля. Я пытался использовать datatable / rows.count, executetescalar, datareader / dr.read, executereader. Ничто из этого не сработало. Затем я начал подозревать о своем заявлении SQL. Не знаю, как исправить. Новое в этом языке. Я задолбался. Пожалуйста, помогите мне с этим.

ps: этот код работал правильно 2 дня назад.

Редактировать 1: Я только что узнал, что если значение моего combobox2 включает буквы «ı, ş, ğ» (а мое первое значение включает «ş»), я получаю эту ошибку.

1 Ответ

0 голосов
/ 02 мая 2018

Правильный способ исправить это - использовать параметризованные запросы. Это действительно легко исправить. Это предотвращает этот тип ошибки, а также 100% предотвращает инъекцию SQL. Настроить запросы так просто, что не делать это просто лениво.

SqlDataAdapter du = new SqlDataAdapter("Select * From ogrenciler Where adsoyad = @CombBox2", con);
du.SelectCommand.Parameters.Add("@ComboBox2", SqlDbType.NVarChar, 20).Value = comboBox2.SelectedValue.ToString();
DataSet dy = new DataSet();
...