0

我正在开发一个将数据插入和删除数据库的程序。数据库只有一张表,有四列(nombreEmpleados、apellidosEmpleados、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);
            }

    }
4

2 回答 2

3

正如我在评论中所说,全局 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
}
于 2013-08-18T17:10:41.750 回答
1

尝试创建一个SqlConnection对象。我不确定您是否在全局范围内执行此操作,然后在将连接传递给SqlCommand后打开连接

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

conn.Open();

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

SqlConnection conn = new SqlConnection("Connection string from config file");
于 2013-08-18T16:29:39.920 回答