2011-08-23 2 views
3

형식이 지정된 주소 지정 및 APN 번호와 같은 수십만 개의 다각형 행 및 기타 관련 데이터가있는 매우 큰 셰이프 파일이 있습니다. Shape2SQL과 같은 것을 사용하지 않고이 데이터를 지형이있는 테이블로 가져 오려면 어떻게해야합니까? 나는 영원히 걸릴 모든 행에 대해 insert 문을 실행할 수 없다. 최적의 해결책은 csv 또는 적절히 형식화 된 bin 파일을 작성한 다음 벌크 삽입 또는 bcp 또는 openrowset을 수행하는 것이지만 시도해보십시오. , 노력으로 CSV 파일이나 bin 파일을 얻을 수 없을 수도 있습니다. 아무도 도와 줄 수 있니?새로운 SQL Server 2008 테이블에 일괄 삽입 방법

다음 코드는 내가 관리 할 수있는 최상의 코드입니다.

SqlGeographyBuilder sql_geography_builder = new SqlGeographyBuilder(); 
sql_geography_builder.SetSrid(4326); 
sql_geography_builder.BeginGeography(OpenGisGeographyType.Polygon); 
sql_geography_builder.BeginFigure(-84.576064, 39.414853); 
sql_geography_builder.AddLine(-84.576496, 39.414800); 
sql_geography_builder.AddLine(-84.576522, 39.414932); 
sql_geography_builder.AddLine(-84.576528, 39.414964); 
sql_geography_builder.AddLine(-84.576095, 39.415015); 
sql_geography_builder.AddLine(-84.576064, 39.414853); 
sql_geography_builder.EndFigure(); 
sql_geography_builder.EndGeography(); 
SqlGeography sql_geography = new SqlGeography(); 
sql_geography = sql_geography_builder.ConstructedGeography; 


FileStream file_stream = new FileStream("C:\\PROJECTS\\test.bin", FileMode.Create); 
BinaryWriter binary_writer = new BinaryWriter(file_stream); 

sql_geography.Write(binary_writer); 
binary_writer.Flush(); 

binary_writer.Close(); 
file_stream.Close(); 
file_stream.Dispose(); 

SqlConnection sql_connection = new SqlConnection(connection_string); 
sql_connection.Open(); 

SqlCommand sql_command = new SqlCommand(); 
sql_command.Connection = sql_connection; 
sql_command.CommandTimeout = 0; 
sql_command.CommandType = CommandType.Text; 
sql_command.CommandText = "INSERT INTO [SPATIAL_TEST].[dbo].[Table_1] ([geo]) " + 
       "SELECT [ors].* " + 
       "FROM OPENROWSET(BULK 'C:\\PROJECTS\\AMP\\test.bin', SINGLE_BLOB) AS [ors] "; 
sql_command.ExecuteNonQuery(); 

sql_command.Dispose(); 
sql_connection.Close(); 
sql_connection.Dispose(); 

그러나 이것으로 폴리곤을 개별적으로 가져올 수 있습니다. 다른 모든 것들도 필요합니다.

+0

CSV 파일은 일반 작업을 해달라고. 내 유일한 희망은 여기 (http://stackoverflow.com/questions/282604/best-way-to-export-import-ms-sql-2008-geography-data) 및 위의 코드와 같이 이진 데이터 파일을 만드는 것이 었습니다. 내가하고 싶은 일이 지리학 만 가져 오기만하면 훌륭한 작품. 문제는 필자가 지리학보다 파일에 들어가는 방법이 더 많아서 바이너리 파일이나 형식 파일을 빌드하는 방법을 알 수 없기 때문에 적절한 bcp 또는 openrowset을 수행 할 수 있습니다. –

+0

향후 독자를 위해 .NET의 SqlBulkCopy가 SqlGeoegraphy 형식을 직접 삽입 할 수 있다는 것을 알고 있어야합니다. 이것에 대한 대답은 여기를 참조하십시오 : https://stackoverflow.com/a/21128445 –

답변

0

며칠간의 두통 후 나는 아무런 대답이 없다는 결론에 도달했습니다. 강력한 ESRI조차도 단서가 없습니다. Thankfully 히 나는 다른 soultion를 생각해 내었다. 내 테이블 정의에서 내 지리 WFT를 유지하기 위해 NVARCHAR (MAX) 열을 작성하고 WFT를 내 CSV 파일에 추가 한 다음 대량 삽입 후 실제 WFT를 실제 지리 유형으로 변환하기위한 테이블 전체 업데이트 명령을 실행했습니다 . SSIS 늘 대량 삽입에 대한 유효한 필드로 WFT 또는 WFD을 받아 들일 또한 WFT 포함 becuase로 분리하는 외에 다른 문자를 사용하는 CSV 파일을 조정의

SqlGeographyBuilder sql_geography_builder = new SqlGeographyBuilder(); 
sql_geography_builder.SetSrid(4326); 
sql_geography_builder.BeginGeography(OpenGisGeographyType.Polygon); 
sql_geography_builder.BeginFigure(-84.576064, 39.414853); 
sql_geography_builder.AddLine(-84.576496, 39.414800); 
sql_geography_builder.AddLine(-84.576522, 39.414932); 
sql_geography_builder.AddLine(-84.576528, 39.414964); 
sql_geography_builder.AddLine(-84.576095, 39.415015); 
sql_geography_builder.AddLine(-84.576064, 39.414853); 
sql_geography_builder.EndFigure(); 
sql_geography_builder.EndGeography(); 
SqlGeography sql_geography = new SqlGeography(); 
sql_geography = sql_geography_builder.ConstructedGeography; 

StreamWriter stream_writer = new StreamWriter("C:\\PROJECTS\\AMP\\test.csv"); 
stream_writer.AutoFlush = true; 
stream_writer.WriteLine("1?123 TEST AVE?" + sql_geography.ToString() + "?"); 
stream_writer.Flush(); 
stream_writer.WriteLine("2?456 TEST AVE?" + sql_geography.ToString() + "?"); 
stream_writer.Flush(); 
stream_writer.WriteLine("9?789 TEST AVE?" + sql_geography.ToString() + "?"); 
stream_writer.Flush(); 
stream_writer.Close(); 
stream_writer.Dispose(); 

SqlConnection sql_connection = new SqlConnection(STRING_SQL_CONNECTION); 
sql_connection.Open(); 

SqlCommand sql_command = new SqlCommand(); 
sql_command.Connection = sql_connection; 
sql_command.CommandTimeout = 0; 
sql_command.CommandType = CommandType.Text; 
sql_command.CommandText = "BULK INSERT [SPATIAL_TEST].[dbo].[Table_1] " + 
          "FROM 'C:\\PROJECTS\\AMP\\test.csv' " + 
          "WITH (FIELDTERMINATOR = '?', ROWTERMINATOR = '\n') " + 
          "" + 
          "UPDATE [SPATIAL_TEST].[dbo].[Table_1] " + 
          "SET [geo] = geography::STPolyFromText([geo_string], 4326) "; 
sql_command.ExecuteNonQuery(); 

sql_command.Dispose(); 
sql_connection.Close(); 
sql_connection.Dispose(); 

MessageBox.Show("DONE"); 
} 
catch (Exception ex) 
{ MessageBox.Show(ex.Message); }