2014-10-29 124 views
1

填充:SelectCommand.Connection属性尚未初始化。我已经完成了按钮点击的编码。康恩是我的连接类的对象。我在按钮点击类中调用了这个连接类。让我知道它为什么显示错误?我已经在堆栈溢出中搜索了这个问题的答案,并且我应用了它,即使它显示了相同的错误。 ddcode.selectedItem.Text是选择员工姓名的下拉菜单。如何初始化c#中的SelectCommand.Connection属性?

string strQuery = "SELECT MachID, EmpCode, FROM LeaveApply where MachID='" + ddcode.SelectedItem.Text + "'",conn; 
SqlCommand cmd = new SqlCommand(strQuery); 
SqlDataAdapter sda = new SqlDataAdapter(cmd); 
DataTable dt = new DataTable(); 
sda.Fill(dt); 

看看是我的连接类

public Connection() 
    { 

     conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString); 
     cmd = null; 
    } 

而且我已经叫我按一下按钮函数的类此连接类像

Connection conn = new Connection(); 

回答

2

没有意义,真正创建一个SqlCommand对象,因为SqlDataAdapter会为你做。事实上,它甚至可以为你创建SqlConnection对象。如果您需要重用的连接,那么这样做:

using (var connection = new SqlConnection(connectionString)) 
using (var adapter = new SqlDataAdapter(query, connection)) 
{ 
    adapter.SelectCommand.Parameters.AddWithValue(paramName, paramValue); 
    // ... 
} 

,如果你不需要重用连接,然后做到这一点:

using (var adapter = new SqlDataAdapter(query, connectionString)) 
{ 
    adapter.SelectCommand.Parameters.AddWithValue(paramName, paramValue); 
    // ... 
} 

如果你真的想创建一个单独的SqlCommand那么这样做:

using (var connection = new SqlConnection(connectionString)) 
using (var command = new SqlCommand(query, connection)) 
using (var adapter = new SqlDataAdapter(command)) 
{ 
    command.Parameters.AddWithValue(paramName, paramValue); 
    // ... 
} 
0

我会建议使用连接对象的CreateCommand工厂方法来创建你的命令,那么你的命令对象将正确地使用connectio n对象。

 SqlConnection conn = new SqlConnection("ConnectionString"); 
    conn.Open(); // Make sure connection is open. 

    string strQuery = "SELECT MachID, EmpCode, FROM LeaveApply where MachID='" + selectedItem + "'"; 

    SqlCommand cmd = conn.CreateCommand(); 
    cmd.CommandText = strQuery; 

    SqlDataAdapter sda = new SqlDataAdapter(cmd); 
    DataTable dt = new DataTable(); 
    sda.Fill(dt); 

另外,您也可以手动告诉命令使用的连接对象

cmd.Connection = conn; 

这听起来像jmcilhinney有但是你的目的,更好的答案。

0

您错过了与数据库的连接。该连接将执行以下作业。

  1. 使用提供的连接字符串创建到数据库的连接。
  2. 打开连接桥来处理数据。
  3. 执行提供的查询或存储过程。
  4. 将数据填充到应用程序内存中
  5. 关闭连接桥以阻止数据库。

使用您自己的连接类的对象。 请尝试如下:

using (Connection Con = new Connection()) { 
    SqlCommand cmd = new SqlCommand(strQuery); 
    cmd.Connection = Con; 

    SqlDataAdapter sda = new SqlDataAdapter(cmd); 

    try { 
     Con.Open();    
     sda.SelectCommand = cmd; 
     sda.Fill(dt); 
     Con.Close(); 
    } catch (Exception ex) { 
} 
+0

我在我的问题中提到我有一个单独的连接类。我只是用我的所有形式为这个班级创建一个对象。在这个按钮中点击类也为我的连接类创建了对象。所以我想再次没有必要写按钮点击连接类。 – 2014-10-29 06:16:54

+0

但你**不应该**调用'cmd.ExecuteNonQuery()'和'sda。填充(dt);' - 这实际上会执行语句**两次** ....做一个或另一个 - 但不是两个! – 2014-10-29 06:19:28

+0

请在调用填充方法之前,由Con.Open()打开连接,以显示您的完整代码。 @marc_s即使在我的专业实践中,我也很难不注意到它。感谢更新我的知识。 – Ammar 2014-10-29 06:25:55

相关问题