2011-12-21 17 views
0

私はこのWebサイトをASP.NETで開発中で、C#を使用しています。私はエラーを取得しています:割り当てられていない変数usnの使用。データベースも空ではありません。 私のコードは次のとおりです。"割り当てられていない変数の使用"エラー

protected void Button1_Click(object sender, EventArgs e) 
{ 

    SqlConnection cn = new SqlConnection(); 
    SqlCommand cm = new SqlCommand(); 
    SqlDataReader dr; 
    cn.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Vijaylaxmi\Desktop\TrainReserveold\App_Data\Database.mdf;Integrated Security=True;User Instance=True"; 
    cn.Open(); 
    cm.Connection = cn; 
    String usn; 
    cm.CommandText = "Select UserName from User where UserName='" + TextBox1.Text + "'"; 
    dr = cm.ExecuteReader(); 
    while (dr.Read()) 
    { 
     usn = dr.GetString(0); 
    } 
    if (String.Compare(usn, TextBox1.Text) != 0) 
    { 
     Response.Write("Invalid user name... try again"); 
     TextBox1.Text = ""; 
     TextBox2.Text = ""; 
     TextBox1.Focus(); 
    } 
    Response.Write("user valid now"); 
} 
+3

'using'ステートメントで' SqlConnection'、 'SqlCommand'と' SqlDataReader'の作成をラップする必要があります。 – Oded

+2

あなたは失礼です。できるだけ速やかに?私はこれのために支払われていません、あなたは知っています。そして、これで私は答えにすべての関心を失いました。 – Oded

+0

また、接続とコマンドを作成する方法を書き直すことになります。あなたが持っているものをフォローするのが簡単になる例を投稿します。 – MethodMan

答えて

1

は、私はまた、アプリケーションの種類に応じて、web.configファイルまたはapp.configをからの私のSQL connectiong文字列を読んでいました

string usn = string.empty; then go from there 
//create a Stored Procedure and put your Select Statement in there.. to avoid Sql Injection 
cmd.CommandText = "name of your stored proc"; 
cmd.CommandType = System.Data.CommandType.StoredProcedure; 

としてトップをUSNの文字列をASSINGます走っている。

+1

DBに他のユーザがいなくても空のユーザ名はおそらく無効なので、おそらくNULLを割り当てるほうがよいでしょう。 –

+0

Emptyはちょっとイニシャライザです。私は本当に、彼がこのようなものを使ってリファクタリングすることを推奨し、次にコマンドオブジェクトを使用して作成/割り当てます(SqlConnection sqlConnSqlConnection =新しいSqlConnection(strConnectionString)){} – MethodMan

+0

すべてのコードはひどく匂いがする。しかし、私はローマが一日で建てられなかったと思う。 MOREバグを導入する理由はありません:) –

0

変更あなたのcm.CommandText =「ユーザーからどこのUserName = 私はここを参照してください

cm.CommandText = string.Format("Select UserName from User where UserName= '{0}'",Textbox1.Text); 
+1

これはSQLインジェクションを防ぐものではありません。 –

+0

はい、いつでもストアドプロシージャでsqlコマンドを提供するように変更できます。私は気付いていますが、良い点です。 – MethodMan

+0

ストアドプロシージャはインジェクションを防止しません。コマンドのパラメータは次のとおりです。 –

3

いくつかの問題にユーザー名を選択して、あなたの質問に特定の応答では、あなたがこの置き換えたい:。

dr = cm.ExecuteReader(); 
while(dr.Read()) 
{ 
    usn = dr.GetString(0); 
} 
をこれで

usn = cm.ExecuteScalar().ToString(); 

はDBNulのために確認してください最初に、ちょうどの場合。

さらに一般的には、
とします。a)生の入力を使用する代わりに、SQLをパラメータ化します(または、ストアドプロシージャを使用することをお勧めします)。これにより、SQLインジェクション攻撃から保護されます。
b)コードに直接接続文字列を含めないでください。それを設定ファイルに入れてください。最も確かにそれをインターネットに掲載しないでください。

関連する問題