2011-08-16 73 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

相關問題