【问题标题】:SqlDateTime Overflow must be between 1/1/1753 and 12/31/9999 coming from access to sqlSqlDateTime 溢出必须介于 1/1/1753 和 12/31/9999 之间,来自对 sql 的访问
【发布时间】:2015-08-14 21:01:39
【问题描述】:

我正在从 MS Access 数据库中获取数据,并在我的控制台应用程序中使用此代码将其移动到 SQL Server:

if (getvalue == "plantname")
{
        Console.WriteLine("NetWeightMasterData-Plant Started");
        var dw = new System.Data.DataTable();
        string accdbConnStriok = ConfigurationManager.ConnectionStrings["NetWeightIok"].ToString();
        using (var accdbConn = new OdbcConnection(accdbConnStriok))
        {
       using (var da = new OdbcDataAdapter("SELECT [Unit UPC Base Item],
    [Production Line],[Preset Number],[Package Type],[Weight Factor],
    [Piece],[Pcs Per Unit],[Upper Limit Unit],[Upper Limit Factor],
    [Label Wt (g)],[Tare Wt (g)],[Constant Tare Wt (g)],
    [Tare Variation Factor (g)],[Pkg Length (mm)],[Film Product Code],
    [Film Width (mm)],[Forming Tube (mm)],[Type of Jaws],[Last Updated],
    [Comments] FROM [Net Weight Master Data]", accdbConn))
           {
             da.Fill(dw);

           }
        }
    Console.WriteLine("DataTable filled from NetWeight db NetWeightMasterData-Iola- Row count: {0}", dw.Rows.Count, DateTime.Now.ToString());
    string sqlConnStriok = ConfigurationManager.ConnectionStrings["sqlconiok"].ToString();
     using (var sqlConn = new SqlConnection(sqlConnStriok))
       {
         sqlConn.Open();
         using (var cmd = new SqlCommand())
       {
          cmd.Connection = sqlConn;
         cmd.CommandText = "CREATE TABLE #NetWeightMasterData ([Unit UPC Base Item] [nvarchar](50) NOT NULL,[Production Line] [nvarchar](50) NOT NULL,
    [Preset Number] [nvarchar](50) NULL,[Package Type] [nvarchar](50) NULL,
    [Weight Factor] [float](53) NULL,[Piece] [nvarchar](255),
    [Pcs Per Unit] [float](53) NULL,[Upper Limit Unit] [nvarchar](50) NULL,
    [Upper Limit Factor] [float](53) NULL,[Label Wt (g)] [float](53) NULL,
    [Tare Wt (g)] [float](53) NULL,[Constant Tare Wt (g)] [float](53) NULL,
    [Tare Variation Factor (g)] [float](53) NULL,
    [Pkg Length (mm)] [float](53) NULL,[Film Product Code] [nvarchar](255) NULL,
    [Film Width (mm)] [int] NULL,[Forming Tube (mm)] [int] NULL,
    [Type of Jaws] [nvarchar](255) NULL,[Last Updated] [datetime] NULL,
    [Comments] [nvarchar](255) 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 = "#NetWeightMasterData";                                       Console.WriteLine(DateTime.Now.ToString());
        sbc.WriteToServer(dw);
        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 #NetWeightMasterData";
           Console.WriteLine("SqlBulkCopy complete. Temp table row count: {0}", cmd.ExecuteScalar());
         cmd.CommandText = "TRUNCATE TABLE [dbo].[Net Weight Master Data]";
        cmd.ExecuteNonQuery();
        Console.WriteLine("Truncated NetWeightMasterDataTable");
     cmd.CommandText = "INSERT INTO [dbo].[Net Weight Master Data] 
([Unit UPC Base Item],[Production Line],[Preset Number],[Package Type],
    [Weight Factor],[Piece],[Pcs Per Unit],[Upper Limit Unit],
    [Upper Limit Factor],[Label Wt (g)],[Tare Wt (g)],
    [Constant Tare Wt (g)],[Tare Variation Factor (g)],
    [Pkg Length (mm)],[Film Product Code],[Film Width (mm)],
    [Forming Tube (mm)],[Type of Jaws],[Last Updated],
    [Comments]) SELECT Z.[Unit UPC Base Item],Z.[Production Line],
    Z.[Preset Number],Z.[Package Type],Z.[Weight Factor],
    Z.[Piece],Z.[Pcs Per Unit],Z.[Upper Limit Unit],
    Z.[Upper Limit Factor],Z.[Label Wt (g)],Z.[Tare Wt (g)],
    Z.[Constant Tare Wt (g)],Z.[Tare Variation Factor (g)],
    Z.[Pkg Length (mm)],Z.[Film Product Code],Z.[Film Width (mm)],
    Z.[Forming Tube (mm)],Z.[Type of Jaws],Z.[Last Updated],
    Z.[Comments] FROM #NetWeightMasterData Z";
        Console.WriteLine(DateTime.Now.ToString());
        cmd.ExecuteNonQuery();
        cmd.CommandText = "SELECT COUNT(*) AS m FROM [dbo].[Net Weight Master Data]";
       Console.WriteLine("Inserted Records into NetWeightMasterData:{0}", cmd.ExecuteScalar());
    }
     tran.Commit();
     Console.WriteLine("do you wann to insert NetWeightMasterData data into another plant please type y for yes and n for no");
     string answer = Console.ReadLine();
        if (answer == "y")
        {
       LoadNetWeightMasterData();
        }
       else
        {
        LoadNetWeightTracking();
        }
       }
       }
       }

我的 Access 表中有一些空日期,但在我的 SQL Server 表中,我让它允许空值,但我仍然收到错误

SqlDateTime 溢出必须在 1/1/1753 和 12/31/9999 之间

我意识到当日期格式不正确时也会出现此错误,但我也检查了它并且一切看起来都很好,那么我还缺少什么?

【问题讨论】:

    标签: c# sql ms-access console-application


    【解决方案1】:
    1. 建议 1:如果要确保每一行都采用正确的 SQL Server 日期时间格式,则可以在数据表中写入一个 foreach,然后在数据表中填充来自 AccessDb 的数据并检查它是否小于 1753/1/1 ...如果为真,则分配一个有效值(null 或 GETDATE())。
    2. 建议 2:您可以在 c# 中使用属性 System.Data.SqlTypes.SqlDateTime.MinValue 更新数据行。 (在这里查看:https://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.minvalue(v=vs.110).aspx

    【讨论】:

    • 谢谢巴德,而不是我去访问的所有内容,并做了从最旧到最新的排序,我很震惊地在 1414 年 11 月 1 日的列中找到了这个日期 :) 所以我不得不更换一年我可以使用的东西,数据加载成功
    • @ExpertWannaBe 很高兴您找到了解决方案并且可以继续前进。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多