C# 将日期时间插入sql server 2008时出现奇怪的错误
我正在向sql server插入日期时间字段。从我本地的电脑上看,它工作正常。示例:sql server中的datetime字段为:“2013-07-31 08:00:00.000”,但当我运行应用程序表单时,服务器会切换日期和月份,并按如下方式插入: “2013-07-31 15:15:00.000” 我的相关页面根据今天的日期从sql server加载一些条目。 像这样:C# 将日期时间插入sql server 2008时出现奇怪的错误,c#,asp.net,sql-server,sql-server-2008,datetime,C#,Asp.net,Sql Server,Sql Server 2008,Datetime,我正在向sql server插入日期时间字段。从我本地的电脑上看,它工作正常。示例:sql server中的datetime字段为:“2013-07-31 08:00:00.000”,但当我运行应用程序表单时,服务器会切换日期和月份,并按如下方式插入: “2013-07-31 15:15:00.000” 我的相关页面根据今天的日期从sql server加载一些条目。 像这样: public List<act_event> return_event_list(DateTime date
public List<act_event> return_event_list(DateTime date) //return all events for spesific date
{
List<act_event> event_list = new List<act_event>();
String date_sql = date.ToString("yyyy-MM-dd");
using (SqlConnection con = connect("igroup20_test2ConnectionString"))
{
using (SqlCommand cmd = create_command(con, "select * from act_events where '" + date_sql + "'>=(CAST(e_start as DATE)) and '" + date_sql + "'<=(CAST(e_end as DATE))"))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
act_event a_event = new act_event();
a_event.e_num = Convert.ToInt32(rdr["e_num"]);
a_event.name = rdr["e_name"].ToString();
a_event.start = Convert.ToDateTime(rdr["e_start"]);
a_event.end = Convert.ToDateTime(rdr["e_end"]);
a_event.description = rdr["e_description"].ToString();
a_event.address = rdr["e_address"].ToString();
event_list.Add(a_event);
}
}
}
}
return event_list;
}
我尝试更改select命令,添加了以下内容:
public void add_event(act_event add_avent)
{
using (SqlConnection con = connect("igroup20_test2ConnectionString"))
{
using (SqlCommand cmd = create_command(con, "insert into act_events values(@e_name, @e_start, @e_end, @e_description, @e_address)"))
{
cmd.Parameters.AddWithValue("@e_name", add_avent.name);
SqlParameter param2 = new SqlParameter("@e_start", SqlDbType.DateTime);
param2.Value = add_avent.start;
cmd.Parameters.Add(param2);
SqlParameter param3 = new SqlParameter("@e_end", SqlDbType.DateTime);
param3.Value = add_avent.end;
cmd.Parameters.Add(param3);
//cmd.Parameters.Add(new SqlParameter("@e_start", SqlDbType.DateTime));
//cmd.Parameters["@e_start"].Value = DateTime.Parse(add_avent.start.ToString());
//cmd.Parameters.Add(new SqlParameter("@e_end", SqlDbType.DateTime));
//cmd.Parameters["@e_end"].Value = DateTime.Parse(add_avent.end.ToString());
cmd.Parameters.AddWithValue("@e_description", add_avent.description);
cmd.Parameters.AddWithValue("@e_address", add_avent.address);
cmd.ExecuteNonQuery();
}
//using (SqlCommand cmd2=create_command
}
}
using (SqlCommand cmd = create_command(con, "select * from act_events where ( '" + date_sql + "'>=(CAST(e_start as DATE)) and '" + date_sql + "'<=(CAST(e_end as DATE)) ) or ( '" + date_sql2 + "'>=(CAST(e_start as DATE)) and '" + date_sql2 + "'<=(CAST(e_end as DATE)) ) "))
String date_sql = date.ToString("yyyy-MM-dd");
String date_sql2 = date.ToString("yyyy-dd-MM");
using (SqlConnection con = connect("igroup20_test2ConnectionString"))
{
using (SqlCommand cmd = create_command(con, "select * from act_events where @date1>=(CAST(e_start as DATE)) and @date2<=(CAST(e_end as DATE))"))
{
cmd.Parameters.AddWithValue("@date1", date_sql);
cmd.Parameters.AddWithValue("@date2", date_sql);
cmd.Parameters.AddWithValue("@date3", date_sql2);
cmd.Parameters.AddWithValue("@date4", date_sql2);
String date_sql = date.ToString("yyyy-MM-dd");
String date_sql2 = date.ToString("yyyy-dd-MM");
using (SqlConnection con = connect("igroup20_test2ConnectionString"))
{
using (SqlCommand cmd = create_command(con, "select * from act_events where ( @date1>=(CAST(e_start as DATE)) and @date2<=(CAST(e_end as DATE)) ) or ( @date3>=(CAST(e_start as DATE)) and @date4<=(CAST(e_end as DATE)) )"))
{
cmd.Parameters.AddWithValue("@date1", date_sql);
cmd.Parameters.AddWithValue("@date2", date_sql);
cmd.Parameters.AddWithValue("@date3", date_sql2);
cmd.Parameters.AddWithValue("@date4", date_sql2);
除非您完全确定服务器区域设置,否则尝试从客户端将日期/时间作为
string
传递给SQL永远都不是一个好主意
切换到参数化查询应该可以解决您的问题。除非您完全确定服务器区域设置,否则尝试将日期/时间作为
字符串从客户端传递给SQL绝对不是一个好主意
切换到参数化查询应该可以解决您的问题。您遇到的问题是由于在客户端和服务器端的某个点进行了字符串到日期的转换
如果使用参数化查询并传递DateTime值,则无需将F转换为string或date,当然前提是表字段的类型也是日期类型
以下代码根本不进行任何转换:
DateTime date1=DateTime.Today.AddMonths(-1);
DateTime date2=DateTime.Today.AddMonths(1);
using (SqlConnection con = connect("igroup20_test2ConnectionString"))
{
using (SqlCommand cmd = create_command(con,
"select * from act_events where " +
" (@date1>=e_start and @date1 <= e_end) " +
" or (@date2>= e_start and @date2 <= e_end) "))
{
cmd.Parameters.AddWithValue("@date1", date1);
cmd.Parameters.AddWithValue("@date2", date2);
DateTime date1=DateTime.Today.AddMonths(-1);
DateTime date2=DateTime.Today.AddMonths(1);
使用(SqlConnection con=connect(“igroup20\u test2ConnectionString”))
{
使用(SqlCommand cmd=create_)命令(con,
“从act_事件中选择*,其中”+
(@date1>=e_start和@date1=e_start和@date2您遇到的问题是由于在客户端和服务器端的某一点或另一点上的字符串到日期的转换
如果使用参数化查询并传递DateTime值,则无需将F转换为string或date,当然前提是表字段的类型也是日期类型
以下代码根本不进行任何转换:
DateTime date1=DateTime.Today.AddMonths(-1);
DateTime date2=DateTime.Today.AddMonths(1);
using (SqlConnection con = connect("igroup20_test2ConnectionString"))
{
using (SqlCommand cmd = create_command(con,
"select * from act_events where " +
" (@date1>=e_start and @date1 <= e_end) " +
" or (@date2>= e_start and @date2 <= e_end) "))
{
cmd.Parameters.AddWithValue("@date1", date1);
cmd.Parameters.AddWithValue("@date2", date2);
DateTime date1=DateTime.Today.AddMonths(-1);
DateTime date2=DateTime.Today.AddMonths(1);
使用(SqlConnection con=connect(“igroup20\u test2ConnectionString”))
{
使用(SqlCommand cmd=create_)命令(con,
“从act_事件中选择*,其中”+
“(@date1>=e_start和@date1=e_start和@date2yyyy-MM-dd
是一种带有datetime
(但不适用于date
)的无限制格式。它根据登录的默认语言进行解释。yyyyymmdd
是无限制的。yyyyy-MM-dd
是带有datetime
的无限制格式。”(但不适用于date
)。它是根据登录的默认语言解释的。yyyyMMdd
是不可靠的。它实际上不易受SQL注入的影响。return\u event\u list
函数接受DateTime
而不是字符串。(尽管参数化查询可以避免此问题并更好地利用计划缓存)@MartinSmith啊,是的,好的一点实际上从未注意到。你说我应该切换到参数化查询,但即使我从sql查询中选择它,它也会给我这个错误。检查我的edit@Dvirski您的编辑不会更改任何内容。您的select
查询需要参数化,而不仅仅是insert
语句问题是,您正在以特定格式传递日期,但服务器希望以不同的格式传递。切换到参数化查询应允许SQL决定需要日期的格式。请停止将日期转换为字符串,然后再次将其转换为日期。参数化查询将日期作为日期传递,无需来回转换。错误在于将日期作为字符串传递,即使在使用参数时也是如此。这实际上不易受SQL注入的影响。return\u event\u list
函数接受的是DateTime
而不是字符串。(尽管参数化查询可以避免此问题,并更好地利用计划缓存)@MartinSmith啊,是的,好的一点实际上从未注意到。你说我应该切换到参数化查询,但即使我从sql查询中选择它,它也会给我这个错误。检查我的edit@Dvirski您的编辑不会更改任何内容。您的select
查询需要参数化,而不仅仅是insert
语句问题是,您正在以特定格式传递日期,但服务器希望以不同的格式传递。切换到参数化查询应允许SQL决定需要日期的格式。请停止将日期转换为字符串,然后再次将其转换为日期。参数化查询将日期作为日期传递,无需来回转换。错误在于,即使使用参数,也会以字符串形式传递日期
Conversion failed when converting date and/or time from character string.
DateTime date1=DateTime.Today.AddMonths(-1);
DateTime date2=DateTime.Today.AddMonths(1);
using (SqlConnection con = connect("igroup20_test2ConnectionString"))
{
using (SqlCommand cmd = create_command(con,
"select * from act_events where " +
" (@date1>=e_start and @date1 <= e_end) " +
" or (@date2>= e_start and @date2 <= e_end) "))
{
cmd.Parameters.AddWithValue("@date1", date1);
cmd.Parameters.AddWithValue("@date2", date2);