可以';由于以下错误,无法保存记录两次: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);
}
}
正如我在评论中所说,全局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");