C# SqlDataReader Нет данных для строки/столбца

Я некоторое время был в стороне от программирования, но недавно у меня возникла потребность в этом.

У меня проблема с SQL DataReader с использованием Sql Server Compact Edition 4.0 (встроенный VS2012).

string connstring = "Data Source=C:\\..(Path Here)..\\VacationsDB.sdf";
SqlCeConnection conn = new SqlCeConnection(connstring);
string strSQL = "SELECT * FROM Vacation WHERE VacationNo = @val";

using (SqlCeCommand cmd = new SqlCeCommand(strSQL, conn))
{
    //read search value from from text field
    cmd.Parameters.AddWithValue("@val", vacationno_txt.Text);
    conn.Open();

    SqlCeDataReader reader = cmd.ExecuteReader();
    fname_txt.Text = reader.GetString(0);
    mname_txt.Text = reader.GetString(1);
    /*
     * .. snip
     */
    vacationno_txt.Text = reader.GetString(11);
    conn.Close();
}

Я продолжаю получать сообщение об ошибке: «InvalidOperationException is Unhandled. Нет данных для строки/столбца». И ошибка указывает на fname_txt.Text = reader.GetString(0);

Но на самом деле там есть данные, потому что кнопка «Отправить» со всем ее кодом работает, и я проверил это в самой таблице базы данных.

Какие-нибудь советы? Спасибо.


person Yousef Imran    schedule 09.08.2013    source источник


Ответы (3)


DataReaders начинаются перед первой строкой.

Чтобы прочитать из первой строки, вызовите Read() один раз.
Если первой строки нет, Read() вернет false.

person SLaks    schedule 09.08.2013

Сначала вам нужно переместить позицию читателя (ряда). И закройте его, когда он вам больше не нужен.

...
using(SqlCeDataReader reader = cmd.ExecuteReader())
{
    if (reader.Read())
    {
        fname_txt.Text = reader.GetString(0);
        mname_txt.Text = reader.GetString(1); . . . 
        vacationno_txt.Text = reader.GetString(11);
    }
}
...
person pspet    schedule 09.08.2013
comment
Спасибо. Это сработало. Я переместил 'conn.Open();' над блоком использования и использовал ваше предложение, и это сработало. Большое спасибо. - person Yousef Imran; 10.08.2013

Используйте новое средство чтения данных, если отображается сообщение «Нет данных для строки/столбца».

OleDbCommand cmdsearch2 = new OleDbCommand("Выберите * из tbl_quotation, где quotationno = @qno ", con); cmdsearch2.Parameters.AddWithValue("@qno", txt_quotationno.Text); OleDbDataReader drr = cmdsearch2.ExecuteReader();

            if (drr.HasRows)
            {
                while (drr.Read())
                {
                    cmb_customername.Text = drr["customername"].ToString();
                    txt_revno.Text = drr["revno"].ToString();
                    dtp_qdate.Text = drr["qdate"].ToString();
                    txt_paymentterms.Text = drr["paymentterms"].ToString();
                    txt_delivery.Text = drr["delivery"].ToString();
                    txt_freight.Text = drr["freight"].ToString();
                    txt_quotationvalidity.Text = drr["validity"].ToString();


                }
            }
            drr.Close();
person Nitin...    schedule 22.07.2015