1
protected void Page_Load(object sender, EventArgs e)
{
    MultiView1.ActiveViewIndex=0;
        string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on t1.RegId = t2.RegId and t2.Uname =  '" + Login1.UserName + "'";
        con.Open();
        SqlCommand cmdr = new SqlCommand(str, con);
        SqlDataReader dr = cmdr.ExecuteReader(); 

        if (cmdr.ExecuteReader().HasRows)//here showing the error as the title i gave.
        {
            Session["userName"] = Login1.UserName.Trim();
            string myStringVariable = "Welcome! ";
            ClientScript.RegisterStartupScript(this.GetType(), "myAlert", "alert('" + myStringVariable + Login1.UserName + "');", true);
            //dr.Dispose();
        }
        else
        {
            string myStringVariable = " No Username Found";
            ClientScript.RegisterStartupScript(this.GetType(), "myAlert", "alert('" + myStringVariable + "');", true);           
        }

        con.Close();
 }

他のイベントでも同じページでdatareaderオブジェクトdrを使用しました...助けてください....

4

4 に答える 4

0

上の行ですでにリーダーを開いています。私はあなたが欲しいと思います:

 SqlDataReader dr = cmdr.ExecuteReader(); 

 if (dr.HasRows)//here showing the error as the title i gave.

ただし、他にも問題があります-@Brad Mが指摘するようにSQLインジェクション(パラメーター化されたクエリを検索します)、コマンドオブジェクトをリークしています-usingステートメントで囲む必要があります。

また、何が/どこconで定義されているかについても少し神経質になっています。ある種のグローバル変数のような匂いがします。ADO.Net を使用する一般的なパターンは、単一のメソッド/コード ブロック内で、新しいSqlConnectionオブジェクトを (ステートメント内でusing) 作成し、新しいSqlCommandオブジェクトを (ステートメント内で) 作成しusing、接続を開き、コマンドを実行し、結果を処理し(該当する場合)、usingブロックを終了してすべてをクリーンアップします。SqlConnectionオブジェクトを共有しようとしないでください。

于 2013-06-28T14:22:27.413 に答える
0

ExecuteReader を 2 回呼び出すのはなぜですか? 1つで十分です

   SqlDataReader dr = cmdr.ExecuteReader(); 
   if (dr.HasRows)
   {
         -----

コードには他の問題もあります。Sql インジェクションは最も危険です。ユーザーが入力した値を渡すときは、このようなコードを使用する必要があります

 string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on " + 
              "t1.RegId = t2.RegId and t2.Uname = @uname";
 con.Open();
 SqlCommand cmdr = new SqlCommand(str, con);
 cmdr.Parameters.AddWithValue("@uname", Login1.UserName);
 SqlDataReader dr = cmdr.ExecuteReader(); 

また、高価なリソースをロックしたままにするため、グローバル接続を使用することはお勧めできません。using ステートメントを使用して、接続、コマンド、およびリーダーを開き、すべてを閉じて破棄してみてください

 // CREATE CONNECTION AND COMMAND
 using(SqlConnection con = new SqlConnection(conString))
 using(SqlCommand cmdr = new SqlCommand(str, con))
 {
      // OPEN THE CONNECTION
      con.Open();
      cmdr.Parameters.AddWithValue("@uname", Login1.UserName);
      using(SqlDataReader dr = cmdr.ExecuteReader())
      { 
           // USE 
           ....
      }  // CLOSE AND DESTROY
 }  // CLOSE AND DESTROY
于 2013-06-28T14:22:35.863 に答える
0

あなたはすでにリーダーを実行しています

SqlDataReader dr = cmdr.ExecuteReader();

では、if既存のリーダーを使用する必要があります

dr.HasRows
于 2013-06-28T14:23:12.187 に答える