0

次のエラーが発生しました。

接続は閉じられませんでした。接続の現在の状態は開いています リーダーが閉じているときに MetaData を呼び出す試みは無効です。

私はこれを試しました:

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(); 
}

これが私のSQLストアドプロシージャです

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 m_id=@m_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 m_id=@m_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 master_knittingdaily.m_id=@m_id
end
4

3 に答える 3

0

データベース接続にUsing ステートメントを使用してみてください。これはリソースの管理に役立ちます。

using ステートメントは、 IDisposableを実装する型と組み合わされます。

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

       }
     }
  }
于 2013-06-21T05:47:12.993 に答える
0

データベース接続を開く前にコードを1つ挿入するだけです

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

 con.Open();

以下のコードも追加

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

これがお役に立てば幸いです

于 2013-06-21T05:18:55.137 に答える