-4

これは私のスニペットです。関数 tabledel 内で con .open が機能しない理由を教えてください

ボタンを押したらテーブルを削除したいのですが、最初は接続が開かれますが、関数 tabledel 内で 2 回目は開くことができませんでした。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace WFA_CREATE_DELETE
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        OleDbConnection con = new OleDbConnection(@"PROVIDER=Microsoft.ACE.OLEDB.12.0; Data Source=C:/Users/Dinesh/Documents/Database3.accdb");
        OleDbDataAdapter ea = new OleDbDataAdapter();
        DataSet dsl;
        DataSet esl;

        private void Form1_Load(object sender, EventArgs e)
        {
            OleDbDataAdapter da = new OleDbDataAdapter();
            dsl = new DataSet();
            con.Open();

            DataTable table2 = con.GetSchema("tables");

            MessageBox.Show("Database Open");

            dataGridView1.DataSource = table2;

            con.Close();
            con.Dispose();
        }

        public void Tabledel()
        {
            int a = 0, d = 0, count, itr;

            count = dataGridView1.RowCount;
            itr = dataGridView1.ColumnCount;

            while (a < count)
            {
                for (d = 0; d < itr; d++)
                {
                    if (dataGridView1.Rows[a].Cells[d].Value.ToString() == textBox1.Text)
                    {

                        MessageBox.Show("table exists");
                        esl = new DataSet();
                        string vsql = "drop table '" + textBox1.Text + "'";
                        ea = new System.Data.OleDb.OleDbDataAdapter(vsql, con);
                        OleDbCommand cmdea = new OleDbCommand(vsql, con);
                        //cmdea.Connection = con;

                        con.Open();
                        cmdea.ExecuteNonQuery();
                        MessageBox.Show("table dropped");
                        con.Close();
                        con.Dispose();
                    }
                }

                a++;
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        public void button1_Click(object sender, EventArgs e)
        {
           Tabledel();


        }

    }
}

リンク

4

3 に答える 3

1

ご覧のとおり、次のエラーが表示されます。

The ConnectionString property has not been initialized.

接続を別の場所 (フォーム クラスのグローバル変数を除く) で作成 (破棄) する可能性があるため、接続文字列を明示的に設定することをお勧めします (接続を再作成する):

con = new OleDbConnection(
      @"PROVIDER=Microsoft.ACE.OLEDB.12.0; Data Source=C:/Users/Dinesh/Documents/Database3.accdb");

con.Open();

とにかく、コードの主要部分を SO に含めるのは難しくありませんでした。

于 2012-07-06T08:00:16.450 に答える
0

フォームが作成されると、接続オブジェクトが作成されます。Form_Loadメソッドで接続オブジェクトを開き、使用し、閉じて、破棄します。したがって、ボタンクリックハンドラーの実行が開始されるまでに、接続オブジェクトは失われます。

ボタンクリックハンドラーで新しい接続オブジェクトを作成するか、Form_Loadメソッドで破棄しないようにする必要があります。

于 2012-07-06T08:08:04.223 に答える
0

実際の問題が何であるか、何が原因であるかなどをデコードするのは本当に難しいですが、コードには多くの問題があります。

まず、conオブジェクトを自分のやり方で初期化するべきではありません。あなたがそれを使い終わって電話をかけるたびにDispose、あなたはそれを破壊するでしょう。いずれの場合も、次にForm1クラスが初期化されるまで再構築されません。おそらくそれがエラーが発生している理由です。

接続を処理するシングルトンを用意することをお勧めします。これは私を次のポイントに導きます:ループ内で新しい接続を開くことは非常に悪い考えです。接続ハンデラーを適切に作成した場合は、呼び出しごとに1つの接続を開くだけで済みます。非常に優れたパフォーマンスを提供します。これは、反復する要素が多数ある場合に気付くでしょう。

次に、deleteステートメントはSQLインジェクションの対象になります。リストから選択するためのユーザー入力を最小限に抑えて、ユーザーが奇妙なクエリを入力できないようにする方法を使用することを強く検討する必要があります。textBox1.Text

それはほんの一部です..あなたがそれを使用できることを願っています。

ああ、お願いします、もっと良い質問を書いてください。「ええと、何かがうまくいかない。リンク」とだけ言ってはいけません。コードを要約し、コードが広く理解されるように、何を求めているかを考えてください。

于 2012-07-06T08:08:16.740 に答える