2012-05-12 3 views
0

가능한 중복 :
converting nvarchar value in C# to date/time equivalent in Sql변환 데이터 형식

나는 txt 파일의 데이터가 다른 열이 포함 읽어 보시기 바랍니다. 나는

SqlBulkCopy bc = new SqlBulkCopy(Consql.ConnectionString, SqlBulkCopyOptions.TableLock); 
bc.DestinationTableName = "name"; 
bc.ColumnMappings.Add(dt.Columns[0].ColumnName, "IDATE"); 
bc.ColumnMappings.Add(dt.Columns[1].ColumnName, "ITIME"); 
bc.ColumnMappings.Add(dt.Columns[2].ColumnName, "TECHID"); 
bc.ColumnMappings.Add(dt.Columns[5].ColumnName, "CNTRC"); 
bc.BatchSize = dt.Rows.Count; 
Consql.Open(); 
+0

당신이 당신의 DataTable에 열을 정의, 무엇을 유형을 설정 하시겠습니까? –

+0

질문을 편집하여 데이터 예제를 포함하고 데이터 테 이블을 작성하고 추가하는 방법을 포함 할 수 있습니다. –

답변

0

난 당신이 IDataReader에 인터페이스를 구현해야 SqlBulkCopy의를 사용하여 생각 데이터베이스에 삽입하기 전에 날짜/시간 한 컬럼의 형식을 변환해야합니다. 소스 파일에서 원하는 유형으로 값을 변환 할 수 있습니다.

귀하의 사용자 정의 독자가이

public class Reader : IDataReader 
    { 
     readonly StreamReader _streamReader; 

     readonly Func<string, object>[] _convertTable; 
     readonly Func<string, bool>[] _constraintsTable; 

     string[] _currentLineValues; 
     string _currentLine; 

     //Constructing reader you can specify your converters  
     public Reader(string filepath, Func<string, bool>[] constraintsTable, Func<string, object>[] convertTable) 
     { 
      _constraintsTable = constraintsTable; 
      _convertTable = convertTable; 
      _streamReader = new StreamReader(filepath); 

      _currentLine = null; 
      _currentLineValues = null; 
     } 


     public object GetValue(int i) 
     { 
      try 
      { 
       return _convertTable[i](_currentLineValues[i]); 
      } 
      catch (Exception) 
      { 
       return null; 
      } 
     } 


     public bool Read() 
     { 
      if (_streamReader.EndOfStream) return false; 

      _currentLine = _streamReader.ReadLine(); 


      _currentLineValues = _currentLine.Split(/*any column splitter*/); 

      var invalidRow = false; 
      for (int i = 0; i < _currentLineValues.Length; i++) 
      { 
       if (!_constraintsTable[i](_currentLineValues[i])) 
       { 
        invalidRow = true; 
        break; 
       } 
      } 

      return !invalidRow || Read(); 
     } 



//other methods... 
} 

처럼 보일 수 있습니다 그리고 당신은 다음과 같이 사용할 수 있습니다 (날짜 시간에 소스 컬럼 중 하나를 변환) :

static void Main(string[] args) 
     { 
      // Create Reader 
      var reader = GetReader(); 

      // DB connection string 
      var connectionString = @"Server={blah};initial catalog={blah-blah};Integrated Security=true";  

      using (var loader = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.Default)) 
      { 
       loader.ColumnMappings.Add(0, 2); 
       loader.ColumnMappings.Add(1, 1); 
       loader.ColumnMappings.Add(2, 3); 
       loader.ColumnMappings.Add(3, 4); 

       loader.DestinationTableName = "Customers"; 
       loader.WriteToServer(reader); 

       Console.WriteLine("Done!"); 
      } 

      Console.ReadLine(); 
     } 

     static IDataReader GetReader() 
     { 
      var sourceFilepath = "sqlbulktest.txt"; 
      //our converters! 
      var convertTable = GetConvertTable(); 

      var constraintsTable = GetConstraintsTable(); 

      var reader = new Reader(sourceFilepath, constraintsTable, convertTable); 
      return reader; 
     } 

     static Func<string, bool>[] GetConstraintsTable() 
     { 
      var constraintsTable = new Func<string, bool>[4]; 

      constraintsTable[0] = x => !string.IsNullOrEmpty(x); 
      constraintsTable[1] = constraintsTable[0]; 
      constraintsTable[2] = x => true; 
      constraintsTable[3] = x => true; 
      return constraintsTable; 
     } 

     static Func<string, object>[] GetConvertTable() 
     { 
      var convertTable = new Func<object, object>[4]; 

      convertTable[0] = x => x; 


      convertTable[1] = x => x; 


      // Convert to DateTime from specific format! 
      convertTable[2] = x => 
           { 
            DateTime datetime; 
            if (DateTime.TryParseExact(x.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture, 
             DateTimeStyles.None, out datetime)) 
            { 
             return datetime; 
            } 
            return null; 
           };  

      convertTable[3] = x => Convert.ToInt32(x); 

      return convertTable; 
     }