Announcement

Collapse
No announcement yet.

C# SqlBulkCopy mit Transaction - DATENVERLUST!!!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C# SqlBulkCopy mit Transaction - DATENVERLUST!!!

    Hallo,
    ich habe ein Problem und kann mir dieses nicht erklären, ich hoffe der Bereich hier ist der richtige.
    Ich habe wie der Titel sagt eine Methode die eine Datatable annimmt und diese über Transaction und Bulkcopy in die DB schereiben soll.

    Code:
    public int DataTableBulkInsert(DataTable table)
            {
                SqlTransaction tran = null;
                SqlConnection conn = null;
    
                try
                {
                    using (
                        conn =
                            new SqlConnection(
                                ConfigurationManager.ConnectionStrings[
                                    "ConnectionString"]
                                    .ConnectionString))
                    {
                        conn.Open();
    
                        using (tran = conn.BeginTransaction())
                        {
                            using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, tran))
                            {
                                foreach (DataColumn dcPrepped in table.Columns)
                                    bulkCopy.ColumnMappings.Add(dcPrepped.ColumnName, dcPrepped.ColumnName);
    
                                bulkCopy.BatchSize = 3000;
                                bulkCopy.DestinationTableName = table.TableName;
    
                                bulkCopy.WriteToServer(table);
                            }
    
                            tran.Commit();
                            return 1;
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (tran != null)
                        tran.Rollback();
    
                    CommonFunctions.WriteException(ex, "XXXXXXXX");
                    return 0;
                }
                finally
                {
                    if (conn != null)
                        conn.Close();
                }
            }
    Wenn ich die Methode verwende gehen mir random Daten verloren bzw. werden nur Teile der Table gespeichert. Wenn ich die Methode ein zweites mal mit den restlichen Daten aufrufe, werden diese dann auch gespeichert.
    Ist der Code korrekt oder macht man das anderst?

  • #2
    Sehe da jetzt keine Lücke aber du scheinst das was using macht missverstanden zu haben. Am Ende des using sind die Objekte disposed. Heißt connections sind geschlossen, Transaktionen abgeschlossen etc. Danach noch irgendwas mit denen zu tun ist zu spät.
    Dein finally ist also funktionslos und der catch bis aufs loggen auch. Möglicherweise knallt das sogar wenn man versucht die Transaction zu commiten oder wie hier zu rollbacken wenn die bereits disposed ist. Dann bekommst du in diesem Fall auch kein Logging.

    Comment


    • #3
      Das heißt ich müsste die Exception nach innen verschieben, dann sollte alles passen. Danke

      Comment

      Working...
      X