SQLDATAREADER情報をc#のプロパティを持つASPXに渡す

私は初心者であり、皆さんが簡単に見つけることをしようとしています。私は私のCSでページの読み込みにSQL selectを実行したいと思いますし、私のASPXからそのデータにアクセスすると、以下は私のdefault.csコードです:

public partial class _Default : System.Web.UI.Page
{
private SqlDataReader reader = null;
public SqlDataReader Reader { get { return reader; } set { reader = value; } }

    protected void Page_Load(object sender, EventArgs e)
    {
    string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
    using (SqlConnection connection = new SqlConnection(connectionString)) {
    connection.Open();

    using (SqlCommand command = new SqlCommand("SELECT * FROM uploads WHERE status IS NULL AND uploader = @uploader", connection)) {
        command.Parameters.Add(new SqlParameter("uploader", "anonymous"));

        Reader = command.ExecuteReader();
    }
    }
    }
}

私のaspxで私は次のようなものを使用しようとしています:

<%= Reader.GetString(1) %>

しかし、私は次のエラーが発生し続ける: 例外の詳細:System.InvalidOperationException:リーダーが閉じられているときにMetaDataを呼び出す試みが無効です。

私は使用しているステートメントが終了時に接続を終了していることを知っていますが、ASPXからデータにアクセスできない理由がわかりません。使用しているループ内で同じGetString(1)値を使用すると、関連するデータにアクセスできます。

私は基本的には私の結果にすべての行を出力しようとしています= \

0

2 答え

あなたは実際にあなたのページを "using"ブロックの内側から更新してください。最も単純な形式では、ページにリテラルコントロールを追加し、それをusingブロックで更新することができます。

Reader = command.ExecuteReader();
...
Literal1.Text = Reader.GetString(1);

マークアップで次の構文を使用すると、

<%= Reader.GetString(1) %>   

コンパイラはページライフサイクルのレンダリングフェーズで実行される Response.Write ステートメントを生成します。あなたの場合、接続はそれまでに処理されます。

あなたはコネクションとリーダを生かしたままにし、ページのDisposeメソッドのオーバーライドでそれを処理することができますが、私はこのアプローチを推奨しません。

1
追加された

SQLコマンドとSQL接続を破棄しないでください。

Load イベントから使用キーワードを削除します。セクションを使用して終了すると、接続が終了し、読者を閉じます。読者が閉じた後、レンダリングやデータバインディングでは使用できません。

public partial class _Default : System.Web.UI.Page
{
private SqlDataReader reader = null;
public SqlDataReader Reader { get { return reader; } set { reader = value; } }
    protected void Page_Load(object sender, EventArgs e)
    {
    string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
    SqlConnection connection = new SqlConnection(connectionString);
    connection.Open();

    SqlCommand command = new SqlCommand("SELECT * FROM uploads WHERE status IS NULL AND uploader = @uploader", connection);
        command.Parameters.Add(new SqlParameter("uploader", "anonymous"));

        Reader = command.ExecuteReader();
    }
}

しかし

ページのレンダリングを完了したら、読者、コマンド、接続を破棄することを忘れないでください!

0
追加された
あなたの-1 - アップデートの回答に関する@ジョー
追加された 著者 Oleg Dok,
この場合、を使用してを使用しないでください。
追加された 著者 John Saunders,
@ジョー:はい、彼らは処分する必要がありますが、彼はデータバインディング中にそれを使用する予定の場合は、コードのその時点ではありません。
追加された 著者 John Saunders,
-1、悪いアドバイス、SqlConnectionの処理が必要です。
追加された 著者 Joe,