0

我创建了一个 C# 应用程序并集成了一个 Access DB(带有 3 个填充表)。

现在我尝试从 Access DB 表中获取数据以将其显示在 TextBox 中,但什么都看不到。

先感谢您。

更新:命名空间-->using System.Data.OleDb;

这是代码:

    OleDbDataReader myReader;
    OleDbConnection myCon;
    OleDbCommand myQuery;

    public Form1()
    {
        InitializeComponent();
        myCon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\UserName\\Desktop\\MyClubAdministration\\MyClubAdministrationDB.accdb;Persist Security Info=False;");
        myCon.Open();
        myQuery = new OleDbCommand("select * from Lid, Lidgeld, Lidmaatschap", myCon);
        myReader = myQuery.ExecuteReader();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.Text = myReader.GetInt32(0).ToString();
    }
4

2 回答 2

1

您需要在 OleDBDataReader 上的 GetInt32 之前阅读

private void Form1_Load(object sender, EventArgs e)     
{         
    myReader.Read();
    textBox1.Text = myReader.GetInt32(0).ToString();     
} 

然而,这段代码很容易出错。
尝试将数据库操作隔离在私有方法中,并仅从一个点调用,而无需在构造函数和 form_load 之间进行拆分。

private void ReadFromDB()
{
    using(OleDbConnection myCon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\UserName\\Desktop\\MyClubAdministration\\MyClubAdministrationDB.accdb;Persist Security Info=False;"))
    {
         myCon.Open();             
         OleDbCommand myQuery = new OleDbCommand("select * from Lid, Lidgeld, Lidmaatschap", myCon);
         OleDbDataReader myReader = myQuery.ExecuteReader();
         if(myReader.HasRows)
         {
              myReader.Read();
              textBox1.Text = myReader.GetInt32(0).ToString();
         }
    }
}

在 InitializeComponent() 之后调用该方法;

作为旁注,我将避免数据库操作的全局变量。使用连接池,打开和重新打开连接的性能成本非常低,而清理房屋的复杂性呈指数级增长。

于 2012-06-13T12:40:01.937 回答
1

类的ExecuteReader()方法OleDbCommand返回一个类的对象OleDbDataReader。当OleDbDataReader对象第一次返回给您时,它处于“未定位”状态——也就是说,它没有定位到数据集中的任何记录。您必须调用Read()ob 对象以将其定位到集合中的下一条记录。你的Load()方法应该如下:

private void Form1_Load(object sender, EventArgs e)
{
    if(myReader.HasRows == true)
    {
        myReader.Read();
        textBox1.Text = myReader.GetInt32(0).ToString();
    }
} 

调用 的HasRows属性OleDbDataReader是为了确保在进行定位之前,数据集中实际上有记录。

为了更加小心,您可以null在尝试使用数据库值之前检查您感兴趣的字段:

private void Form1_Load(object sender, EventArgs e)
{
    if(myReader.HasRows == true)
    {
        myReader.Read();
        if(myReader.IsDBNull(0) == false)
            textBox1.Text = myReader.GetInt32(0).ToString();
    }
}
于 2012-06-13T12:46:34.650 回答