简体   繁体   中英

how to fix my code when it says Exception Unhandled?

So I have written my code but every time i try to execute it it says "exception unhandled System.InvalidOperationException: 'Fill: SelectCommand.Connection property has not been initialized.'" and it always shows it at the line that says da.Fill(dt);

please tell me how to fix it

namespace FairyTailHRSolution
{
    public partial class Form1 : Form
    {
        SqlCommand cmd;
        SqlConnection con;
        SqlDataAdapter da;


        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            con=new SqlConnection(@"Data Source = LAPTOP-VHSGV41H\SQLEXPRESS; Initial Catalog = EmpDB; Integrated Security = True");
            con.Open();
            cmd = new SqlCommand("INSERT INTO FRYEMP (EmployeeID, EmployeeName, EmployeePosition, EmployeeSalary) VALUES (@EmployeeID, @EmployeeName, @EmployeePosition, @EmployeeSalary)", con);
            cmd.Parameters.Add("@EmployeeID", textBox1.Text);
            cmd.Parameters.Add("@EmployeeName", textBox2.Text);
            cmd.Parameters.Add("@EmployeePosition", textBox3.Text);
            cmd.Parameters.Add("@EmployeeSalary", textBox4.Text); 
            cmd.ExecuteNonQuery();


        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void find_Click(object sender, EventArgs e)
        {

        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {


            if(comboBox1.Text == "EmployeeID")
            {
                SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeID like @employeeID", con);
                da.SelectCommand.Parameters.AddWithValue("@employeeID", "%" + textBox5.Text + "%");
                DataTable dt = new DataTable();
                da.Fill(dt);
                dataGridView1.DataSource = dt;
            }

            else if (comboBox1.Text == "EmployeeName")
            {


                SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeName like @employeeName", con);
                da.SelectCommand.Parameters.AddWithValue("@employeeName", "%" + textBox5.Text + "%");
                DataTable dt = new DataTable();
                da.Fill(dt);
                dataGridView1.DataSource = dt;
            }


        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {


        }
    }
}

The best practice for handling connection objects is to store them in a local variable and dispose them as soon as possible. You don't need to worry overhead opening and closing connections; they are actually managed in a pool and it's very efficient.

You are storing your connection at the class level and not handling the connection properly. If you store it at the class level, it could time out between button clicks, and it's taking up resources the whole time. Close or dipose the connection right away, which will return it to the connection pool.

To fix, follow this sort of pattern:

namespace FairyTailHRSolution
{
    public partial class Form1 : Form
    {
        //Get rid of member variable for the connection. Add constant for connection string.
        private const string ConnectionString = @"Data Source = LAPTOP-VHSGV41H\SQLEXPRESS; Initial Catalog = EmpDB; Integrated Security = True";  

        private void button1_Click(object sender, EventArgs e)
        {
            //Use using and use a local variable for the connection
            using (var con=new SqlConnection(this.ConnectionString))
            {
                con.Open();
                var cmd = new SqlCommand("INSERT INTO FRYEMP (EmployeeID, EmployeeName, EmployeePosition, EmployeeSalary) VALUES (@EmployeeID, @EmployeeName, @EmployeePosition, @EmployeeSalary)", con);
                cmd.Parameters.Add("@EmployeeID", textBox1.Text);
                cmd.Parameters.Add("@EmployeeName", textBox2.Text);
                cmd.Parameters.Add("@EmployeePosition", textBox3.Text);
                cmd.Parameters.Add("@EmployeeSalary", textBox4.Text); 
                cmd.ExecuteNonQuery();
            }
        }


        private void textBox5_TextChanged(object sender, EventArgs e)
        {
            if(comboBox1.Text == "EmployeeID")
            {
                //Create a new connection each time you need one
                using (var con = new SqlConnection(this.ConnectionString))
                {
                    con.Open();
                    SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeID like @employeeID", con);
                    da.SelectCommand.Parameters.AddWithValue("@employeeID", "%" + textBox5.Text + "%");
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    dataGridView1.DataSource = dt;
                }
            }
            else if (comboBox1.Text == "EmployeeName")
            {
                using (var con = new SqlConnection(this.ConnectionString))
                {
                    con.Open();
                    SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeName like @employeeName", con);
                    da.SelectCommand.Parameters.AddWithValue("@employeeName", "%" + textBox5.Text + "%");
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    dataGridView1.DataSource = dt;
                }
            }
        }

您的连接属性未初始化。单击 button_click 以初始化您的连接。或在 Textbox5_textchanged 内部检查连接 con.Isopen 否则再次初始化连接对象。

I think you shoul initialize connection object first of all. You can change your code with the below code and pls return result:

private void textBox5_TextChanged(object sender, EventArgs e)
  {
    if(con == null)
    {
        con=new SqlConnection(@"Data Source = LAPTOP-VHSGV41H\SQLEXPRESS; Initial Catalog = EmpDB; Integrated Security = True");
    }
    if(con.State == ConnectionState.Closed)
    {
        con.Open();
    }

    SqlDataAdapter da = null;       
    DataTable dt = new DataTable();
    if(comboBox1.Text == "EmployeeID")
    {
        da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeID like @employeeID", con);
        da.SelectCommand.Parameters.AddWithValue("@employeeID", "%" + textBox5.Text + "%");
        da.Fill(dt);
    }
    else if (comboBox1.Text == "EmployeeName")
    {
        da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeName like @employeeName", con);
        da.SelectCommand.Parameters.AddWithValue("@employeeName", "%" + textBox5.Text + "%");
        da.Fill(dt);
    }
    else
    {

    }

    dataGridView1.DataSource = dt;
  }

Your connection has not been initialized at the time you're textBox5 text has changed. Move it to your constructor.

namespace FairyTailHRSolution
{
    public partial class Form1 : Form
    {
        SqlCommand cmd;
        SqlConnection con;
        SqlDataAdapter da;


        public Form1()
        {
            InitializeComponent();
            con=new SqlConnection(@"Data Source = LAPTOP-VHSGV41H\SQLEXPRESS; Initial Catalog = EmpDB; Integrated Security = True");
            con.Open();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            cmd = new SqlCommand("INSERT INTO FRYEMP (EmployeeID, EmployeeName, EmployeePosition, EmployeeSalary) VALUES (@EmployeeID, @EmployeeName, @EmployeePosition, @EmployeeSalary)", con);
            cmd.Parameters.Add("@EmployeeID", textBox1.Text);
            cmd.Parameters.Add("@EmployeeName", textBox2.Text);
            cmd.Parameters.Add("@EmployeePosition", textBox3.Text);
            cmd.Parameters.Add("@EmployeeSalary", textBox4.Text); 
            cmd.ExecuteNonQuery();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
        }

        private void label1_Click(object sender, EventArgs e)
        {
        }

        private void label2_Click(object sender, EventArgs e)
        {
        }

        private void find_Click(object sender, EventArgs e)
        {
        }

        private void textBox5_TextChanged(object sender, EventArgs e)
        {
            if(comboBox1.Text == "EmployeeID")
            {
                SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeID like @employeeID", con);
                da.SelectCommand.Parameters.AddWithValue("@employeeID", "%" + textBox5.Text + "%");
                DataTable dt = new DataTable();
                da.Fill(dt);
                dataGridView1.DataSource = dt;
            }

            else if (comboBox1.Text == "EmployeeName")
            {
                SqlDataAdapter da = new SqlDataAdapter("SELECT EmployeeID, EmployeeName,EmployeePosition, EmployeeSalary FROM FRYEMP where EmployeeName like @employeeName", con);
                da.SelectCommand.Parameters.AddWithValue("@employeeName", "%" + textBox5.Text + "%");
                DataTable dt = new DataTable();
                da.Fill(dt);
                dataGridView1.DataSource = dt;
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
        }
    }
   }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM