DateTime 插入数据库引发的bug--于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM这个之间

SQL Server DateTime陷阱
本文探讨了SQL Server中DateTime类型的常见问题,包括默认值与空值处理的区别,以及如何正确地进行值比较。同时介绍了C#中日期格式化的多种方法。

数据库中 值的大小需要 于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM这个之间

而datetime 默认值是  0001/01/01   不位于数据库中的值的要求,所以会报上面的错误

判断datetime类型的值是否为空 ,不能用 IsNullOrEmpty而应该用default(DateTime) 比对是否为空。。

sqlserver 默认是插入1900-01-01

 public DateTime StartTime { get; set; }=Convert.ToDateTime("1900-01-01");

 

 

C#日期格式化4、用Convert方法转换日期显示格式: 

    Convert.ToDateTime("2005-8-23").ToString        
    ("yyMMdd",System.Globalization.DateTimeFormatInfo.InvariantInfo);    //支持繁体数据库   

C#日期格式化5、直接用ToString方法转换日期显示格式: 

DateTime.Now.ToString("yyyyMMddhhmmss");   

DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss")  

 C#日期格式化6、只显示年月 :

    DateTime.Now.ToString("yyyyMMddhhmmss");    
    DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss")   
using Dapper;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsForms_WebServiceClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            TaskInfo task = new TaskInfo();
            task.TaskNo = DateTime.Now.Ticks.ToString() + "1";
            task.TaskType = 1;
            task.StartPoint = 32;
            task.EndPoint = 109;
            task.MaterialType = MaterialType.托盘;
            task.StartTime = DateTime.Now;

            string taskStr = JsonConvert.SerializeObject(task);
            CreateTask_NG(taskStr);

        }

        ResultInfo resultInfo = new ResultInfo();
        public ResultInfo CreateTask_NG(string task)
        {
            try
            {
                TaskInfo taskInfo = JsonConvert.DeserializeObject<TaskInfo>(task);

                //string sql = "INSERT INTO [Task_Info_SaiMo] (TaskNo,TaskType,StartPoint,EndPoint,MaterialType,StartTime) Values (@TaskNo,@TaskType,@StartPoint,@EndPoint,@MaterialType,@StartTime)";

                string sql = "task_insert";
                using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
                {
                    var affectedRows = connection.Execute(sql, new { TaskNo = taskInfo.TaskNo, TaskType = taskInfo.TaskType, StartPoint = taskInfo.StartPoint, EndPoint = taskInfo.EndPoint, MaterialType = taskInfo.MaterialType, StartTime = taskInfo.StartTime }
                    ,commandType: CommandType.StoredProcedure);

                    if (affectedRows > 0)
                    {
                        resultInfo.Result = true;
                        resultInfo.Message = "任务添加成功";
                    }
                    else
                    {
                        resultInfo.Result = false;
                        resultInfo.Message = "任务添加失败";
                    }

                    // var customer = connection.Query<Customer>("Select * FROM CUSTOMERS WHERE CustomerName = 'Mark'").ToList();
                }
                return resultInfo;
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

被误导的原因分析

1.当时一直被要给 datetime类型的变量传个最小的数据库大小的值这个误导,其实我只需要更新不为空的datetime类型,而datetime类型值都不为空,所以不能用IsNullOrEmpty,所以我要比对的是datetime否是默认值( dafault(datetime))

2. 当时插入数据的时候,都是datetime的默认值,为什么数据库没有报错,可以将null值传入,而更新时却不能

3.  更新只更新给定的字段

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值