【问题标题】:The connection inside function not called [closed]未调用内部函数的连接[关闭]
【发布时间】:2012-07-06 07:51:35
【问题描述】:

这是我的 sn-p,请帮助我为什么 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

【问题讨论】:

  • 请在问题本身中提供示例。
  • 你试过什么?您是否已将事件处理程序分配给按钮单击事件?
  • 您在加载表单时处理连接。除此之外,您的代码还有更多问题。请在此处粘贴代码
  • 您在con.open() 上遇到任何错误吗??请提一下。
  • 下次在这里添加您的代码示例!

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


【解决方案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 中包含代码的主要部分并不难。

【讨论】:

  • 是的,所以你想让我重新定义函数内部的 con 吗?/
  • @user1386579,是的,我猜这个属性会在某个地方设置为 null 或空。代码很大,我没仔细看。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    首先,您不应该以您的方式初始化您的con 对象。每次你用完它并打电话给Dispose,你都会毁掉它。在任何情况下,直到下次您的 Form1 类初始化时才会重建它。这可能就是您收到错误的原因。

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

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

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

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

    【讨论】:

    • 谢谢,我很抱歉,下次会发布更好的问题,我有点着急
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多