Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带时间戳的SQL请求_C#_Sql Server_Datetime - Fatal编程技术网

C# 带时间戳的SQL请求

C# 带时间戳的SQL请求,c#,sql-server,datetime,C#,Sql Server,Datetime,我正在使用C#向SQL server发出请求。请求需要介于2个时间戳(日期和小时)之间。问题是,如果我只输入日期(2015-04-15),它可以工作,但如果我将时间延迟(2015-04-15 16:00:00),它将不再工作,并显示错误:“接近'16'语法不正确。” 我尝试了不同的东西,但我找不到路 这是我的密码: DateTime Endtime = Convert.ToDateTime(DateTime.Now.Date.ToString("d") + " " + DateTime.Now.

我正在使用C#向SQL server发出请求。请求需要介于2个时间戳(日期和小时)之间。问题是,如果我只输入日期(2015-04-15),它可以工作,但如果我将时间延迟(2015-04-15 16:00:00),它将不再工作,并显示错误:“接近'16'语法不正确。”

我尝试了不同的东西,但我找不到路

这是我的密码:

DateTime Endtime = Convert.ToDateTime(DateTime.Now.Date.ToString("d") + " " + DateTime.Now.AddHours(1).Hour.ToString("00") + ":00:00");
DateTime Starttime = Convert.ToDateTime(DateTime.Now.Date.ToString("d") + " " + DateTime.Now.Hour.ToString("00") + ":01:00");

string time = string.Empty;

SqlConnection sqlCon = new SqlConnection("...");
sqlCon.Open();
SqlCommand sqlCmd = new SqlCommand("SELECT COUNT(TimeStamp) FROM net WHERE Timestamp BETWEEN " + Starttime.ToString("yyyy-MM-dd hh:mm:ss") + " AND " + Endtime.ToString("yyyy-MM-dd hh:mm:ss"), sqlCon);

SqlDataReader reader = sqlCmd.ExecuteReader(); //Error comes from here
while (reader.Read())
{
    time = reader[0].ToString();
}

Console.WriteLine(time);

您有什么想法吗?

将其设置为参数化查询,如:

// Somewhere in your class declaration:
// Fixed parameterized query text as a constant.
private const string TimeRangeQuerySQL = 
    "SELECT COUNT(TimeStamp) FROM net WHERE Timestamp BETWEEN @starttime AND @endtime";

// ...
var cmd = new SqlCommand(TimeRangeQuerySQL, sqlCon);
cmd.Parameters.Add("@starttime", SqlDbType.DateTime).Value = Starttime;
cmd.Parameters.Add("@endtime", SqlDbType.DateTime).Value = Endtime;

var reader = sqlCmd.ExecuteReader();

// ...

请注意,最好使用参数化查询,而不是自己组装查询字符串,这样您就不会受到SQL注入攻击。您可能想阅读的故事。

如何将其作为参数化查询,如中所示:

// Somewhere in your class declaration:
// Fixed parameterized query text as a constant.
private const string TimeRangeQuerySQL = 
    "SELECT COUNT(TimeStamp) FROM net WHERE Timestamp BETWEEN @starttime AND @endtime";

// ...
var cmd = new SqlCommand(TimeRangeQuerySQL, sqlCon);
cmd.Parameters.Add("@starttime", SqlDbType.DateTime).Value = Starttime;
cmd.Parameters.Add("@endtime", SqlDbType.DateTime).Value = Endtime;

var reader = sqlCmd.ExecuteReader();

// ...

请注意,最好使用参数化查询,而不是自己组装查询字符串,这样您就不会受到SQL注入攻击。您可能想阅读。

在查询中使用SQL日期转换,或者只需在日期前后添加单引号,
WHERE Timestamp'“…
另外,请确保:
TimeStamp
是数据库中的类型
DateTime
,是吗?在查询中使用SQL日期转换,或者只在日期
之间添加单引号“…
另外,请确保:
TimeStamp
在数据库中的类型为
DateTime
,是吗?它不仅可以防止sql注入攻击(对于此特定查询来说并非绝对必要,因为我们有一个安全的已知输入)如果使用不同的值执行同一查询两次,它有助于使用缓存查询计划。它不仅可以防止sql注入攻击(对于此特定查询,这不是严格必需的,因为我们有一个安全的已知输入),而且如果使用不同的值执行同一查询两次,它还可以帮助使用缓存查询计划。