【发布时间】:2023-03-24 12:39:01
【问题描述】:
我编写了一个控制台应用程序,它从我的访问表中提取数据,然后使用 sql 批量复制到临时 sql 表,然后从临时表将其加载到主 sql 表中。该应用程序按预期工作,但它从访问表中提取 26624 行,当它在批量复制上执行 WriteToServer 时,它仅复制 24880 行,因此当插入主 sql 表时,仅插入 24880 行。大约 1744 行丢失,但我确实得到了一个异常
"SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 9999 年 12 月 31 日晚上 11:59:59。"
我在访问中有列,即开始时间和停止时间,这些列的默认值为 data = 12/30/1899,但时间会发生变化。
我用来移动数据的代码:
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.KeepIdentity, tran))
{
sbc.BatchSize = 10;
sbc.NotifyAfter = 100;
sbc.BulkCopyTimeout = 1000;
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();
}
}
请帮忙!!!我不知道如何找出为什么没有从我看到的默认 12/30/1899 在 1/1/1753 - 12/31/9999 之间插入的 1744 行我读过的其他文章说如果没有附加日期,它将默认日期设置为 1/1/0001,然后我可以理解它超出了预期范围,因此导致溢出。
【问题讨论】:
-
看起来您的 INSERT 中有 5 个日期时间列。您知道错误源自哪一列吗?我想您无法确定是哪个特定记录/正在导致问题?
-
@jwatts1980 不,实际上只有 3 个日期时间列日期、开始时间和停止时间您查看的其他其他列来自我正在使用的临时表。我的猜测是开始时间和停止时间,因为最低日期日期列上的日期是 2003 年 4 月 1 日,最高的是低于 9999 年 12 月 31 日的 def,所以它应该是 starttime 和 stoptime,但它的日期也在范围内。
标签: c# sql-server-2008 datatable console-application sqlbulkcopy