2012-01-19 65 views
3

私は理解していないエラーが発生し続けます。 スカラー変数 "@varname"を宣言する必要がありますスカラー変数 "@UserName"を宣言する必要があります

何時間もの研究を経て、何時間も成功しなかった。

2つのテキストボックスを使用するログインページを作成し、ユーザーがSqlデータベースに格納された情報に基づいて終了するかどうかを確認するボタンを作成します。

私は問題がから来ていると思う場所です。特にどこ

private bool DBConnection(string userName, string password) 
{ 
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 

    //string cmdString = ("SELECT UserName, Password FROM Users WHERE UserName ='" + userName + 
    //     "'AND Password ='" + password + "'");   //REMOVED AS THIS IS PRONE TO SQL INJECTIONS 

    string cmdString = ("SELECT * FROM Users WHERE UserName = @uname AND Password = @pw"); 

    SqlCommand cmd = new SqlCommand(cmdString, conn); 

    cmd.Parameters.Add("uname", SqlDbType.VarChar).Value = userName; 
    cmd.Parameters.Add("pw", SqlDbType.VarChar).Value = password; 

    DataSet loginCredentials = new DataSet(); 
    SqlDataAdapter dataAdapter; 

    try 
    { 
     if (conn.State.Equals(ConnectionState.Closed)) 
     { 
      conn.Open(); 

      dataAdapter = new SqlDataAdapter(cmdString, conn); 
      dataAdapter.Fill(loginCredentials); 

      conn.Close(); 

      if (loginCredentials != null) 
      { 
       if (loginCredentials.Tables[0].Rows.Count > 0) 
       { 
        return true; 
       } 
       else 
       { 
        lblMessage.Text = "Incorrect Username or Password"; 
        lblMessage.Visible = true; 
       } 
      } 
     } 
    } 
    catch (Exception err) 
    { 
     lblMessage.Text = err.Message.ToString() + " Error connecting to the Database // " + cmd.Parameters.Count; 
     lblMessage.Visible = true; 
     return false; 
    } 

    return false; 
} 

"dataAdapter.Fill(loginCredentials);"実行中です。

コメントアウトされたステートメントは、正しいユーザー名とパスワードを使用してユーザーにログインすると正常に動作しますが、安全でないことがわかっている限り、SQLインジェクションに対する脆弱性があるため、SQLステートメント。以下

エラーのスクリーンショット: Error screenshot.

任意の助けいただければ幸いです。

+0

すなわち特定の変数に割り当てられている場合ということです); ' ' dataAdapter.SelectCommand = cmd; 'を使用してください –

+0

他の場所へのリンクとしてエラーを投稿しないでください。 現在は利用できません。したがって、誰もそれを見ることができません。 – Richard

+1

@リチャード・ヘム。リンクは私のために働くが、質問にimgを埋め込む。正当性については、あなたが特定の評判を必要とした日に戻って質問をすることができます:) –

答えて

2

編集:あなたはので、あなたのケースSqlCommandオブジェクト(CMD)単なるCommandTextをしてたconnectionStringよりも多くの情報を持っている中でのDataAdapterにSqlCommandオブジェクトを渡す必要があります。あなたのコードは次のようになります。

private bool DBConnection(string userName, string password) 
{ 
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 

//string cmdString = ("SELECT UserName, Password FROM Users WHERE UserName ='" + userName + 
//     "'AND Password ='" + password + "'");   //REMOVED AS THIS IS PRONE TO SQL INJECTIONS 

string cmdString = ("SELECT * FROM Users WHERE UserName = @uname AND Password = @pw"); 

SqlCommand cmd = new SqlCommand(cmdString, conn); 

cmd.Parameters.Add("uname", SqlDbType.VarChar).Value = userName; 
cmd.Parameters.Add("pw", SqlDbType.VarChar).Value = password; 

DataSet loginCredentials = new DataSet(); 
SqlDataAdapter dataAdapter; 

try 
{ 
    if (conn.State.Equals(ConnectionState.Closed)) 
    { 
     conn.Open(); 

     dataAdapter = new SqlDataAdapter(cmd); 
     dataAdapter.Fill(loginCredentials); 

     conn.Close(); 

     if (loginCredentials != null) 
     { 
      if (loginCredentials.Tables[0].Rows.Count > 0) 
      { 
       return true; 
      } 
      else 
      { 
       lblMessage.Text = "Incorrect Username or Password"; 
       lblMessage.Visible = true; 
      } 
     } 
    } 
} 
catch (Exception err) 
{ 
    lblMessage.Text = err.Message.ToString() + " Error connecting to the Database // " + cmd.Parameters.Count; 
    lblMessage.Visible = true; 
    return false; 
} 

return false; 
} 
+0

私は同じ問題を抱えていましたが、1トンの研究の後で、私はあなたの答えにつまずくとそれは動作します。なぜこの新しいシナリオでは、新しいSqlDataAccess(cmdString、conn)を呼び出すのがうまくいかないのですか? – makoshichi

+0

ここでの質問には直接関係しませんが、私はOleDbDataAdapterと同様の問題を抱えていました。 OleDbの場合、SQLテキストのパラメータには?位置プレースホルダとしての文字。SQLテキストに@paramnameのようなパラメータがSQLテキストに含まれていて、SQL Serverを使用している場合、「スカラー変数を宣言する必要があります」エラー – Rattle

+1

「コードをこれに置き換えてください:」は問題を理解しようとする人にとっては、特にコードブロックが非常に大きい場合は特にそうです。 – Goose

2
cmd.Parameters.Add("@uname", SqlDbType.VarChar).Value = userName; 

@ unameの前に注意してください。

+0

@文字のパラメータはオプションです。 – Mubarek

3

cmdStringおよびconnオブジェクトではなく、SqlDataAdapterコンストラクタにcmdを渡す必要があります。

2

以下に説明するエラー(またはここで説明します)以外にも、コマンドラインとデータアダプタへの接続を渡していますが、使用していないコマンドのパラメータを入力しています。 )ので、あなたは...いくつかのエラーを持っている

0

最も重要なことは、最初のチェックは、いくつかの値が代わりに `のDataAdapter =新しいSqlDataAdapterオブジェクト(cmdstringを、CONNの

cmd.parameter.add(@YOUR_VARIABLE, sqlDbtype.TYPE).value = ValueYouwantToGIveToThatVariable; 
関連する問題