函数内部没有调用连接

时间:2012-07-06 07:51:36

标签: c# forms ado.net database-connection connection-string

这是我的片段,请帮我解释为什么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();


        }

    }
}

link

3 个答案:

答案 0 :(得分: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中包含代码的主要部分并不难。

答案 1 :(得分:0)

创建表单时会创建连接对象。您在Form_Load方法中打开,使用,关闭和DISPOSE连接对象。因此,在按钮单击处理程序开始执行时,连接对象就消失了。

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

答案 2 :(得分:0)

真的难以解码您的实际问题是什么,导致它的原因等等,但您的代码存在许多问题。

首先,您不应该按照自己的方式初始化con对象。每次使用完并调用Dispose后,您都会销毁它。在任何情况下,直到下次初始化Form1类时才会重建它。这可能就是你收到错误的原因。

建议使用一个处理连接的单例。这引出了下一点:在循环中打开新连接是一个非常糟糕的主意。如果您已正确连接handeler,则每次调用只需打开一个连接。我会给你更好的表现,如果你有许多元素要迭代,你会注意到。

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

中键入奇怪的查询

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

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