0

追加する行が 30 行未満の場合、私のコードはうまく機能します。しかし、それ以上は扱えません。どうすればこれを克服できますか?

次のエラーが表示されます: Unspecified error30 未満を追加しようとすると、すべての行が追加されます。30を超えて追加しようとすると、何も追加されず、行数のエラーが発生します。

コードは次のとおりです。

                    for (int i = 0; i < st1.Length; i++)
                {
                    UpdateDataBase(st1[i]);
                }

private void UpdateDataBase(char letter)
    {
        letter = char.ToUpper(letter);
        int serialPro = 0;
        string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                                  "Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb";
        OleDbConnection connection = new OleDbConnection(connectionString);

        string sql = "SELECT tblProInfo.proInfoSerialNum FROM tblProInfo ";
        OleDbCommand command = new OleDbCommand(sql, connection);
        try
        {
        connection.Open();
        OleDbDataReader reader = command.ExecuteReader();
        //get the last!
        while (reader.Read())
            serialPro = reader.GetInt32(reader.Depth);


        sql = "INSERT INTO tblOrderAA (orderAASerialPro, orderAACodon1) "
           + " values (?, ?)";
        OleDbCommand command2 = new OleDbCommand(sql, connection);

        command2.CommandType = CommandType.Text;
        command2.Parameters.AddWithValue("orderAASerialPro", serialPro);
        command2.Parameters.AddWithValue("orderAACodon1", letter);
        command2.ExecuteNonQuery();
            }
        catch (Exception e)
        {
            MessageBox.Show("אירעה שגיאה ב: \n" + e.Message);
            this.Close();
        }
    }`

編集: プライベート void UpdateDataBase(char 文字) { 文字 = char.ToUpper(文字); int serialPro = 0; string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "データソース=C:\Projects_2012\Project_Noam\Access\myProject.accdb";

        try
        {
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();

                string sql = "SELECT tblProInfo.proInfoSerialNum FROM tblProInfo ";
                using (OleDbCommand command = new OleDbCommand(sql, connection))
                using (OleDbDataReader reader = command.ExecuteReader())
                {
                    //get the last!
                    while (reader.Read())
                        serialPro = reader.GetInt32(0);
                }

                sql = "INSERT INTO tblOrderAA (orderAASerialPro, orderAACodon1) "
       + " values (?, ?)";
                using (OleDbCommand command2 = new OleDbCommand(sql, connection))
                {
                    command2.CommandType = CommandType.Text;
                    command2.Parameters.AddWithValue("orderAASerialPro", serialPro);
                    command2.Parameters.AddWithValue("orderAACodon1", letter);
                    command2.ExecuteNonQuery();
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("אירעה שגיאה ב: \n" + e.Message);
        }
    }
enter code here
4

3 に答える 3

1

よくわかりませんが、あなたの OleDbConnection は決して閉じられません接続の終了と破棄を保証するステートメントを
試してくださいusing

using(OleDbConnection connection = new OleDbConnection(connectionString))
{
    string sql = "SELECT tblProInfo.proInfoSerialNum FROM tblProInfo ";         
    OleDbCommand command = new OleDbCommand(sql, connection);         
    try 
    {
     ......
    }
    catch(....)
}

また、この行の意図が明確ではありません

serialPro = reader.GetInt32(reader.Depth); 

GetInt32は必要な列の序数である int を受け取り、reader.Depthは現在の行のネストの深さを示す値を取得します。
2 つの値がどのように関連しているかがわかりません。

編集:シリアル番号の最大値を探している場合は、この方法でコードを変更できます

string sql = "SELECT MAX(proInfoSerialNum) AS maxSN FROM tblProInfo ";                 
using (OleDbCommand command = new OleDbCommand(sql, connection))                 
{                     
    serialPro = (int)command.ExecuteScalar();                 
} 
于 2012-05-21T08:53:22.597 に答える
0
    void dataread()
    {
        query = "select * from nodes";
        cmd = new SqlCommand(query, con);
        dr = cmd.ExecuteReader();
        while (dr.Read())
        {

            comboBox1.Items.Add(dr[0].ToString());
        }
        dr.Close();
        cmd.Dispose();

    }
于 2012-06-02T11:22:50.513 に答える
0

完了したら、データベース接続を閉じることから始めると、より良い結果が得られる場合があります。usingこれを行うには、次のステートメントを使用します。

using (OleDbConnection connection = new OleDbConnection(connectionString))
{
    ...
}

このusingステートメントは、IDisposableインターフェイスを実装するオブジェクトに対して、Disposeメソッドが呼び出されることを確認します。

また、作成中のリーダーは常に開いたままです。したがって、最終的に書き直すと、メソッドは次のようになります。

private void UpdateDataBase(char letter)
{
    letter = char.ToUpper(letter);
    int serialPro = 0;
    string connectionString = "...";

    try
    {
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            connection.Open();

            string sql = "SELECT tblProInfo.proInfoSerialNum FROM tblProInfo ";
            using (OleDbCommand command = new OleDbCommand(sql, connection))
            using (OleDbDataReader reader = command.ExecuteReader())
            {
                //get the last!
                while (reader.Read())
                    serialPro = reader.GetInt32(reader.Depth);
            }

            sql = "INSERT INTO ...";
            using (OleDbCommand command2 = new OleDbCommand(sql, connection))
            {
                command2.CommandType = CommandType.Text;
                command2.Parameters.AddWithValue("orderAASerialPro", serialPro);
                command2.Parameters.AddWithValue("orderAACodon1", letter);
                command2.ExecuteNonQuery();
            }
        }
    }
    catch (Exception e)
    {
        MessageBox.Show("אירעה שגיאה ב: \n" + e.Message);
    }
}

スピードアップするには: 呼び出しごとにすべてのシリアル番号を選択し、リーダーを繰り返し処理して最新のものを取得します。この作業をデータベースに入れるために使用できるインデックスはありますか? のように: 日付で注文するか、選択しますMAX(proInfoSerialNum)か? そうしないと、データベースにシリアル番号が増えると、ソフトウェアの速度が大幅に低下します。

于 2012-05-21T08:52:54.110 に答える