System.data.common 용 사용자 정의 드라이버를 만듭니다
-
20-09-2019 - |
문제
배경:
C# 응용 프로그램은 여러 유형의 데이터베이스 (Oracle, SQL Server, MySQL)에 쿼리를 생성하고 실행하지만 독점 파일 형식에도 적용해야합니다.
- 지금까지 사용되는 네임 스페이스는 System.Data.common입니다.
- 우리가 적용 해야하는 쿼리는 사소한 일입니다 (중첩 선택, 별명, 서브 스트링 메소드 및 문자열 연결)
우리는 처음에 독점 파일의 내용을 CSV로 변환했습니다. {Microsoft 텍스트 드라이버 ( *.txt; *.csv)}. 그러나 클라이언트는 임시 파일이 생성되지 않아야했으며 모든 것이 메모리에서 발생해야합니다.
파일을 직접 쿼리하기 위해 ODBC 드라이버를 작성하는 것은 너무 시간이 많이 걸리는 것 같습니다. 따라서 우리는 드라이버 (아마도 ODBC)를 만드는 것을 고려하고 있으며, 여기서 SQLITE ODBC 드라이버를 "내부"할 것입니다. 해당 드라이버 내부에서는 "Memory"데이터베이스에 CSV 파일의 내용을로드 한 다음 쿼리를 내부 ODBC 드라이버로 전달할 수 있습니다.
내 질문 :
- 이 솔루션은 실현 가능해 보입니까?
- 처음부터 ODBC 드라이버를 만들려면 어디에서 시작해야합니까?
감사
해결책
SQLITE를 백엔드로 사용하는 경우 가능성이있는 경우 실제로 SQLITE 데이터베이스에 ADO .NET 제공 업체를 사용할 수없는 이유를 알 수 없습니다. System.data.sqlite.
귀하의 의견에서, 귀하는 모든 데이터베이스 연결 (System.Data.ODBC)에 ODBC ADO .NET 제공자를 사용하고 있다고 생각합니다. 동일한 체계를 유지해야한다면, 맞춤형 ODBC 제공 업체는 갈 길입니다 (그러나 그것은 평범한 C 기본 개발이며 다소 고통 스럽습니다).
또 다른 방법은 DB에 세 번째 매개 변수를 추가하는 것입니다 (첫 번째 두 개는 SQL과 연결 문자열)입니다. 구성 파일에서 수행해야합니다, 참조 providerName
기인하다). 이렇게하면 사용 가능한 ADO .NET 제공 업체를 사용할 수 있습니다.
그런 다음 SQLITE 제공 업체를 SQLITE DB의 생성 및 인구를 포함 할 수있는 자신의 Custom, Ado .NET 제공 업체로 SQLITE 제공 업체를 포장 할 수 있습니다. 이 솔루션의 장점 : Pure Managed .NET.
다른 팁
클라이언트 요청은 홀수입니다. 항상 관련 파일이 있고 파일에서 읽고 있습니다.
그들이 메모리에 물건을 원한다면 (다시 이상한 고객) CSV를 RAM 디스크에 넣습니다.http://members.fortmercity.com/ramdisk/ramdisk/ramdriv001.htm
Building and ODBC Drive는 성능과 안정성에 관심이있는 경우 비 치명적인 사업입니다.
솔루션이 시간이 많이 걸린다고 생각합니다. 당신이하려는 일에 대한 기존 솔루션을 찾을 수 있습니다. 다음은 몇 가지 대안입니다.
LINQ를 텍스트/CSV 파일로 시도해보십시오.
- http://www.codeproject.com/kb/linq/linqtocsv.aspx
- http://blogs.msdn.com/ericwhite/archive/2008/09/30/linq-to-text-and-linq-csv.aspx
두 솔루션 모두 메모리에 있습니다.
또 다른 아이디어는 CSV 나 텍스트 대신 XML로 파일을 내보낼 수 있다는 것입니다 (코드에서 처리해야 할 때 항상 XML로 내보내기를 선호합니다). System.XML 또는 LINQ에서 XML을 사용하는 것보다 작업을 수행합니다.
임시 파일을 생성하지 않도록 제한된 경우 SQLITE의 메모리 모드를 사용하려고 시도 할 수 있습니다. 다음은 연결 문자열 샘플입니다 (원천):
Data Source=:memory:;Version=3;New=True;
내 마음에 이것은 본격적인 공급자를 구축하는 것보다 간단합니다. $