【问题标题】:Date Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM OverFlow error SqlBulkCopy [duplicate]日期必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之间溢出错误 SqlBulkCopy [重复]
【发布时间】:2015-06-05 07:58:05
【问题描述】:

我正在从访问数据库读取数据并将其存储在临时 sql 表中,然后截断主 sql 表并插入新数据集,我正在使用下面的代码完成该任务,但日期时间给我带来了问题:

Console.WriteLine("NetWeightTracking-Abilene Started");
            var du = new System.Data.DataTable();
            string accdbConnStrabk = ConfigurationManager.ConnectionStrings["NetWeightAbk"].ToString();
            using (var accdbConn = new OdbcConnection(accdbConnStrabk))
            {
                using (var da = new OdbcDataAdapter("SELECT * FROM [Net Weight Tracking]", accdbConn))
                {
                    da.Fill(du);

                }
            }

            Console.WriteLine("DataTable filled from NetWeight db NetWeightTracking-Abilene - Row count: {0}", du.Rows.Count, DateTime.Now.ToString());

            string sqlConnStrabk = ConfigurationManager.ConnectionStrings["sqlconabk"].ToString();
            using (var sqlConn = new SqlConnection(sqlConnStrabk))
            {
                sqlConn.Open();
                using (var cmd = new SqlCommand())
                {
                    cmd.Connection = sqlConn;
                    cmd.CommandText = "CREATE TABLE #NetWeightTracking ([Date] [datetime] NULL,[Unit UPC Base Item] [nvarchar](50) NULL,[Item (Optional)] [nvarchar](50) NULL,[Preset Number] [nvarchar](50) NULL,[Product Group] [nvarchar](255) NULL,[Shift] [nvarchar](255) NULL,[Rotation Code] [nvarchar](255) NULL,[BBD] [nvarchar](255) NULL,[Operator Name] [nvarchar](255) NULL,[Supervisor] [nvarchar](255) NULL,[Production Line] [nvarchar](255) NULL,[Bagger Number] [float] NULL,[Start Time] [datetime] NULL,[Stop Time] [datetime] NULL,[Under Counts] [float] NULL,[Label Wt on Pkg (g)] [float] NULL,[Machine Tare Wt (g)] [float] NULL,[Actual Tare Wt (g)] [float] NULL,[Verify Target Wt (g)] [float] NULL,[Total Count (Proper)] [float] NULL,[Mean Gross (g)] [float] NULL,[Rptd Mean Net (g)] [float] NULL,[Std Dev (g)] [float] NULL,[Max (g)] [float] NULL,[Min (g)] [float] NULL,[TNE (g)] [float] NULL,[Comments] [nvarchar](50) NULL,[Field1] [datetime] NULL,[Field2] [datetime] NULL,[Field3] [nvarchar](255) NULL,[Field4] [nvarchar](255) NULL,[Field5] [nvarchar](255) NULL,[Field6] [nvarchar](255) NULL,[Field7] [nvarchar](255) NULL, [Row] [int] IDENTITY(1,1) NOT NULL)";
                    cmd.ExecuteNonQuery();
                }

                using (SqlTransaction tran = sqlConn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
                {
                    try
                    {
                        using (var sbc = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.Default, tran))
                        {

                            sbc.BatchSize = 100;
                            sbc.NotifyAfter = 100;
                            sbc.BulkCopyTimeout = 100;
                            sbc.DestinationTableName = "#NetWeightTracking";
                            Console.WriteLine(DateTime.Now.ToString());
                            sbc.WriteToServer(du);
                            Console.WriteLine("After Datatable", DateTime.Now.ToString());
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message.ToString());
                    }

                    Console.WriteLine(DateTime.Now.ToString());
                    using (var cmd = new SqlCommand())
                    {
                        cmd.Connection = sqlConn;
                        cmd.Transaction = tran;
                        cmd.CommandText = "SELECT COUNT(*) AS n FROM #NetWeightTracking";
                        Console.WriteLine("SqlBulkCopy complete. Temp table row count: {0}", cmd.ExecuteScalar());
                        cmd.CommandText = "TRUNCATE TABLE [dbo].[Net Weight Tracking]";
                        cmd.ExecuteNonQuery();
                        Console.WriteLine("Truncated NetWeightTrackingTable");

                        cmd.CommandText = "INSERT INTO [dbo].[Net Weight Tracking] ([Date],[Unit UPC Base Item],[Item (Optional)],[Preset Number],[Product Group],[Shift],[Rotation Code],[BBD],[Operator Name],[Supervisor],[Production Line],[Bagger Number],[Start Time],[Stop Time],[Under Counts],[Label Wt on Pkg (g)],[Machine Tare Wt (g)],[Actual Tare Wt (g)],[Verify Target Wt (g)],[Total Count (Proper)],[Mean Gross (g)],[Rptd Mean Net (g)],[Std Dev (g)],[Max (g)],[Min (g)],[TNE (g)],[Comments],[Field1],[Field2],[Field3])  SELECT Z.[Date],Z.[Unit UPC Base Item],Z.[Item (Optional)],Z.[Preset Number],Z.[Product Group],Z.[Shift],Z.[Rotation Code],Z.[BBD],Z.[Operator Name],Z.[Supervisor],Z.[Production Line],Z.[Bagger Number],Z.[Start Time],Z.[Stop Time],Z.[Under Counts],Z.[Label Wt on Pkg (g)],Z.[Machine Tare Wt (g)],Z.[Actual Tare Wt (g)],Z.[Verify Target Wt (g)],Z.[Total Count (Proper)],Z.[Mean Gross (g)],Z.[Rptd Mean Net (g)],Z.[Std Dev (g)],Z.[Max (g)],Z.[Min (g)],Z.[TNE (g)],Z.[Comments],Z.[Field1],Z.[Field2],Z.[Field3] FROM  #NetWeightTracking Z";
                        Console.WriteLine(DateTime.Now.ToString());
                        cmd.ExecuteNonQuery();
                        cmd.CommandText = "SELECT COUNT(*) AS m FROM [dbo].[Net Weight Tracking]";
                        Console.WriteLine("Inserted Records into NetWeightTracking:{0}", cmd.ExecuteScalar());

                    }
                    tran.Commit();
                }
            }
        }

问题是由日期列引起的 任何帮助将不胜感激

我尝试检查访问数据库以查看是否有任何空日期但没有所有日期可用,我在网上找到了这个解决方案:

DateTime.ParseExact (txtPunchDate.Text, "yyyy-MM-dd" , null)

我如何将它与我的控制台应用程序结合起来? 谢谢:)

【问题讨论】:

    标签: c# sql-server-2008 datetime console-application sqlbulkcopy


    【解决方案1】:

    好吧,MS Access represents its datetime data type as a double:

    • MS 日历的epoch(零点)是30 December 1899 00:00:00
    • double 的整数部分是距纪元的天数偏移量,并且
    • double 的小数部分是当天的小数部分。

    根据规范,MS Access datetime 的日期部分的域是

    • 下限:1 January 100
    • 上限:31 December 9999

    由于 SQL Server datetime 的域是:

    • 下限:1 January 1753
    • 上限:31 December 9999

    您的 MS Access 数据库中 1753 年 1 月 1 日之前的任何日期都会导致问题。您需要找到虚假数据并修复它。几种方法:

    • 在您的 access 数据库中,创建一个视图/查询,以 SQL Server 可以接受的形式呈现数据。然后,将其批量加载到 SQL Server 中。

    • 通常,由于您的源数据已被污染/损坏已成定局,因此在将数据批量加载到 SQL Server 时,会将源数据批量加载到所有列都可以为空的工作表中, varchar 类型并且没有约束/键。完成后,运行一个存储过程,在将数据移动到适当的位置之前对数据进行必要的清理和按摩。

    【讨论】:

    • 我检查了访问数据库,没有小于 1753 年 1 月 1 日的日期,所以为什么我仍然收到此错误??
    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多