2

使用 dapper 类到 nexus 数据库将 DateTime 值作为 null 插入 Nexus Db 时遇到以下问题。

public const string SqlQuery = @"INSERT INTO Test(test1, test2, test3, 
Date1,Date2))
                                                       Values(?test1?,? 
test2?,?date1?,?date2?)";

 public void InsertTest(string test1,string test2, DateTime? date1,DateTime? 
date2)
{
var params= new DynamicParameters(
            new
            {
test1= "",
test2 ="",
Date1 = cDate.HasValue ? cDate.Value.Date : (DateTime?)null,
Date2 = cDate1.HasValue ? cDate2.Value.Date : (DateTime?)null,

}
ExecConn(SqlQuery , params);
}

ERROR [HY000] 查询返回错误(ODBC 状态:HY000)

错误:日期编码的参数无效

查询:t 60000;插入测试(test1,test2,test3,Date1,Date2)值(:Param1,:Param2,:Param3,:Param4,:Param5)

4

2 回答 2

2

尝试使用 DateTime.MinValue 而不是 (DateTime?)null

public void InsertTest(string test1,string test2, DateTime? date1,DateTime? 
date2)
{
 var params= new DynamicParameters(
        new
        {enter code here
 test1= "",
 test2 ="",`enter code here`
 Date1 = cDate.HasValue ? cDate.Value.Date :   DateTime.MinValue.Date,
 Date2 = cDate1.HasValue ? cDate2.Value.Date :   DateTime.MinValue.Date,

 }
 ExecConn(SqlQuery , params);
 }
于 2018-06-05T06:07:42.207 回答
0

通常在 db 层(对于 oracle 和 MSSQL)我们必须做这样的事情

(PS 这是从我的代码中获取的,我还必须允许一些半智者在 excel 中输入诸如 2018 年 2 月 31 日之类的东西!)

如果实际上为 null 或无效,这会将其转换为 DBNull.Value。然后应该工作。

       private object dtfix(object o)
        {
            if (!(o is DateTime))
            {
                return null;
            }
            else
            {
                try
                {
                    DateTime x = (DateTime)o;
                    x.AddDays(1);
                }
                catch
                {
                    return null;
                }
                return o;
            }
        }

param = new SqlParameter("duedate", SqlDbType.Date);
param.Value = dtfix(myparm) ?? DBNull.Value;
于 2018-06-04T14:57:41.553 回答