读取器关闭时无效尝试调用MetaData

时间:2011-08-30 16:07:01

标签: c#

try
{

    SqlCommand cmd = con.CreateCommand(); // connection string is correct, work great with other functions.

    cmd.CommandText = "Select * from BOOKS where ac_no='a10001'";
    cmd.CommandType = CommandType.Text;
    con.Open();
    SqlDataReader data = cmd.ExecuteReader();

    int Ac_no = data.GetOrdinal("Ac_no");
    int Issn = data.GetOrdinal("Issn");
    int Isbn = data.GetOrdinal("Isbn");
    int Title = data.GetOrdinal("Title");
    int Author = data.GetOrdinal("Author");
    int Publisher = data.GetOrdinal("Publisher");
    int Edition = data.GetOrdinal("Edition");
    int Year = data.GetOrdinal("Year");
    int Price = data.GetOrdinal("Price");
    int Available = data.GetOrdinal("Available");
    int Rack_no = data.GetOrdinal("Rack_no");

    data.Read();

    /* works fine when label is used to display data */
    /* 

    lbl_Acno.Text = data.GetValue(Ac_no).ToString();
    lbl_Issn.Text = data.GetValue(Issn).ToString();
    lbl_Isbn.Text = data.GetValue(Isbn).ToString();
    lbl_Title.Text = data.GetValue(Title).ToString();
    lbl_Author.Text = data.GetValue(Author).ToString();
    lbl_Pub.Text = data.GetValue(Publisher).ToString();
    lbl_Edition.Text = data.GetValue(Edition).ToString();
    lbl_Book_Year.Text = data.GetValue(Year).ToString();

    */

    /* creates error when textboxes are used to display data */

    txt_acc_acno.Text = data.GetValue(Ac_no).ToString();
    txt_acc_issn.Text = data.GetValue(Issn).ToString();
    txt_acc_isbn.Text = data.GetValue(Isbn).ToString();
    txt_acc_title.Text = data.GetValue(Title).ToString();
    txt_acc_auth.Text = data.GetValue(Author).ToString();
    txt_acc_publisher.Text = data.GetValue(Publisher).ToString();
    txt_acc_edition.Text = data.GetValue(Edition).ToString();
    txt_acc_year.Text = data.GetValue(Year).ToString();
    txt_acc_price.Text = data.GetValue(Price).ToString();
    txt_acc_rack.Text = data.GetValue(Rack_no).ToString();

    con.Close();
}

catch (Exception e1)

{

    MessageBox.Show(e1.Message);

}

我的问题是,当我使用标签显示数据时,显示数据,但文本框不显示数据,而是生成异常“读取器关闭时无效尝试调用MetaData。”

连接字符串是正确的。

显示从数据库中检索的数据(在文本框中)的正确方法是什么。

2 个答案:

答案 0 :(得分:0)

这与您使用数据的内容无关,当您尝试从数据读取器读取值时会发生这种情况,尽管它已经报告过没有更多数据。

Read方法返回一个布尔值,您可以使用它来确定是否有任何数据:

if (data.Read()) {
  // there was a record, you can populate the form
} else {
  // no match for the ac_no, result was empty
}

答案 1 :(得分:0)

在调用GetOrdinal之前,您需要调用Read。