2011-12-06 12 views
2

Webアプリケーションを開発中に問題が発生しました。私は誰かが(正常にまたは失敗して)ログインしようとすると、SQLデータベーステーブル "ログ"にユーザー名とIPアドレスを挿入する必要があります。 ID、時間、日付が自動的に挿入されます... 何らかの理由で、私はログインフォームで動作させることができません。 INSERT文は別のフォームから起動しても問題ありませんが、ログイン資格情報のチェックに使用するSELECT文と一緒に動作させることはできません。SQLの複数のステートメント、INSERTが機能しない

私はさまざまなソリューションを試しましたが、テーブルにデータを挿入するものはありません...エラーは発生せず、「ログ」テーブルに新しい行が挿入されません。

何か助けていただければ幸いです。 :)

protected void btnLog_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbConn"].ToString())) 
    { 
     string username = null; 
     string password = null; 
     string ipAddress = null; 

     SymCryptography cryptic = new SymCryptography(); 
     SqlCommand cmdSelect = new SqlCommand(); 
     SqlCommand cmdLog = new SqlCommand(); 
     SqlDataReader myReader = null; 

     cmdSelect.Connection = conn; 
     cmdLog.Connection = conn; 

     cmdSelect.CommandText = "SELECT * FROM uporabniki WHERE up[email protected]_ime AND [email protected]"; 
     cmdSelect.CommandType = CommandType.Text; 
     cmdLog.CommandText = "INSERT INTO log (up_ime, ip) VALUES (@up_ime, @ip)"; 
     cmdLog.CommandType = CommandType.Text; 

     cmdSelect.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
     cmdSelect.Parameters.Add("@geslo", SqlDbType.NVarChar, 20).Value = cryptic.Encrypt(tbPwd.Text); 
     cmdLog.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
     cmdLog.Parameters.Add("@ip", SqlDbType.NVarChar, 20).Value = ipAddress; 

     conn.Open(); 
     try 
     { 
      //cmdLog.ExecuteNonQuery(); I tried it here, but it doesn't work 
      myReader = cmdSelect.ExecuteReader(); 
      if (myReader.Read()) 
      { 
       username = myReader["up_ime"].ToString(); 
       password = myReader["geslo"].ToString(); 
       Session["rights"] = myReader["pravice"]; 
       Session["login"] = "OK"; 
       pravice = true; 
      } 
      myReader.Close(); 
      //cmdLog.ExecuteNonQuery(); I tried it here, but it doesn't work 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
     conn.Close(); 
    } 
    //I tried to open connection again, but stil INSERT does not work 
    /* using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbConn"].ToString())) 
    { 
     string ipAddress = null; 
     SqlCommand cmdLog = new SqlCommand(); 
     cmdLog.Connection = conn; 
     cmdLog.CommandText = "INSERT INTO log (up_ime, ip) VALUES (@up_ime, @ip)"; 
     cmdLog.CommandType = CommandType.Text; 
     cmdLog.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
     cmdLog.Parameters.Add("@ip", SqlDbType.NVarChar, 20).Value = ipAddress; 
     conn.Open(); 
     try 
     { 
      cmdLog.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
     conn.Close(); 
    } 

    if (pravice == true) 
    { 
     Response.Redirect("Default.aspx"); 
    } 
    else 
    { 
     Response.Redirect("Login.aspx"); 
    }*/ 
} 
+1

何らかのエラーメッセージが表示されますか? – Pieter

+0

ログテーブルの制約(一意キーまたは主キーなど)はありますか? – hcb

+0

すぐには問題は見えませんが、このコードをクリックイベントから取り出し、呼び出すことができる別のクラスに配置することをお勧めします。 SQLにイベントハンドラを散らばらせるのは、一般的には良い習慣ではありません。 – taylonr

答えて

3

あなたのcmdLog.ExecuteNonQuery();ステートメント。

また、SQLデータベースでクエリウィンドウを開いて、次のクエリを実行してみてください。

INSERT INTO log (up_ime, ip) VALUES (<some time>, <test ip text>) 

エラーがSQL Serverにある場合は、問題がSQL Serverにあるかどうかを示すエラーメッセージが返されます。

も変更してみてください:

cmdLog.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
    cmdLog.Parameters.Add("@ip", SqlDbType.NVarChar, 20).Value = ipAddress; 

へ:あなたの接続文字列の値がOKであるかどうかを

cmdLog.Parameters.Add("@up_ime", tbUsr.Text); 
    cmdLog.Parameters.Add("@ip", ipAddress); 
+0

これらのコメントは実際のコードにはありませんので、実行しています;)実行しようとしたところを指摘しましたそれはどんな場合でもうまくいきませんでした。私はそれがMS SQL ServerでINSERTステートメントを使用しようとしました、それは働いた...それは私がログインフォームから行うときに動作しません、パラメータを変更しようとするthnx – user1080533

+0

私はパラメータを変更し、今動作します。それが以前にはうまくいかなかった理由を調べます。 :) – user1080533

+0

SQLプロファイラはありますか?その場合は、C#でSQL DB型を宣言するときにSQL呼び出しに正しく渡されているかどうかを確認してください。私はあまりにも単純な何かのためにあまりにも多くの問題にぶつかっていたので、ほとんどその宣言のスタイルを使用します。 – gsirianni

1

チェック。

conn.Open(); 

エラーが発生するかどうか参照してください。 そうでなければ、接続文字列が正しいことを意味します。

コメントを解除し、このライントライ後の{}

//cmdLog.ExecuteNonQuery(); I tried it here, but it doesn't work 

し、その上にブレークポイントを置く..あなたがエラーを取得するかどうか?

また、あなたのコードからは、テーブルにnull ipaddress値を挿入しているのが分かります。データベースの列がNULLを受け入れることが許可されているかどうかを確認しますか?

+0

データベースに接続して別のテーブルからユーザーのログイン資格情報を読み取るため、ログテーブルもnull IPアドレスを受け入れるため、接続文字列はOKですが、やはりそれを調べてみましょうthanx – user1080533

+0

パラメータをそのまま変更しました別の答えで示唆し、あなたが示唆したように試した後SQLコマンドを実行し、それは今動作します – user1080533

0

usingステートメントは、ガベージコレクションプロセスで接続をクリーンアップし、不確定な時間に発生します。このため、試した実行順序のうち1つは機能しません(接続が使用できない可能性があります)。あなたがいずれかを実行することをお勧め:、あなたは最終的には()ブロック内の接続を閉じ、確認してください(接続)を使用して、1以内

  1. どちらの操作を新しくopeend接続に対するあなたのコマンドを再-INIT。

  2. 2つの異なる接続conn1とconn2を持ち、それぞれ別々の操作を実行します。

編集:エラーが発生していないと言っていますか? - ExecuteNonQueryの結果を調べてみてください(影響を受けた行の数を示す整数を返します - これが0の場合、insert文に問題があります)。

関連する問題