C#에서 SQL Server 기본 파일을 만들 수 있습니까 (예 : BCP 기본 형식)
-
05-07-2019 - |
문제
15 년 된 코드베이스를 업그레이드하고 있으며 일부 기본 BCP 형식 데이터 파일을 만들어야합니다.
새 시스템에서는 C# DataTable 객체의 데이터를 사용하여 데이터 파일을 기본 BCP 형식으로 작성하는 것이 이상적입니다.
이 작업을 수행 할 수 있으며 그렇다면 최선의 접근 방식은 무엇입니까?
해결책
아니요, 할 수 없습니다. 기본 BCP 파일을 만드는 유일한 방법은 SQL Server를 사용하는 것입니다. 누군가가 개발하거나 다른 방법을 찾으면 여기에 게시하십시오!
다른 팁
그것이 오래된 경우, BCP 조각은 Sybase BCP 조각처럼 보일 수 있습니다. Sybase에서는 클라이언트 라이 바리를보고 BCP API를 사용하여 코드의 예제를 배송했습니다. 해당 API에 대한 CTLIB 및/또는 Java 항아리. Microsoft의 경우 BCP와 관련된 기본 C 또는 기본 API의 비슷한 부분이있을 수 있습니다. API의 커뮤니케이션 부분이 필요하지 않을 수 있습니다. 레코드별로 단지 레코드를 준비하고 파일을 읽거나 읽습니다.
그러한 것이 없다면, 원래 BCP 프로그램에 의해 생성/소비 된 손으로 만든 FMT 파일 및 텍스트와 같은 데이터 파일로 비 원어식 형식을 고려합니다.
이를 수행하는 방법은 비슷하지만 SQLDMO를 참조해야하며 BCP와 같은 동등한 형식을 만듭니다. SQLDMO의 BulkCopy 객체를 사용하면 원하는대로 할 수 있습니다. 다음은 SQLDMO 라이브러리를 사용하는 vbscript에서 수행 된 루틴에 대한 링크입니다. 여기.
이것이 도움이되기를 바랍니다.
DataTable의 데이터를 SQL 서버의 스테이징 영역에 넣을 수 있습니까? 그렇다면 BCP 프로세스를 스폰 할 수 있습니다.
BCP : http://msdn.microsoft.com/en-us/library/aa174646%28sql.80%29.aspx
예를 들어, 나는 다음을 사용한다.
BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n
스위치 :
- -S는 서버 용입니다
- -T는 신뢰할 수있는 연결을위한 것입니다
- -N은 기본 형식입니다
편집 + 새로운 아이디어 :
DataTable을 채우는 쿼리에 액세스 할 수있는 경우 BCP 또는 SQLDMO를 사용하여 기본 형식 파일을 내보낼 수 있습니다. 다음 쿼리는 인라인 쿼리가 포함되어 있기 때문에 아웃 스위치 대신 쿼리 아웃 스위치를 사용합니다.
보기에서 특정 열 내보내기 :
BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n
조인에서 특정 열을 내보내기 :
BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n
대상 테이블의 열 유형 만 고정했다고 가정하면 무효가없고 유니 코드 문자열이 없으며 Endian-Inness를 기꺼이 처리한다고 가정하면 기본 파일 형식은 유형의 바이트입니다.
최근에 스테이징 파일 바이트 별 바이트를 작성하고 BCP를 사용하여 AC# 스크립트에서 수입 데이터를 대량으로 가져 왔습니다.
bcp destTable in model.raw -T -S _serverName -n
model.raw iscreated byte-wise by :
fileBytes = new byte[theLength * 4]; // * 4 bytes per element for int and float
var offset =0;
foreach (var element in outputDimensions)
{
// fastCopy is a faster and "Unsafe" equivelent of BlockCopy , faster because it doesn't create an intermediate byte array.
//Buffer.BlockCopy(BitConverter.GetBytes(profileid), 0, fileBytes, offset, 4);
Utilities.fastCopy(profileid, fileBytes, offset);
offset += 4;
Utilities.fastCopy(element.index, fileBytes, offset);
offset += 4;
for (var i = 0; i < TimeSlices; i++, offset += 4)
{
float target = GetDataForTime(i,...);
Utilities.fastCopy(target, fileBytes, offset);
}
}
FileStream dataWriter.Write(fileBytes , 0, byteArray.Length);