可以';由于以下错误,无法保存记录两次:Connection属性尚未初始化

本文关键字:两次 Connection 初始化 属性 记录 保存 错误 可以 | 更新日期: 2023-09-27 18:28:01

我正在开发一个将数据插入和删除到数据库中的程序。该数据库只有一个包含四列的表(nombreEmpreados、apellidosPempreados、departamento和carnet)。该程序有4个按钮,保存、删除、显示和关闭,问题是当我第一次单击显示或保存时,程序可以工作,但当我再次单击时,我会收到以下错误:连接字符串属性尚未初始化

编辑 *这是从开始到保存按钮的代码:*

namespace sampleAdonetWinforms
{
public partial class Form1 : Form
{
    SqlConnection conn = new SqlConnection("Data Source=MAINPC;Initial Catalog=Ambar;Integrated Security=True");
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
    }
    private void button3_Click(object sender, EventArgs e)
    {
        this.Close();
    }
    private void button2_Click(object sender, EventArgs e)
    {
        formBorrar ventanaBorrar = new formBorrar();
        ventanaBorrar.ShowDialog();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        string query = "INSERT INTO empleados VALUES (@Nombre, @Apellidos, @Departamento, @Carnet)";
        SqlCommand vCom = new SqlCommand(query, conn);
        int carnetID = int.Parse(tbCarnet.Text);
            try
            {
                vCom.Parameters.AddWithValue("@Nombre", tbNombre.Text);
                vCom.Parameters.AddWithValue("@Apellidos", tbApellidos.Text);
                vCom.Parameters.AddWithValue("@Departamento", tbDepartamento.Text);
                vCom.Parameters.AddWithValue("@Carnet", carnetID);
                tbNombre.Focus();
                conn.Open();
                vCom.ExecuteNonQuery();
                vCom.Dispose();
                MessageBox.Show("Data stored");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error " + ex.Message);
            }
    }

可以';由于以下错误,无法保存记录两次:Connection属性尚未初始化

正如我在评论中所说,全局SqlConnection对象可能是问题的根源
从您的代码来看,这并不明显,但第二段中的某些内容没有按预期工作,全局连接对象也没有正确初始化
保留连接对象的全局实例是一种糟糕的做法,因为您可能会对该实例的生存期失去控制,并且宝贵的非托管资源不会释放到系统中
要解决这类问题,需要连接池基础设施
连接池有助于实现编码模式,其中编码器应尽快释放连接。

所以我建议更改您的代码以利用这种模式

private void button1_Click(object sender, EventArgs e)
{
    // INITIALIZE 
    using(SqlConnection conn = new SqlConnection("......"))
    {
         // OPEN
         conn.Open();
         string query = "INSERT INTO empleados VALUES (@Nombre, @Apellidos, @Departamento, @Carnet)";
         // USE
         using(SqlCommand vCom = new SqlCommand(query, conn))
         {
             ....
         }
    } // <- CLOSE & DISPOSE
}

尝试创建一个SqlConnection对象。我不确定你是否在全局范围内这样做,然后在将其传递给SqlCommand 后打开连接

 string query = "INSERT INTO empleados VALUES (@Nombre, @Apellidos, @Departamento, @Carnet)";
        SqlCommand vCom = new SqlCommand(query, conn);
conn.Open();

在将conn传递给SqlCommand对象之前,必须像这样创建conn

SqlConnection conn = new SqlConnection("Connection string from config file");