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 の間で分割せずに、1 つのポイントから呼び出すようにしてください。

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

classのExecuteReader()メソッドは、OleDbCommandclass のオブジェクトを返します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 に答える