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();
问问题
278 次
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
or的查询update
。第二个返回查询输出第一行的第一个单元格的值。
于 2013-07-30T17:51:56.383 回答
0
您应该使用执行标量或传递一些输出参数来获取值。这应该让您在 q3 和 q4 中获得一些价值。
现在为避免错误,您还应该使用 DateTime.ParseExact 而不是简单的 Parse。
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 回答