2011-04-11 4 views
1

C#에서 SQL 대량 복사를 사용하여 Excel의 값을 테이블에 채우고 있습니다.SQL 대량 복사에 특정 값을 가진 열을 삽입하는 방법

DataTable dt = new DataTable(); 

string line = null; 
int i = 0; 

using (StreamReader sr = File.OpenText(@"c:\temp\table1.csv")) 
{ 
     while ((line = sr.ReadLine()) != null) 
     { 
      string[] data = line.Split(','); 
      if (data.Length > 0) 
      { 
        if (i == 0) 
        { 
        foreach (var item in data) 
        { 
         dt.Columns.Add(new DataColumn()); 
        } 
        i++; 
      } 
      DataRow row = dt.NewRow(); 
      row.ItemArray = data; 
      dt.Rows.Add(row); 
      } 
     } 
} 


using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConsoleApplication3.Properties.Settings.daasConnectionString"].ConnectionString)) 
{ 
     cn.Open(); 
     using (SqlBulkCopy copy = new SqlBulkCopy(cn)) 
     { 
      copy.ColumnMappings.Add(0, 0); 
      copy.ColumnMappings.Add(1, 1); 
      copy.ColumnMappings.Add(2, 2); 
      copy.ColumnMappings.Add(3, 3); 
      copy.ColumnMappings.Add(4, 4); 
      copy.DestinationTableName = "Censis"; 
      copy.WriteToServer(dt); 
     } 
} 

위 코드에서 Excel의 레코드를 테이블에 삽입하려고합니다. 그러나 Censis 테이블에는 "ProcessID"라는 열이 하나 더 있습니다. 매번 실행할 때마다 GUID를 생성하고이 열을 채워야합니다.

위와 같이 실행될 모든 행에 대해 생성 된 GUID를 사용하여 대량 복사를 수행 할 때 ProcessID 열을 채우는 방법을 알려줄 수 있습니까?

답변

0

당신이 데이터베이스로 삽입 기능 newsequentialid

+0

자세한 내용을 추가 할 수 있습니까? – guiomie

-1

감사 JonH을 사용 할 때. 하지만, 내 문제에 대한 답을 찾았습니다. 이런 식으로 사용할 수 있습니다. 대량 복사에 사용할 데이터 테이블에 기본값이있는 새 DataColumn을 추가 할 수 있습니다.

DataTable dt = new DataTable(); 

string line = null; 
int i = 0; 

using (StreamReader sr = File.OpenText(@"c:\temp\table1.csv")) 
{ 
     while ((line = sr.ReadLine()) != null) 
     { 
      string[] data = line.Split(','); 
      if (data.Length > 0) 
      { 
        if (i == 0) 
        { 
        foreach (var item in data) 
        { 
         dt.Columns.Add(new DataColumn()); 
        } 
        i++; 
      } 
      DataRow row = dt.NewRow(); 
      row.ItemArray = data; 
      dt.Rows.Add(row); 
      } 
     } 

     DataColumn col = new DataColumn("BatchId", typeof(System.Guid)); 
     col.DefaultValue = Guid.NewGuid(); 
     dt.Columns.Add(col); 
} 


using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConsoleApplication3.Properties.Settings.daasConnectionString"].ConnectionString)) 
{ 
     cn.Open(); 
     using (SqlBulkCopy copy = new SqlBulkCopy(cn)) 
     { 
      copy.ColumnMappings.Add(0, 0); 
      copy.ColumnMappings.Add(1, 1); 
      copy.ColumnMappings.Add(2, 2); 
      copy.ColumnMappings.Add(3, 3); 
      copy.ColumnMappings.Add(4, 4); 
      copy.DestinationTableName = "Censis"; 
      copy.WriteToServer(dt); 
     } 
} 
+1

.net을 사용하여 GUID를 생성하는 것은 권장하지 않습니다. 이로 인해 데이터와 조각화 사이에 간격이 생깁니다. newsequentialid()를 사용하는 것이 좋습니다. – JonH

관련 문제