2017-07-25 6 views
0

Mon application est utilisée pour copier des tables d'un database et de les dupliquer à un autre, j'utilise smo et c#. Mon code:NullReferenceException lors de la création d'une table avec DateTime Column (SMO, C#)

private static void createTable(Table sourcetable, string schema, Server destinationServer, 
     Database db) 
    { 
     Table copiedtable = new Table(db, sourcetable.Name, schema); 

     createColumns(sourcetable, copiedtable); 

     copiedtable.AnsiNullsStatus = sourcetable.AnsiNullsStatus; 
     copiedtable.QuotedIdentifierStatus = sourcetable.QuotedIdentifierStatus; 
     copiedtable.TextFileGroup = sourcetable.TextFileGroup; 
     copiedtable.FileGroup = sourcetable.FileGroup; 

     copiedtable.Create(); 
    } 

private static void createColumns(Table sourcetable, Table copiedtable) 
    { 

     foreach (Column source in sourcetable.Columns) 
     { 
      Column column = new Column(copiedtable, source.Name, source.DataType); 
      column.Collation = source.Collation; 
      column.Nullable = source.Nullable; 
      column.Computed = source.Computed; 
      column.ComputedText = source.ComputedText; 
      column.Default = source.Default; 

      if (source.DefaultConstraint != null) 
      { 
       string tabname = copiedtable.Name; 
       string constrname = source.DefaultConstraint.Name; 
       column.AddDefaultConstraint(tabname + "_" + constrname); 
       column.DefaultConstraint.Text = source.DefaultConstraint.Text; 
      } 

      column.IsPersisted = source.IsPersisted; 
      column.DefaultSchema = source.DefaultSchema; 
      column.RowGuidCol = source.RowGuidCol; 

      if (server.VersionMajor >= 10) 
      { 
       column.IsFileStream = source.IsFileStream; 
       column.IsSparse = source.IsSparse; 
       column.IsColumnSet = source.IsColumnSet; 
      } 

      copiedtable.Columns.Add(column); 
     } 
    } 

Le projet parfaitement fonctionne avec le vent du Nord database, cependant, avec quelques tables de AdventureWorks2014 database j'obtiens l'exception intérieure suivante à copiedtable.Create();:

NullReferenceException: objet de référence non définie à une instance d'un objet.

Je soupçonne que la colonne AdventureWorks datetime peut être la cause du problème (données est entré comme: 2008-04-30 00: 00: 00.000)

+2

double possible de (https://stackoverflow.com/ questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

Répondre

0

J'ai résolu moi-même ce problème et il était très intéressant . Je n'ai trouvé aucune valeur nulle ni dans la table elle-même, ni dans ses colonnes. Ensuite, j'ai réalisé que AdventureWorks2014 DB utilisait des types de données définis par l'utilisateur et des collections de schémas XML. Comme je ne les ai pas copiés, ils n'ont pas pu être consultés et la création de la table a échoué. Il est seulement nécessaire de copier des collections du schéma XML et les types de données définis par l'utilisateur à la seconde base de données: [? Qu'est-ce qu'un NullReferenceException, et comment puis-je résoudre ce problème]

private static void createUserDefinedDataTypes(Database originalDB, Database destinationDB) 
    { 
     foreach (UserDefinedDataType dt in originalDB.UserDefinedDataTypes) 
     { 
      Schema schema = destinationDB.Schemas[dt.Schema]; 
      if (schema == null) 
      { 
       schema = new Schema(destinationDB, dt.Schema); 
       schema.Create(); 
      } 
      UserDefinedDataType t = new UserDefinedDataType(destinationDB, dt.Name); 
      t.SystemType = dt.SystemType; 
      t.Length = dt.Length; 
      t.Schema = dt.Schema; 
      try 
      { 
       t.Create(); 
      } 
      catch(Exception ex) 
      { 
       throw (ex); 
      } 

     } 

    } 
private static void createXMLSchemaCollections(Database originalDB, Database destinationDB) 
    { 
     foreach (XmlSchemaCollection col in originalDB.XmlSchemaCollections) 
     { 
      Schema schema = destinationDB.Schemas[col.Schema]; 
      if (schema == null) 
      { 
       schema = new Schema(destinationDB, col.Schema); 
       schema.Create(); 
      } 
      XmlSchemaCollection c = new XmlSchemaCollection(destinationDB, col.Name); 

      c.Text = col.Text; 
      c.Schema = col.Schema; 


      try 
      { 
       c.Create(); 
      } 
      catch(Exception ex) 
      { 
       throw (ex); 
      } 

     } 

    }