代码之家  ›  专栏  ›  技术社区  ›  Chad

如何对可为空列使用sqlbulkcopy

  •  2
  • Chad  · 技术社区  · 15 年前

    当涉及可为空列时,使用sqlbulkcopy有问题。听起来好像sqlbulkcopy不知道如何处理可为空的列,并且在遇到长度为零的列时抛出非法的大小错误。错误是 “从BCP客户端接收到无效的列长度…”

    我想知道处理这个问题的最佳做法是什么。 This 似乎是一个很好的论坛帖子描述这个问题,以及如何解决读取csv文件。

    我认为我的处境相当典型和简单。我需要将未知数量的数据从一个数据库表移动到另一个数据库。对我来说,更简单的答案是在sql server中使用ssis/dts或链接服务器,但是客户希望应用程序执行数据移动。

    有没有一个已知的解决方法来解决这个问题,或者有一个更好的方法来移动带有空字段的数据?

    //access db
    string src_db = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SourceDB.mdb;Jet OLEDB ";
    //sql db
    string dest_db = @"Data Source=.\TEST;Initial Catalog=testdb;User Id=user;Password=password;";
    string sql = "";
    OleDbConnection sdb = new OleDbConnection( src_db );
    OleDbCommand cmd = new OleDbCommand( sql, sdb );
    OleDbDataReader rs = null;
    
    SqlConnection db = new SqlConnection( dest_db );
    SqlCommand clear = null;
    SqlBulkCopy bulk_load = null;
    
    // Read in the source table
    sql = "select * from someTable";
    sdb.Open();
    cmd = new OleDbCommand( sql, sdb );
    rs = cmd.ExecuteReader();
    
    // Import into the destination table
    bulk_load = new SqlBulkCopy( db );
    bulk_load.DestinationTableName = "test";
    bulk_load.WriteToServer( rs );
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Chad    15 年前

    SqLBulkCopype类不能处理空字段。在尝试计算字段长度之前,它不会检查字段是否为空。从而抛出一个错误。

    我在问题中引用的帖子引用了IDataReader的一个实现,该实现抛出dbnull.value,而不仅仅是空值——这可以解决SqlBulkCopy的缺陷。

        2
  •  0
  •   MkUltra    15 年前

    如果您在有问题的目标字段中签入了空值,那么它应该可以工作。