string sqlUserName3 = "SELECT out_date FROM status where s_id='" + TextBox2.Text + "'";
SqlCommand sqlcmd3 = new SqlCommand(sqlUserName3, sqlcon);
sqlUserName4 = "SELECT in_date FROM status where s_id='"+TextBox2.Text+"'";
SqlCommand sqlcmd4 = new SqlCommand(sqlUserName4, sqlcon);
string q3 = sqlcmd3.ExecuteNonQuery().ToString();
string q4 = sqlcmd4.ExecuteNonQuery().ToString();
DateTime dt1 = DateTime.Parse(q3);
DateTime dt2 = DateTime.Parse(q4);
TimeSpan result = dt1.Subtract(dt2);
string result1 = result.ToString();
TextBox8.Text = result1;
//Response.Redirect("login.aspx");
sqlcon.Close();
4 に答える
現在、コードには多くの問題があります。
- クエリの作成に文字列連結を使用しないでください。代わりにパラメーター化された SQL を使用してください。これにより、 SQL インジェクション攻撃と変換の問題が回避されます
ExecuteNonQuery
実行しようとしているときに使用しています...クエリ。- 結果を文字列に変換していますが、これは日付が返されたとしても悪い考えです...代わりに、単に
DateTime
. できる限り文字列変換を避けてください。
したがって、次のことを行う必要があります。
- 動的 SQL の代わりにパラメーターを使用する
ExecuteReader
各リーダーから最初の結果を使用して取得するGetDateTime
メソッドを使用してDateTime
、結果から を取得します。
その後、個人的に減算演算子も使用します。
TimeSpan difference = end - start;
...しかし、それは単なる好みの問題であり、現在のコードの実際の間違いではありません。
あなたの間違いはここにあります:
string q3 = sqlcmd3.ExecuteNonQuery().ToString();
string q4 = sqlcmd4.ExecuteNonQuery().ToString();
DateTime dt1 = DateTime.Parse(q3);
DateTime dt2 = DateTime.Parse(q4);
ExecuteNonQuery
文字列表現で日付を返しません。クエリの影響を受けたレコードの数を返します。したがって、実行DateTime.Parse(number)
するとエラーが発生します。
どのクエリも日付を返していないため、質問にある SQL を呼び出して日付を返す方法が不明です...
アップデート
文字列連結を使用して SQL ステートメントを作成しないでください。パラメータを使用して、SQL インジェクション攻撃にさらされることを回避できます。一例は次のとおりです。
string sqlUserName3 = "SELECT out_date FROM status where s_id=@id";
SqlCommand sqlcmd3 = new SqlCommand(sqlUserName3, sqlcon);
sqlcmd3.Parameters.AddWithValue("@id",TextBox2.Text );
使用SqlCommand.ExecuteNonQuery()
しますが、必要SqlCommand.ExecuteScalar()
です。最初の関数は何も返しません。insert
またはのようなクエリに使用することになっていますupdate
。2 番目は、クエリ出力の最初の行の最初のセルの値を返します。
値を取得するには、execute scalar を使用するか、out パラメータを渡す必要があります。これにより、q3 と q4 で値が得られるはずです。
エラーを回避するために、単純な Parse の代わりに DateTime.ParseExact も使用する必要があります。
DateTime dt1 = DateTime.ParseExact(q3,"dd/mm/yyyy HH:mm",CultureInfo.InvariantCulture);
DateTime dt2 = DateTime.ParseExact(q4,"dd/mm/yyyy HH:mm",CultureInfo.InvariantCulture);