C#bulkcopy到SQL Server

时间:2017-10-30 00:25:56

标签: c# sql sql-server sqlbulkcopy

希望有人能帮助我理解我在这里遇到的错误。我已确认数据位于数据表中,并且SQL Server连接正常工作。但我似乎无法将数据推入临时表(或者至少我一旦看不到它)。

我已经查看了有关使用bulkcopy函数的各种帖子,但我必须遗漏一些东西,因为它似乎不起作用。

脚本运行时没有错误,但在脚本运行后我无法在DB中看到临时表。

非常感谢任何有关我出错的地方的帮助。

DataTable dt = new DataTable("Employees");
dt.Columns.Add("Name");
dt.Columns.Add("LastName");

foreach (var employee in context.Employees.AsEnumerable())
{
    dt.Rows.Add(employee.Name, employee.LastName);
}

Console.WriteLine(dt.Rows[0]["Name"]);

Console.WriteLine("Loading data into SQL");

using (SqlConnection conn = new SqlConnection("user id=<ID>;" +
                                              "password=<Password>;server=<Server>;" +
                                              "Trusted_Connection=yes;" +
                                              "database=<DB>; " +
                                              "connection timeout=30"))
{
    using (SqlCommand command = new SqlCommand("", conn))
    {
        try
        {
             conn.Open();

             // Creating temp table on database
             command.CommandText = "CREATE TABLE ##TmpTable(...)";
             command.ExecuteNonQuery();

             // Bulk insert into temp table
             using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
             {
                 bulkcopy.BulkCopyTimeout = 660;
                 bulkcopy.DestinationTableName = "##TmpTable";
                 bulkcopy.WriteToServer(dt);
                 bulkcopy.Close();
             }
         }
         catch (Exception ex)
         {
             Console.WriteLine("Bulk load to SQL failed");// Handle exception properly
         }
         finally
         {
             conn.Close();
             Console.WriteLine("table loaded into SQL");
         }
     }
}

2 个答案:

答案 0 :(得分:1)

我在WPF编程期间遇到了类似的问题......您需要在源数据表的列和目标表的列之间创建映射。在提到目的地的表名之后,我不确切知道为什么需要这样做,这应该足够了......但是下面的代码对我有用......

using (var command = new SqlCommand("SELECT COUNT(*) FROM Device_GameDevice", sqlConn, transaction) { CommandType = CommandType.Text })
                                {
 SqlBulkCopyColumnMapping mapstep = new SqlBulkCopyColumnMapping("Message", "Message");
  SqlBulkCopyColumnMapping maptran = new SqlBulkCopyColumnMapping("DeviceName", "DeviceName");
 SqlBulkCopyColumnMapping mapstt = new SqlBulkCopyColumnMapping("dt_datetime", "dt_datetime");
 SqlBulkCopyColumnMapping mapfunc = new SqlBulkCopyColumnMapping("GameName", "GameName");

 sqlBulk.ColumnMappings.Add(mapstep);
 sqlBulk.ColumnMappings.Add(maptran);
 sqlBulk.ColumnMappings.Add(mapstt);
 sqlBulk.ColumnMappings.Add(mapfunc);

 sqlBulk.DestinationTableName ="Device_GameDevice";

sqlBulk.WriteToServer(resultantDataTableForMaxDate);
command.ExecuteNonQuery();

transaction.Commit();

 }

希望这有助于......:)

答案 1 :(得分:0)

如果您关闭Connection,那么您永远不会在数据库中找到Has(#)表。 如果你想在sql server中使用你的数据,那么你需要打开你的连接,并在你使用## temptable时不要关闭。在您完成## temptable的工作之后,然后关闭连接。 ## tepmtable自动从数据库中删除。

谢谢,