2013-06-21 68 views
0

我已經遇到了以下錯誤:連接的當前狀態是打開錯誤

The Connection was not closed. The Connection's current state is open Invalid attempt to call MetaData when reader is closed.

我嘗試這樣做:

while(dr.Read()){//and set value} 

,但它不工作。這是如何在其他一些可行的形式中完成的。

當我在我的應用程序中按Enter鍵時運行此代碼。當我第一次按下它時,會顯示錯誤信息,但是當我再次按Enter時,使用相同的數據,它會起作用。

try 
{ 
    SqlCommand cmd = new SqlCommand("selectknittingdaily", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@m_id", SqlDbType.Int).Value = Convert.ToInt32(txt_id.Text); 
    con.Open(); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    dr.Read(); 
    if (dr.HasRows) 
    { 
     dateTimePicker1.Text = dr[0].ToString(); 
     textBox1.Text = dr[1].ToString(); 
     machineno_combo.Text = dr[2].ToString(); 
     guage_combo.Text = dr[3].ToString(); 
     gsm_combo.Text = dr[4].ToString(); 
     count_combo.Text = dr[5].ToString(); 
     color_combo.Text = dr[6].ToString(); 
     supplier_combo.Text = dr[7].ToString(); 
     txt_rollsfrom.Text = dr[8].ToString(); 
     txt_rollsto.Text = dr[9].ToString(); 
     txt_rolls.Text = dr[10].ToString(); 
     txt_totalweight.Text = dr[11].ToString(); 
     quality_combo.Text = dr[12].ToString(); 
     txt_cotton.Text = dr[13].ToString(); 
     txt_polyster.Text = dr[14].ToString(); 
     txt_elasthan.Text = dr[15].ToString(); 
     txt_modal.Text = dr[16].ToString(); 
     txt_tensil.Text = dr[17].ToString(); 
     txt_organic.Text = dr[18].ToString(); 
     border_combo.Text = dr[19].ToString(); 
    } 
    dr.Close(); 
    //con.Close(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
finally 
{ 
    con.Close(); 
} 

Here Is My Sql Stored Procedure

create proc selectknittingdaily 
@m_id int 
as 
begin 
select master_knittingdaily.date2,master_order.program_no,machine.machine_no,machine.guage, 
machine.gsm,yarn.yarn_count,(select color.color_no from yarn LEFT JOIN color on yarn.color_id=color.color_id 
where yarn.yarn_id=(select yarn_id from master_knittingdaily where [email protected]_id)) 
,(select supplier_knitting.supplier_name from yarn LEFT JOIN supplier_knitting on 
yarn.supplier_id=supplier_knitting.supplier_id 
where yarn.yarn_id=(select yarn_id from master_knittingdaily where [email protected]_id)) 
,master_knittingdaily.rolls_from, 
master_knittingdaily.rolls_to,master_knittingdaily.total_rolls,master_knittingdaily.total_weight, 
quality_knitting.quality_code,quality_knitting.cotton,quality_knitting.polyster,quality_knitting.elasthan, 
quality_knitting.modal,quality_knitting.tensil,quality_knitting.organic,master_knittingdaily.border 
from master_knittingdaily 
LEFT JOIN master_order on master_knittingdaily.order_id=master_order.order_id 
LEFT JOIN machine on master_knittingdaily.machine_id=machine.machine_id 
LEFT JOIN yarn on master_knittingdaily.yarn_id=yarn.yarn_id 
LEFT JOIN quality_knitting on master_knittingdaily.quality_id=quality_knitting.quality_id 
where [email protected]_id 
end 
+1

請,張貼堆棧跟蹤。或者至少向我們展示引發錯誤的行。 –

+0

這向我強烈建議您試圖跨多個方法共享單個連接對象。不要這樣做。在每個需要連接的地方創建一個新的連接對象比較安全,打開它,使用它並關閉它。讓框架執行連接池魔術並在後臺維護正確數量的實際連接。 –

+0

現在看到我的過程 – user2491383

回答

0

My Problem is solve now because i can replace SqlDataReader to DataTable and connection error also fix thx for giving ur ideas but still is question y SqlDataReader not work

0

只要插入一個代碼,你打開你的數據庫連接之前

if (con.State == ConnectionState.Open) 
     con.Close(); 

con.Open(); 

還添加以下代碼

dr.close(); 
    dr.dispose(); 

希望這有助於你

+0

它不是我在finally {con。關閉();}但我也嘗試烏爾代碼其不工作 – user2491383

+0

第一次輸入時沒有工作只按下4個值顯示和錯誤顯示,第二次顯示文本框上的所有值 – user2491383

0

嘗試使用Using statement進行數據庫連接,這有助於管理資源。

using語句與實現IDisposable的類型結合使用。

using (var con = new SqlConnection(//connection string) 
    { 
    using (var cmd = new SqlCommand(storedProcname, con)) 
    { 
     try{ 
      con.open(); 
      //data reader code 
     } 
     catch 
     { 

     } 
    } 
    } 
+0

我也嘗試這個,但不工作,如果你想看到我的程序如何數據將來我會發布 – user2491383

+0

我是這樣嘗試使用(SQl​​Command cmd = new SqlCommand(storedprocedurename,con)){} – user2491383

+0

@ user2491383如果可能的話發佈與數據庫連接有關的相關數據,那很好。 – Praveen

相關問題