2011-08-16 40 views
3

这里是我做的代码,它通常工作,但有时会失败(1开出4次以上或以下):如何使用字符串列表作为列表框的DataSource

... 
List<string> _items = new List<string>(); 
... 
using (SqlCeConnection con = new SqlCeConnection(Globals.conString)) 
{ 
    string codbultocomp = null; 
    con.Open(); 
    using (SqlCeCommand cmd = new SqlCeCommand("SELECT codbultocomp FROM envios WHERE [email protected] AND [email protected]", con)) 
    { 
     cmd.Parameters.AddWithValue("@codigodestino", codigoDestino); 
     cmd.Parameters.AddWithValue("@pendiente", "pendiente"); 

     SqlCeDataReader reader = cmd.ExecuteReader(); 

     while (reader.Read()) 
     { 
      codbultocomp = reader["codbultocomp"].ToString(); 
      _items.Add(codbultocomp); 
     } 
     reader.Close(); 
    } 
    listBox1.DataSource = _items; 
} 

当它失败的应用冻结,如果我暂停调试,它会停在最后一个大括号中。我尝试使用try/catch块显示错误,但它没有显示任何内容并停在同一个地方。我也试着看列表框数据源显示在“观察”列表中的这个错误:

Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack. 

任何想法我做错了什么?

+0

这是在后台线程上运行? –

+0

这是一个Windows CE应用程序。应用程序从带有不同选项的菜单开始,此代码来自其中一个选项。当在菜单中选择一个选项时,会出现一个代表该选项的新窗体,并且菜单窗体将保留。 – rfc1484

回答

1

在您的using之后调用它,所有IDisposable对象将在using之后处置。

... 
List<string> _items = new List<string>(); 
... 
using (SqlCeConnection con = new SqlCeConnection(Globals.conString)) 
{ 
    ... 
} 

listBox1.DataSource = _items; 
+0

我改变了它,但问题依然存在。 – rfc1484

+0

@ rfc1484,我建议使用实体框架目前我无法测试您的应用程序,但可能是reader.Close()在这里是错误的,但请参阅http://weblogs.asp.net/scottgu/中的示例实体框架工作用法。 archive/2010/07/16/code-first-development-with-entity-framework-4.aspx,为了防止出现这种情况,你的问题很简单,就是使用EF的linq。 –

0

您只需关闭con对象。无需关闭阅读器。 con对象的使用需要谨慎。休息使用不是必需的。

+0

我认为这不是问题请参阅MSDN示例(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close.aspx#Y600) – saber

+0

无论如何,我再次尝试它纠正和应用程序仍然不时在同一地点冻结。 – rfc1484

+0

@ rfc1484,我没有提出建议,而是要求您简化代码以获得更好的理解和简单性。 – Zenwalker

1

你为什么不尝试这样的事:

对于一个明确的代码创建等的方法:

public List<string> getItems(string codigodestino, string pendiente) 
{ 
    List<string> _items = new List<string>(); 
    SqlCeConnection con = new SqlCeConnection(Globals.conString); 
    string Qyery = "SELECT codbultocomp FROM envios WHERE codigodestino='" + codigodestino + "' AND estado='" + pendiente +"'"; 
    try 
    { 
     con.Open(); 
     SqlCeCommand cmd = new SqlCeCommand(Qyery, con); 
     cmd.CommandType = CommandType.Text; 
     SqlCeDataReader rdr = cmd.ExecuteReader(); 
     while (rdr.Read()) 
     { 
      _items.Add((string)reader["codbultocomp"]); 
     } 
     con.Close(); 
     return _items; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     con.Dispose(); 
     con.Close(); 
    } 
} 

,然后只用:

listBox1.DataSource = getItems(codigoDestino, "pendiente"); 
+0

没有解决问题,但现在看起来更漂亮了。 – rfc1484

相关问题