2017-07-30 13 views
0

まだ存在しないSQL Server宛先テーブルにSystem.Data.DataTableをダンプすることはできますか? 1つのオプションはテーブルを手動で作成することですが、ユーザー入力のCSVからインポートしているので、列の事前知識はありません。既存の宛先テーブルを持たないSqlBulkCopy.WriteToServer

 using (SqlBulkCopy bc = new SqlBulkCopy(TheConnString, options)) 
     { 
      bc.DestinationTableName = destTableName; 
      bc.WriteToServer(theTable); 
      // Problem is theTable doesnt exist on database yet! 
     } 
+0

は '' DataTable'または 'IDataReader'をtheTable'されますか? –

+0

@ScottChamberlain System.Data.DataTable – dashnick

+0

CSVには適切なデータ型、最大長、および適切な一致するリレーショナル表を作成するために必要なNULL可能性を持つスキーマがないため、データ表には一連の文字列またはオブジェクト列しかありません。 varchar(MAX)/ nvarchar(MAX)の列を使用して汎用テーブルを動的に作成することもできますが、より詳細な解決方法を提案できるように詳細を追加するとよいでしょう。 –

答えて

1

ここでは、動的にテーブルを作成し始めるためにいくつかのコードです:

static string GetSqlType(Type dataTableColunmType) 
    { 
     //per type mappings here 
     //https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings 
     if (dataTableColunmType == typeof(string)) 
     { 
      return "nvarchar(max)"; 
     } 
     else if (dataTableColunmType == typeof(int)) 
     { 
      return "int"; 
     } 
     else if (dataTableColunmType == typeof(Single)) 
     { 
      return "real"; 
     } 
     else if (dataTableColunmType == typeof(double)) 
     { 
      return "float"; 
     } 
     else if (dataTableColunmType == typeof(DateTime)) 
     { 
      return "datetime"; 
     } 
     else if (dataTableColunmType == typeof(byte[])) 
     { 
      return "varbinary(max)"; 
     } 
     else 
     { 
      throw new NotSupportedException($"Type {dataTableColunmType.Name} not supported"); 
     } 


    } 
    static string GetCreateTableDDL(string tableName, DataTable table) 
    { 
     var ddl = new StringBuilder(); 
     ddl.AppendLine($"create table [{tableName}] ("); 
     foreach (DataColumn col in table.Columns) 
     { 
      ddl.Append($" [{col.ColumnName}] {GetSqlType(col.DataType)}, "); 
     } 
     ddl.Length = ddl.Length - ", ".Length; 
     ddl.Append(")"); 

     return ddl.ToString(); 
    } 
+0

素晴らしい、Davidに感謝します! – dashnick

+0

素早い質問 - 'nvarchar(max)'を使ってデータベースを遅くするのですか?各列 'x'で最大長を見つけてから、' nvarchar(x) 'を実行すると長期的にはより効率的になりますか? – dashnick

+0

違いは小さいです。実表を設計する場合は、nvarchar(n)を使用して最大長を指定します。しかし、このような何かのためにnvarchar(max)は大丈夫です。 –

関連する問題