-4

这是我的片段,请帮助我为什么 con.open 在函数 tabledel 中不起作用

一旦我按下按钮,我想删除表,第一次打开连接,但在函数 tabledel 内第二次无法打开它

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 方法中打开、使用、关闭和 DISPOSE 连接对象。因此,当您的按钮单击处理程序开始执行时,连接对象就消失了。

您必须在按钮单击处理程序中创建一个新的连接对象,或者不在 Form_Load 方法中处理它。

于 2012-07-06T08:08:04.223 回答
0

真的很难解码你的实际问题是什么,是什么导致它等等,但是你的代码有很多问题。

首先,您不应该以您的方式初始化con对象。每次你用完它并调用它Dispose,你都会销毁它。无论如何,直到下次Form1初始化您的类时才会重建它。这可能就是您收到错误的原因。

一个建议是有一个单例来处理您的连接。这将我引向下一点:在循环中打开新连接是一个非常糟糕的主意。如果您正确地制作了连接处理程序,则每次调用只需打开一个连接。我会给你更好的性能,如果你有很多元素需要迭代,你会注意到这一点。

接下来,您的删除语句会受到 SQL 注入的影响。您应该强烈考虑使用一种将用户输入最小化以从列表中进行选择的方式,这样他们就无法在您的textBox1.Text

这只是其中的一部分。我希望你能使用它。

哦,拜托,请写一个更好的问题。不要只是说“呃,有些东西不起作用。链接”。压缩您的代码并考虑您的要求,以确保它会被广泛理解。

于 2012-07-06T08:08:16.740 回答