1

なぜかMySQL-DBが使えないので、Access DBに切り替えました。

SELECT、UPDATE、INSERT などの単純なクエリを実行するだけの小さな関数が必要でした。

私はこの小さなコードに従いました:

using System.Data.OleDb;
using System.Windows.Forms;
using System.Data;

class Csharp_Access
{
    public void Csharp_Access_Datenbank()
    {
        OleDbConnection con = new OleDbConnection(
        @"Provider=Microsoft.Jet.OLEDB.4.0;
        Data Source=C:\data.mdb");
        con.Open();

        string strSQL = "SELECT * FROM Tabelle1";

        OleDbCommand cmd = new OleDbCommand(strSQL, con);
        OleDbDataReader dr = cmd.ExecuteReader();

        while (dr.Read())
        {
            MessageBox.Show(dr[0].ToString());
        }
        dr.Close();
        con.Close();
        }
    }

コピーして貼り付けるだけで、このコードは完全に機能します。そこで、そのコードを「dbFunctions.cs」に入れることにしました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Xml.Serialization;

namespace AquadoServerTool
{
    class dbFunctions
    {
        /// <summary>
        /// Funktion, um eine Abfrage auszuführen
        /// </summary>
        /// <param name="QueryStr">SQL-String</param>
        /// <returns></returns>
        public static OleDbDataReader QueryString(string QueryStr)
        {
            // string strAccessSelect = "SELECT * FROM seriennummer";

            // Verbindung zur Datenbank aufbauen
            OleDbConnection con = null;
            try
            {
                con = new OleDbConnection(GlobalVar.strAccessConn);
                con.Open();
            }
            catch (Exception)
            {
                return null;
            }

            OleDbCommand cmd = new OleDbCommand(QueryStr, con);
            OleDbDataReader dr = cmd.ExecuteReader();
            // while (dr.Read())
            // {
            //     MessageBox.Show(dr[0].ToString());
            // }

            con.Close();

            return dr;
        }
    }

}

テストのために、それが機能する場合は小さなボタンを作成しました。

    private void button1_Click(object sender, EventArgs e)
    {
        OleDbDataReader dr = dbFunctions.QueryString("SELECT * FROM seriennummer;");

        while (dr.Read())
        {
            MessageBox.Show(dr[1].ToString());
        }
        dr.Close();
    }

ええ、今そのボタンをクリックして忘れてください!しかし、既に閉じられているため、Read() が機能しないというエラーが表示されます。

私のコードは単に間違っているのでしょうか、それとも何かを忘れてしまったのでしょうか?

こんにちは、トロルワット

4

2 に答える 2

2

問題は、最初に接続を閉じてから、から読み取ろうとすることDataReaderです。読み取るには、接続を開いたままにしておく必要があります。


DataReader接続を実装IDisposableして閉じるラッパーを作成できます。

簡単な例:

class Wrapper : IDisposable
{
    public OleDbDataReader Reader { get { return reader; } }
    private OleDbConnection connection;

    public Wrapper(OleDbConnection connection, string QueryStr)
    { 
        this.connection = connection; 
        OleDbCommand cmd = new OleDbCommand(QueryStr, connection);
        OleDbDataReader dr = cmd.ExecuteReader();
    }

    public void Dispose()
    {
        reader.Dispose();
        connection.Dispose();
    }
}

class dbFunctions
{
    public static OleDbDataReader QueryString(string QueryStr)
    {
        OleDbConnection con = new OleDbConnection(GlobalVar.strAccessConn);
        con.Open();
        return new Wrapper(con, QueryStr);
    }
}

使用法:

private void button1_Click(object sender, EventArgs e)
{
    using (var dr = dbFunctions.QueryString("SELECT * FROM seriennummer;"))
        while (dr.Reader.Read())
            MessageBox.Show(dr[1].ToString());
}

別の方法は、 を介してデータを単純に返すことDataTableです。

class dbFunctions
{
    public static DataTable QueryString(string QueryStr)
    {
        var result = new DataTable();
        using(OleDbConnection con = new OleDbConnection(GlobalVar.strAccessConn))
        {
            con.Open();
            using(OleDbCommand cmd = new OleDbCommand(QueryStr, con))
                result.Load(cmd.ExecuteReader());
        }
        return result;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    var data = dbFunctions.QueryString("SELECT * FROM seriennummer;");
    foreach(var row in data.Rows)
        MessageBox.Show(row[1].ToString());
}
于 2012-07-31T11:52:35.627 に答える
0

DataSet代わりに使用DataReader
DataReaderして、そこから読み取るために接続を開く必要があります。

于 2012-07-31T11:55:24.770 に答える