我想在两个日期之间获取日期,但我收到错误 选择查询是
DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
SqlCommand cmd = new SqlCommand("Select [LedId],[LedName] from [Ledger] where Date>='"+startdate+"' and Date<='"+enddate+"'", con);
答案 0 :(得分:2)
请不要硬编码,而是使用参数化查询
DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
...
// Make sql readable
string sql =
@"Select [LedId],
[LedName]
from [Ledger]
where Date >= @prmStartDate and Date <= @prmEndDate";
// wrap IDisposable (SqlCommand) into using
using (SqlCommand cmd = new SqlCommand(sql, con)) {
cmd.Parameters.Add("@prmStartDate", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.Add("@prmEndDate", SqlDbType.DateTime).Value = endDate;
...
}
硬编码查询
答案 1 :(得分:0)
处理转换的最佳方法是让提供商为您处理:
DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
SqlCommand cmd = new SqlCommand("Select [LedId],[LedName] from [Ledger] where Date >= @startDate and Date <= @endDate", con);
SqlParameter startParameter = cmd.Parameters.Add("@startDate ",
System.Data.SqlDbType.DateTime);
SqlParameter endParameter = cmd.Parameters.Add("@endDate",
System.Data.SqlDbType.DateTime);
startParameter.Value = startdate;
endParameter.Value = enddate;
cmd.Parameters.Add(startParameter);
cmd.Parameters.Add(endParameter);
在构建SQL查询时不要连接字符串,这很容易引入SQL,并且在代码中被视为安全问题。
答案 2 :(得分:0)
如果没有看到您的输入,我建议您在C#中使用parameterized SQL或创建存储过程以接受DATETIME
参数。您不应该使用硬编码的SQL查询 - 简而言之:它们容易受到攻击而不会在SQL中进行优化。
执行此操作的一种非常简单的方法是使用Dapper.NET object mapper。
在SQL中,你可以这样做:
CREATE PROCEDURE return_led_for_dates
@startdate DATETIME,
@enddate DATETIME
AS
BEGIN
SELECT
[LedId],
[LedName]
FROM
[Ledger]
WHERE
Date BETWEEN @Startdate AND @Enddate
END
使用Dapper,你的C#可能是:
DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
var LED = this.Connection.Query<LED>(
"return_led_for_dates",
new {
StartDate = startdate,
EndDate = enddate
},
commandType: CommandType.StoredProcedure);
你也需要一个LED课程:
public class LED
{
int LedId {get; set;},
string LedName {get; set;}
}
最后,假设您的文字字段转换没有问题,您应该使用DateTime.TryParse
。然后,您可以对代码进行防弹,并确保对字段进行相应的解析。像:
DateTime startDate;
DateTime endDate;
if (DateTime.TryParse(Convert.ToDateTime(metroLabel8.Text), out startDate) && DateTime.TryParse(Convert.ToDateTime(metroLabel9.Text), out endDate))
{
// Your data code.
}