ormlite-servicestack,C#,Sql Server,ormlite Servicestack" /> ormlite-servicestack,C#,Sql Server,ormlite Servicestack" />

C# 使用ServiceStack OrmLite和C将TimeSpan作为时间列保存到SQL Server 2012中#

C# 使用ServiceStack OrmLite和C将TimeSpan作为时间列保存到SQL Server 2012中#,c#,sql-server,ormlite-servicestack,C#,Sql Server,ormlite Servicestack,我在数据库表中有一个Time(7)列,我想使用C#和ORMLite作为对象关系映射器保存一个TimeSpan。在执行此操作时,我遇到此异常 操作数类型冲突:bigint与时间不兼容 这是我的服务器堆栈跟踪 [UpdateJobFrequency: 11/07/2015 5:43:39 AM]: [REQUEST: {JobFrequency:{Id:0,JobId:3,FrequencyId:2,InstanceOfFrequency:1,Time:PT1H,WeekNumber:0}}] Sy

我在数据库表中有一个
Time(7)
列,我想使用C#和ORMLite作为对象关系映射器保存一个
TimeSpan
。在执行此操作时,我遇到此异常

操作数类型冲突:bigint与时间不兼容

这是我的服务器堆栈跟踪

[UpdateJobFrequency: 11/07/2015 5:43:39 AM]:
[REQUEST: {JobFrequency:{Id:0,JobId:3,FrequencyId:2,InstanceOfFrequency:1,Time:PT1H,WeekNumber:0}}]
System.Data.SqlClient.SqlException (0x80131904): Operand type clash: bigint is incompatible with time
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteScalar()
   at ServiceStack.OrmLite.OrmLiteCommand.ExecuteScalar()
   at ServiceStack.OrmLite.OrmLiteReadCommandExtensions.LongScalar(IDbCommand dbCmd)
   at ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.ExecLongScalar(IDbCommand dbCmd, String sql)
   at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.InsertAndGetLastInsertId[T](IDbCommand dbCmd)
   at ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.Insert[T](IDbCommand dbCmd, T obj, Boolean selectIdentity)
   at ServiceStack.OrmLite.OrmLiteWriteApi.<>c__DisplayClass4`1.<Insert>b__3(IDbCommand dbCmd)
   at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter)
   at ServiceStack.OrmLite.OrmLiteReadExpressionsApi.Exec[T](IDbConnection dbConn, Func`2 filter)
   at ServiceStack.OrmLite.OrmLiteWriteApi.Insert[T](IDbConnection dbConn, T obj, Boolean selectIdentity)
   at JobRepositoryBase.<Create>d__a`1.MoveNext() in c:\dev\RepositoryBase.cs:line 89
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Job.WebAppHost.Service.JobFrequencyService.<Post>d__6.MoveNext() in c:\dev\JobFrequencyService.cs:line 30
[更新作业频率:11/07/2015 5:43:39 AM]:
[请求:{JobFrequency:{Id:0,JobId:3,FrequencyId:2,InstanceOffFrequency:1,Time:PT1H,WeekNumber:0}]
System.Data.SqlClient.SqlException(0x80131904):操作数类型冲突:bigint与时间不兼容
位于System.Data.SqlClient.SqlConnection.OneError(SqlException异常,布尔断开连接,操作'1 wrapCloseInAction)
位于System.Data.SqlClient.TdsParser.ThroweException和Warning(TdsParserStateObject StateObjectStateObj、布尔调用方连接锁、布尔异步关闭)
位于System.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj、Boolean和dataReady)
位于System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()处
在System.Data.SqlClient.SqlDataReader.get_MetaData()处
位于System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior、String ResetOptions String)
位于System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、Boolean async、Int32超时、任务和任务、Boolean asyncWrite、SqlDataReader ds)
位于System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、String方法、TaskCompletionSource`1 completion、Int32超时、Task&Task、Boolean asyncWrite)
位于System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、String方法)
在System.Data.SqlClient.SqlCommand.ExecuteScalar()处
在ServiceStack.OrmLite.OrmLiteCommand.ExecuteScalar()处
位于ServiceStack.OrmLite.ormliteradcommandextensions.LongScalar(IDbCommand dbCmd)
在ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.ExecLongScalar(IDbCommand dbCmd,String sql)
在ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.InsertAndGetLastInsertId[T](IDbCommand dbCmd)
在ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.Insert[T](IDbCommand dbCmd,T obj,Boolean selectIdentity)
在ServiceStack.OrmLite.OrmLiteWriteApi.c_uu中显示class4`1.b_uu3(IDbCommand dbCmd)
在ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn,Func`2 filter)处
在ServiceStack.OrmLite.ormliteredexpressionsapi.Exec[T](IDbConnection dbConn,Func`2过滤器)处
在ServiceStack.OrmLite.OrmLiteWriteApi.Insert[T](IDbConnection dbConn,T obj,Boolean selectIdentity)
在c:\dev\RepositoryBase.cs中的JobRepositoryBase.d\u a`1.MoveNext():第89行
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在c:\dev\JobFrequencyService.cs中的Job.WebAppHost.Service.JobFrequencyService.d_u6.MoveNext()处:第30行
我正在从界面传递
01:00:00
作为
TimeSpan
值,但它在服务器端的对象中显示为
Time:PT1H

另外,我在一份堆栈溢出调查问卷中读到,ADO.Net
TimeSpan
映射到SQL Server
Time(7)
。我相信servicestack ORMLite是建立在ADO.Net之上的。然而,在这种情况下,我面临着这个例外


任何帮助都将不胜感激

由于紧急情况,我不得不解决这个问题,我不得不将表的数据类型更改为BigInt。所以,ORMLite所做的是将BigInt映射为TimeSpan,反之亦然-,现在我可以毫无问题地存储和检索这个字段


但我仍然相信这不是一个完美的解决方案,因为在我的例子中,我是从头开始开发数据库的,但是如果有人必须使用现有的数据库,这个解决方案就失败了。

由于紧急情况,我不得不为这个问题做一个解决方案,我不得不将表的数据类型更改为BigInt。所以,ORMLite所做的是将BigInt映射为TimeSpan,反之亦然-,现在我可以毫无问题地存储和检索这个字段


但我仍然相信这不是一个完美的解决方案,因为在我的例子中,我是从头开始开发数据库的,但是如果有人必须使用现有的数据库,这个解决方案就会失败。

作为将来的参考,现在有一个工作解决方案,可以使用MS SQL的“Time”列和ORMLite,映射到C#中的TimeSpan类型。只需将下面的代码放在C#应用程序中的任意位置:

    //Enable ORMLite to suppot MS SQL 'Time' column
    //Based on https://github.com/ServiceStack/ServiceStack.OrmLite/wiki/OrmLite-Type-Converters
    SqlServerDialect.Provider.RegisterConverter<TimeSpan>(new ServiceStack.OrmLite.SqlServer.Converters.SqlServerTimeConverter
    {
        Precision = 7
    });
//启用ORMLite以支持MS SQL“时间”列
//基于https://github.com/ServiceStack/ServiceStack.OrmLite/wiki/OrmLite-Type-Converters
SqlServer方言.Provider.RegisterConverter(新ServiceStack.OrmLite.SqlServer.Converters.SqlServerTimeConverter
{
精度=7
});

为了将来的参考,现在有一个工作解决方案,可以使用MS SQL的“时间”列和ORMLite,并映射到C#中的TimeSpan类型。只需将下面的代码放在C#应用程序中的任意位置:

    //Enable ORMLite to suppot MS SQL 'Time' column
    //Based on https://github.com/ServiceStack/ServiceStack.OrmLite/wiki/OrmLite-Type-Converters
    SqlServerDialect.Provider.RegisterConverter<TimeSpan>(new ServiceStack.OrmLite.SqlServer.Converters.SqlServerTimeConverter
    {
        Precision = 7
    });
//启用ORMLite以支持MS SQL“时间”列
//基于https://github.com/ServiceStack/ServiceStack.OrmLite/wiki/OrmLite-Type-Converters
SqlServer方言.Provider.RegisterConverter(新ServiceStack.OrmLite.SqlServer.Converters.SqlServerTimeConverter
{
精度=7
});

@marc_s您能给我一些建议吗?不,对不起-但我相信这是ORMLite的问题-使用“原始”ADO.NET,这是从.NET
TimeSpan
到SQL Server