0
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

4 に答える 4

4

現在、コードには多くの問題があります。

  • クエリの作成に文字列連結を使用しないでください。代わりにパラメーター化された SQL を使用してください。これにより、 SQL インジェクション攻撃と変換の問題が回避されます
  • ExecuteNonQuery実行しようとしているときに使用しています...クエリ。
  • 結果を文字列に変換していますが、これは日付返されたとしても悪い考えです...代わりに、単にDateTime. できる限り文字列変換を避けてください。

したがって、次のことを行う必要があります。

  • 動的 SQL の代わりにパラメーターを使用する
  • ExecuteReader各リーダーから最初の結果を使用して取得する
  • GetDateTimeメソッドを使用してDateTime、結果から を取得します。

その後、個人的に減算演算子も使用します。

TimeSpan difference = end - start;

...しかし、それは単なる好みの問題であり、現在のコードの実際の間違いではありません。

于 2013-07-30T17:54:16.183 に答える
3

あなたの間違いはここにあります:

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 );
于 2013-07-30T17:51:58.933 に答える
1

使用SqlCommand.ExecuteNonQuery()しますが、必要SqlCommand.ExecuteScalar()です。最初の関数は何も返しません。insertまたはのようなクエリに使用することになっていますupdate。2 番目は、クエリ出力の最初の行の最初のセルの値を返します。

于 2013-07-30T17:51:56.383 に答える
0

値を取得するには、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);
于 2013-07-30T17:52:35.020 に答える