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(). 第一个函数不返回任何内容,它应该用于类似insertor的查询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 回答