c#多线程解析datetime 报错

SayHello_XXXX 2018-01-11 03:07:51
datetime是数据库里读出来的 表示类型不一定 有的有时间有的没时间只有年月日 在多线程tostring的地方 会报出 ”System.ArgumentOutOfRangeException: 年、月和日参数描述无法表示的 DateTime。” 的异常 单线程去执行就不会有异常 很顺利 具体什么原因没搞懂 之前用dateset捞出数据库的数据如果是多线程也会报这个错 单线程也没问题 有大牛研究过是什么原因么
...全文
546 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SayHello_XXXX 2018-01-11
  • 打赏
  • 举报
回复
数据库是通过odbc连接的informix
SayHello_XXXX 2018-01-11
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
应该是你读数据的地方有问题,而不是tostring的地方有问题
已经确定不是tostring了 从数据库里面捞进dataset里 虽然存的都是object 但是.net会做一边对应类型转换 这时候报的错 多线程情况下
SayHello_XXXX 2018-01-11
  • 打赏
  • 举报
回复
        public IEnumerable<IDataReader> ExcuteSqlDataList(List<ExtSqlInfo> sqlList, Dictionary<int, List<SqlWhereOperatorInfo>> whereOpGroupInfoMap) 
        {
            SortSqlList(sqlList);
            string connstr = ConfigurationManager.ConnectionStrings["Conn1"].ConnectionString;

            DatabaseHelper dbHelper = new DatabaseHelper(connstr, Providers.ODBC);
            //using(DatabaseHelper dbHelper = new DatabaseHelper(connstr, Providers.ODBC))
            {
                for (int i = 0, imax = sqlList.Count; i < imax; i++)
                {
                    ExtSqlInfo sqlInfo = sqlList[i];
                    List<OdbcParameter> parameterList;
                    string sql = GetSql(sqlInfo, whereOpGroupInfoMap, out parameterList);

                    switch ((SqlTypeEnum)sqlInfo.SqlType)
                    {
                        case SqlTypeEnum.NonQuery:
                            int ret = dbHelper.ExecuteNonQuery(sql, parameterList != null ? parameterList.ToArray() : null, connectionstate: BaseDal.ConnectionState.KeepOpen);
                            if (ret < 0)
                                yield return null;
                            break;

                        case SqlTypeEnum.DataSet:
                            DbDataReader dr = dbHelper.ExecuteReader(sql, parameterList != null ? parameterList.ToArray() : null, connectionstate: BaseDal.ConnectionState.KeepOpen);
                            yield return dr;
                            break;

                        default:
                            yield return null;
                            break;
                    }
                }
            }
        }
原来是dataset 把datareader改成dataset 本质是一样的 我现在是单线程读datareader 如果多线程读datareader也是报错 dataset直接把数据全部塞进内存 如果多线程跑这个方法就报错 单线程没问题
  • 打赏
  • 举报
回复
应该是你读数据的地方有问题,而不是tostring的地方有问题
秋的红果实 2018-01-11
  • 打赏
  • 举报
回复
先上代码,不要让大家猜 -------------------------------------\0
SayHello_XXXX 2018-01-11
  • 打赏
  • 举报
回复
可能不是tostring的地方 因为是datereader捞的数据 可能是捞出来的时候解析失败

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧