2017-10-18 85 views
-2

所以我写了我的代码,但每次我尝试执行它说“异常未处理System.InvalidOperationException:'填充:SelectCommand.Connection属性尚未初始化。”,它始终显示它在说da .fill伪(DT);如何解决我的代码时说异常未处理?

请告诉我如何解决它

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) 
     { 


     } 
    } 
} 
+0

你看了错误消息,想想它告诉你是错的?你是否使用调试器来发现'con'在抛出异常的情况下明显为空? –

+0

也许你应该尝试初始化SelectCommand的Connection属性。你已经为SqlCommand正确地做了它。 –

回答

-1

您连接尚未在你textBox5文本已更改时被初始化。把它移到你的构造函数中。

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) 
     { 
     } 
    } 
    } 
+0

由于它实现了'IDisposable',所以处理连接是一种很好的做法。 –

+0

同意,但在什么时候? winforms是否有卸载事件?如果是这样,它可以去那里 –

0

您的连接属性不intialised.Click button_click有你的连接intialised.or内Textbox5_textchanged再次别的intialize连接对象检查连接con.Isopen。

1

处理连接对象的最佳做法是将它们存储在本地变量中并尽快处理它们。您不必担心开销和关闭连接的开销;它们实际上是在一个池中管理的,并且非常高效。

您正在将您的连接存储在课程级别,并且未正确处理连接。如果您将其存储在课堂级别,则可能会在两次按钮点击之间超时,并且整个过程占用资源。立即关闭或放置连接,然后将其返回到连接池。

要解决,遵循这种模式:

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; 
       } 
      } 
     } 
0

我觉得你建议立即进行删除首先初始化的连接对象。 你可以用下面的代码更改代码,并请返回结果:

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; 
    } 
相关问题