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

C# SqlBulkCopy拒绝将String.Empty转换为INT NULL,c#,sql-server-2005,ado.net,sqlbulkcopy,C#,Sql Server 2005,Ado.net,Sqlbulkcopy,最近,我的任务是创建一个自动ETL过程,通过读取主映射文件,根据平面文件名将数据泵入表中。我决定使用SqlBulkCopy,一切似乎都很好。IDataReader接口被实现为读取平面文件,SQL Server的元数据提供了一对一数据映射的列数,在我遍历带有空字符串的文件之前,一切都正常工作。SqlBulkCopy引发异常,表示“数据源中字符串类型的给定值无法转换为指定目标列的int类型。”。最后,它甚至不关心此列的DB类型是否为INT NULL。我知道我可以进一步解释元数据,提取给定列的数据类型

最近,我的任务是创建一个自动ETL过程,通过读取主映射文件,根据平面文件名将数据泵入表中。我决定使用SqlBulkCopy,一切似乎都很好。IDataReader接口被实现为读取平面文件,SQL Server的元数据提供了一对一数据映射的列数,在我遍历带有空字符串的文件之前,一切都正常工作。SqlBulkCopy引发异常,表示“数据源中字符串类型的给定值无法转换为指定目标列的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");
        }
    }
列出文件名;
DateTime startJobTime=DateTime.Now;
Console.WriteLine(“-------------------------------------------------------------”;
Console.WriteLine(“开始时间:+startJobTime”);
Console.WriteLine(“-------------------------------------------------------------”;
使用(SqlConnection sqlCon=newsqlconnection(SqlConnection))
{
尝试
{
sqlCon.Open();
sqlCon.ChangeDatabase(edwDBName);
//获取转移作业的服务信息
UnivStage us=GetStagingJobInfo(作业名称,sqlCon);
us.StartJobTime=StartJobTime;
//获取文件名列表
fileNames=GetFileList(美国,args);
如果(fileNames.Count>0)
{
//截断暂存表
TruncateStagingTable(美国,sqlCon);
//关闭并处理sqlCon2连接
sqlCon.Close();
WriteLine(“处理文件:”);
foreach(文件名中的字符串文件名)
Console.WriteLine(文件名);
Console.WriteLine();
}
其他的
{
WriteLine(“没有要处理的文件”);
环境。退出(0);
}
//重新打开Sql连接
sqlCon.Open();
sqlCon.ChangeDatabase(stagingDBName);
foreach(文件名中的字符串文件路径)
{
使用(SqlTransaction sqlTran=sqlCon.BeginTransaction())
{
使用(FlatFileReader ffReader=新FlatFileReader(文件路径,us.Delimiter))
{
使用(SqlBulkCopy SqlBulkCopy=
新的SqlBulkCopy(sqlCon、SqlBulkCopyOptions.Default、sqlTran))
{
SqlConnection sqlCon2=新的SqlConnection(SqlConnection);
SetColumnList(sqlCon2,美国,sqlBulkCopy);
sqlBulkCopy.BatchSize=1000;
sqlBulkCopy.DestinationTableName=
us.StagingSchemaName+““+us.StagingTableName;
sqlBulkCopy.WriteToServer(ffReader);
提交();
sqlCon2.Close();
}
}
}
}
sqlCon.ChangeDatabase(edwDBName);
sqlCon.Close();
sqlCon.Open();
SetRowCount(美国,sqlCon);
sqlCon.Close();
us.EndJobTime=DateTime.Now;
sqlCon.Open();
LogStagingProcess(美国、sqlCon);
sqlCon.Close();
WriteLine(us.ProcessedRowCount+“插入行”);
Console.WriteLine(“-------------------------------------------------------------”;
Console.WriteLine(“成功!结束时间:+us.EndJobTime”);
Console.WriteLine(“-------------------------------------------------------------”;
Console.ReadLine();
}
捕获(SQLE异常)
{
RenderExceptionMessagesAndExit(e,
“尝试使用SqlBulkCopy时发生异常\n”);
}
}

将空字符串转换为
DBNull

谢谢您的回复。恐怕我做不到,因为我受到了种种限制。SqlBulkCopy正在使用的IDataReader接口只能传递字符串数组。