2010-06-29 4 views
2

mainform을 실행하는 VS에 C# 프로그램이 있습니다.SQL Server 데이터베이스에 삽입 된 행의 수 제한

메인 폼은 저장 프로 시저가있는 SQL 데이터베이스에 데이터를 내 보내어 테이블에 저장합니다. 내 보낸 데이터는 많은 데이터 (600,000 + 행)입니다.

나는 문제가 있습니다. 내 mainform에서 "데이터베이스 쓰기 간격"이 필요합니다. 이것은 얼마나 많은 "행"이 데이터베이스로 가져올 것인지를 나타내는 숫자입니다.

그러나 내 문제는 해당 간격을 구현하는 방법에 대한 단계입니다. mainform이 실행되고 주 프로그램이 완료되면 sql은 IN 데이터를 다른 5-10 분 동안 계속 가져옵니다.

따라서 메인 폼을 닫으면 나머지 데이터를 가져올 수 없습니다.

전문 프로그래머가 어떻게 든 SQL과 통신하여 사용자가 지정한 간격으로 만 데이터를 내보낼 수있는 방법을 알고 있습니까? T

그의 C# 클래스로 완료해야합니다.

어디서부터 시작해야할지 모르겠다.

나는 differenct 컴퓨터와 cpu가 다르게 수행하기 때문에 타이머는 좋은 생각이라고 생각하지 않습니다. 어떤 조언을 주시면 감사하겠습니다.

+1

당신이 단락에 대해 들어 본 적이 삽입 달성하기 위해 ADO.NET을 사용합니까? 그것을 써. – Oded

+0

내보내기에 사용하는 코드를 표시 할 수 있습니까, 아니면 적어도 설명 할 수 있습니까? 나는 이것이 왜 문제가 될지 이해하지 못한다. 단지 "n"개 이상의 행을 데이터베이스에 보내지 말라. "mainform"으로 작성된 파일에서 가져 오기를 수행 할 SQL Server 작업을 만드는 것도 고려해 볼 수 있습니다. 응답에 대해 –

답변

2

데이터가 고정 된 형식 인 경우 (즉, 모든 행에 대해 동일한 열이 있고 그 행이 많이 변경되지 않을 경우) 일괄 삽입을 확인해야합니다. 수많은 행을 삽입하는 데 매우 빠릅니다.

기본 사항은 데이터를 텍스트 파일 (예 : csv이지만 원하는 모든 구분 기호를 지정할 수 있음)로 작성한 다음 서버에 대해 BULK INSERT 명령을 실행하는 것입니다. 인수 중 하나는 작성한 파일의 경로입니다. Windows 공유를 구성하거나 서버에서 FTP를 설정하는 서버의 폴더 (또는 서버가 액세스 할 수있는 UNC 경로)에 파일을 작성해야하기 때문에 사용하기가 약간 힘듭니다. 그래도 사용하려는 것과 똑같은 것 같습니다.
http://msdn.microsoft.com/en-us/library/ms188365.aspx

+0

주셔서 감사합니다. 하지만 제 문제는 여기에서 약간 복잡합니다. 메인 폼은 데이터가 데이터베이스로 내보내지는 동안 다른 용도로 사용됩니다. 내가 원하는 것은 : 사용자가 "50k 행을 원한다"라는 것입니다. 50K 행을 실행하면 모든 데이터를 내 보낸 후 내 C# 클래스의 데이터베이스 연결이 닫히도록해야합니다. 혼란을 드려 죄송합니다. –

+0

btw. 대량 삽입을위한 저장 프로 시저가 있습니까? exmple : 나는 SQL 연결로 C# 클래스를 가지고 있는데, 스토어드 프로 시저의 매개 변수를 만든다. 일단 호출 된 저장 프로 시저가이 대량 삽입을 실행합니까? thanks –

+0

@Tom Hangler의 첫 번째 질문 : "수출"이 의미하는 바를 조금 혼란스럽게 생각합니다. 초기 질문에서 프로그램은 600k 행을 생성하고 데이터베이스에 저장되는 것처럼 보였습니다. 이제 DB에서 50k 행을 요청하는 것 같습니다. 나는 당신이 성취하려는 것을 조금 더 명확히하는 것이 도움이 될 것이라고 생각합니다. –

0

작은으로 부하를 분할 할 수 있습니다 부하 AA 더 나은 프로세스를 중지하거나 관리하려고 다음을 SQL에 대한 모든 데이터 및 를 수출하는 대신 :

여기에 대량 삽입에 대한 MSDN 설명서입니다 청크 (10,000 레코드 정도)를 확인하고 사용자가 각로드 후에 계속할 것인지 확인하십시오. 이렇게하면로드에 대한 유연성과 제어 능력이 향상되어 600,000 개의 모든 레코드를 SQL에 덤프하고 프로세스를 관리하려고합니다.

Tim Coker가 언급 한 내용도 있습니다. 저장 프로 시저가 일부 데이터 조작을 수행하는 경우에도 대량 삽입을 통해 데이터를로드하고 저장된 프로 시저를 통해 600,000 개의 레코드를 모두 실행하기 위해 수행 한 작업을 수행 한 후 쿼리를 실행하는 것이 훨씬 빠릅니다.

+0

문제는 가능한 한 최소한의 사용자 상호 작용이되기를 바랍니다. 따라서 나는 이것을 추적 할 수있는 C#에서 뭔가를 원할 것입니다. 데이터베이스 간격이 데이터베이스 행 양과 일치하는지 확인하십시오. 있는 경우 : 데이터베이스 연결을 닫으십시오. –

+0

'데이터베이스 간격이 데이터베이스 행 금액과 일치하는 경우'당신이 그것을 분명히 할 수 있는지, 나는 당신이 무엇을하려고하는지 조용히하지 않습니다. –

+0

데이터베이스 간격은 사용자가 지정하는 간격 또는 "데이터베이스 행"입니다. 이것은 데이터베이스로 내보내려는 메인 폼으로 들어오는 데이터의 행 수입니다. 일단 그 간격이 완료되면, 데이터는 여전히 메인 폼으로 들어갈 수 있지만 데이터베이스 연결은 끝나야합니다. –

0

다른 모든 의견과 마찬가지로 이전에 BulkInsert를 사용하도록 제안합니다. 대규모 데이터 세트의 성능이 얼마나 빠르며, 더 이상 간격에 대한 개념이 더 이상 필요하지 않은지 놀랄 것입니다. 100,000 개의 레코드를 삽입하는 데는 몇 초 밖에 걸리지 않습니다.

코드 작성 방법에 따라 다르지만 ADO.당신이 당신의 코드를 dB로 Linq를 사용하고있는 경우 NET은 SqlBulkCopy의를 통해 BulkInsert에 대한 네이티브 지원을하고, http://www.knowdotnet.com/articles/bulkcopy_intro1.html

아래의 코드를 참조 이미로 LINQ의 변경 집합을 변환 데이터 컨텍스트에 확장 방법으로 작성된 일부 영리한 코드가 있습니다 내부적으로 데이터 세트와는 대량

http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/05/06/implementing-sqlbulkcopy-in-linq-to-sql.aspx

관련 문제