c# - SqlBulkCopy 拒绝将 String.Empty 转换为 INT NULL

标签 c# sql-server-2005 ado.net sqlbulkcopy

最近,我的任务是创建一个自动化的 ETL 过程,该过程通过读取主映射文件,根据平面文件名将数据泵入表中。我决定使用 SqlBulkCopy,一切似乎都很好。 IDataReader 接口(interface)用于读取平面文件,SQL Server 的元数据提供一对一数据映射的列数,一切正常,直到我遇到包含空字符串的文件。 SqlBulkCopy 抛出异常,指出“数据源中 String 类型的给定值无法转换为指定目标列的 int 类型。”。故事结束,它甚至不关心此列的 DB 类型是 INT NULL。我知道我可以进一步解释元数据,提取给定列的数据类型,基于提取的信息构建数据集,从平面文件中重新转换数据并为自己提供一个很好的强类型解决方案,但我是一个懒惰的家伙,如果有人知道我突然出现的问题的解决方案,他会觉得自己的幸福被微软恶意破坏,或者我自己的无能。感谢您的宝贵时间。

List<String> fileNames;

DateTime startJobTime = DateTime.Now;

Console.WriteLine("---------------------------------------------");
Console.WriteLine("Start Time: " + startJobTime);
Console.WriteLine("---------------------------------------------");

using (SqlConnection sqlCon = new SqlConnection(sqlConnection))
{
    try
    {
        sqlCon.Open();
        sqlCon.ChangeDatabase(edwDBName);

        // Get service information for staging job
        UnivStage us = GetStagingJobInfo(jobName, sqlCon);
        us.StartJobTime = startJobTime;

         // Get a list of file names
         fileNames = GetFileList(us, args);

         if (fileNames.Count > 0)
         {
              // Truncate Staging Table
              TruncateStagingTable(us, sqlCon);
              // Close and dispose of sqlCon2 connection
              sqlCon.Close();

              Console.WriteLine("Processing files: ");
              foreach (String fileName in fileNames)
                  Console.WriteLine(fileName);
              Console.WriteLine();
          }
          else
          {
              Console.WriteLine("No files to process.");
              Environment.Exit(0);
          }

          // Re-open Sql Connection
          sqlCon.Open();

          sqlCon.ChangeDatabase(stagingDBName);


          foreach (String filePath in fileNames)
          {
               using (SqlTransaction sqlTran = sqlCon.BeginTransaction())
               {
                   using (FlatFileReader ffReader = new FlatFileReader(filePath, us.Delimiter))
                   {
                       using (SqlBulkCopy sqlBulkCopy =
                                new SqlBulkCopy(sqlCon, SqlBulkCopyOptions.Default, sqlTran))
                       {
                            SqlConnection sqlCon2 = new SqlConnection(sqlConnection);

                            SetColumnList(sqlCon2, us, sqlBulkCopy);

                            sqlBulkCopy.BatchSize = 1000;
                            sqlBulkCopy.DestinationTableName =
                                us.StagingSchemaName + "." + us.StagingTableName;

                            sqlBulkCopy.WriteToServer(ffReader);

                            sqlTran.Commit();

                            sqlCon2.Close();
                        }
                    }
                }
            }

            sqlCon.ChangeDatabase(edwDBName);
            sqlCon.Close();

            sqlCon.Open();
            SetRowCount(us, sqlCon);
            sqlCon.Close();

            us.EndJobTime = DateTime.Now;
            sqlCon.Open();
            LogStagingProcess(us, sqlCon);
            sqlCon.Close();

            Console.WriteLine(us.ProcessedRowCount + " rows inserted.");

            Console.WriteLine("---------------------------------------------");
            Console.WriteLine("Success! End Time: " + us.EndJobTime);
            Console.WriteLine("---------------------------------------------");

            Console.ReadLine();
        }
        catch (SqlException e)
        {
            RenderExceptionMessagesAndExit(e,
                "Exception have occured during an attempt to utilize SqlBulkCopy\n");
        }
    }

最佳答案

将空字符串转换为 DBNull

关于c# - SqlBulkCopy 拒绝将 String.Empty 转换为 INT NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1615866/

相关文章:

c# Regex 字符串中的非字母字符

SQL Case 语句正确的别名

SQL Server 其中 start_date 和 End_date 之间的日期

c# - DbContext 与 Ninject ADO.NET

c# - 使用 C#/ADO.Net 实体复制大型数据库时内存不足

c# - 是一个静态方法,对于不同的调用使用相同的变量

c# - .NET framework 如何为 OutOfMemoryException 分配内存?

c# - SL4 AsyncEventArgs 在第二个 Socket 连接后抛出 InvalidOperationException

javascript - 当从 javascript 接收到 ajax post 请求时, Controller 得到一个空对象

sql - 多个表上的多个 FULL OUTER JOIN