Dati mancanti dopo l'inserimento nella mia tabella sql finale utilizzando Sql Bulk Copy

c# console-application datatable sqlbulkcopy sql-server-2008

Domanda

Ho scritto un'applicazione console che estrae i dati dalla mia tabella di accesso, quindi utilizzando la copia bulk di sql in una tabella sql temporanea, quindi dalla tabella temporanea la carica nella tabella sql principale. l'applicazione funziona come previsto ma estrae 26624 righe dalla tabella di accesso e quando fa un WriteToServer in copia Bulk copia solo 24880 righe e quindi quando viene inserita nella tabella sql principale vengono inserite solo 24880 righe. mancano circa 1744 righe, ma ottengo un'eccezione

"Overflow SqlDateTime. Deve essere compreso tra 1/1/1753 12:00:00 e 12/31/9999 11:59:59 PM."

Ho colonne in accesso che sono ora di inizio e orario di arresto queste colonne hanno un valore predefinito di dati = 12/30/1899 ma l'ora cambia.

Il codice che ho usato per spostare i dati:

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();
    }
}

per favore aiuto!!! e non sono sicuro di come scoprire perché le 1744 righe non vengono inserite da quello che vedo il default 12/30/1899 è tra 1/1/1753 - 31/12/9999 da altri articoli che ho letto dice che se non c'era data allegata imposta la data di default a 1/1/0001 quindi posso capire che è fuori dal range previsto causando quindi l'overflow.

Risposta accettata

è necessario esaminare i dati in Access e trovare / correggere quei valori di colonna non validi o gestirli nel TSQL dopo l'esportazione. Un'opzione per il debug: sostituire la tabella temporanea con la tabella reale, sostituire il datatype datetime con la stringa, eseguire l'esportazione, quindi eseguire una query nella tabella per trovare i valori non validi in modo da sapere quale tipo di dati cercare. Successivamente, è possibile riportarlo alla tabella temporanea, ma durante l'importazione, è necessario gestire i formati di data e ora non validi nell'istruzione SELECT, probabilmente utilizzando CASE e CONVERT / CAST.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché