【问题标题】:C# - ExecuteNonQuery requires an open and available Connection. The connection's current state is closedC# - ExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态为关闭
【发布时间】:2012-12-26 19:18:58
【问题描述】:

我是 C# 新手。 请帮忙!

我一直遇到以下错误:“ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态为关闭。” 我也无法插入到我的数据库中。

下面是我的代码:

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 AzureSecureStore
{
    public partial class Client : Form
    {
        OleDbConnection vcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\SB18\Documents\Visual Studio 2010\Projects\AzureSecureStore\AzureSecureStore\AzcureSecureStore Database.accdb; Persist Security Info=False;");
        //OleDbConnection vcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\SB18\Documents\Visual Studio 2010\Projects\AzureSecureStore\AzureSecureStore\AzcureSecureStore Database.accdb");
        public Client()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void button5_Click(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {

        }

        private void Client_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'azcureSecureStore_DatabaseDataSet5.Client' table. You can move, or remove it, as needed.
            this.clientTableAdapter.Fill(this.azcureSecureStore_DatabaseDataSet5.Client);
            // TODO: This line of code loads data into the 'azcureSecureStore_DatabaseDataSet2.Client' table. You can move, or remove it, as needed.
            //this.clientTableAdapter.Fill(this.azcureSecureStore_DatabaseDataSet2.Client);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            string ab = string.Format("insert into Client values({0}, '{1}', '{2}', {3}, {4}, '{5}')",
    textBox1.Text, textBox2.Text, int.Parse(textBox3.Text), int.Parse(textBox4.Text), textBox9.Text, int.Parse(textBox10.Text));
            OleDbCommand vcom = new OleDbCommand(ab, vcon);
            vcom.ExecuteNonQuery();
            MessageBox.Show("Data stored successfully");
            vcom.Dispose();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

【问题讨论】:

    标签: c# .net sql ms-access


    【解决方案1】:

    你忘记打开连接了,

    vcon.Open();
    vcom.ExecuteNonQuery();
    

    但记得使用

    • using 声明——正确处理对象
    • try-catch block -- 正确捕获异常(异常处理

    更新 1

    string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\SB18\Documents\Visual Studio 2010\Projects\AzureSecureStore\AzureSecureStore\AzcureSecureStore Database.accdb; Persist Security Info=False;";
    string query = "INSERT INTO Client VALUES(@col1,@col2,@col3,@col4,@col5,@col6)";
    using (OleDbConnection conn = new OleDbConnection(connStr))
    {
        using (OleDbCommand comm = new OleDbCommand())
        {
            comm.Connection = conn;
            comm.CommandText = query;
            comm.CommandType = CommandType.Text;
            comm.Parameters.AddWithValue("@col1", textBox1.Text);
            comm.Parameters.AddWithValue("@col2", textBox2.Text);
            comm.Parameters.AddWithValue("@col3", int.Parse(textBox3.Text));
            comm.Parameters.AddWithValue("@col4", int.Parse(textBox4.Text));
            comm.Parameters.AddWithValue("@col5", textBox9.Text);
            comm.Parameters.AddWithValue("@col6", int.Parse(textBox10.Text));
            try
            {
                conn.Open();
                comm.ExecuteNonQuery();
                MessageBox.Show("Data stored successfully");
            }
            catch(OleDbException e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }
    

    【讨论】:

    • 嗨,我做了你提到的,但我收到以下错误:“OleDbException 未处理。”没有为一个或多个参数指定值。我该怎么办?
    • 嗯,我做了更改。但是数据仍然不会进入我的数据库。不完全是一个错误,但是当我单击插入时我得到以下弹出窗口:“Systems.Windows.Forms.MouseEventArgs”
    • 代码可以自行运行。尝试将其放入方法中并调用该方法。
    • @user1971823 - 听起来你在catch 子句中调用了错误的变量ToString() - 它应该是对上面两行异常的引用。您可能不得不更改该引用,因为此答案中的示例使用 e,但 e 是您函数的第二个参数。
    【解决方案2】:

    要连接数据库,您需要打开连接 所以用

    vcon.Open();
    

    然后

    vcom.ExecuteNonQuery();
    

    【讨论】:

    • 嗨,我做了你提到的,但我收到以下错误:“OleDbException 未处理。”没有为一个或多个参数指定值。我该怎么办?
    猜你喜欢
    • 2011-04-02
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多