문제

현재 SQL에 대한 지식이없는 사용자가 데이터베이스에서 다양한 쿼리를 정의 할 수있는 간단한 그래픽 인터페이스 인 쿼리 빌더 응용 프로그램을 개발 중입니다 (조인, 선택, 삽입, 업데이트, 삭제). .NET 3.5를 사용할 것입니다. 내 응용 프로그램은 여러 데이터베이스를 지원해야하며 MS-SQL Server, MySQL 및 Oracle에서 작동해야하므로 관련 강의에 대한 힌트 나 링크에 감사드립니다. 공급자 독립 DAL을 설계하는 방법.

사용자는 현재 서버의 데이터베이스 인 데이터베이스 서버를 선택하고 연결 자격 증명을 제공하고 다양한 테이블을 선택하고 쿼리를 정의하고 (일련의 콤보 상자 사용) 쿼리가 유효한 경우 쿼리를 실행합니다. 물론 DAL에서는 각 DB 제공 업체에 대한 방법을 원합니다. 나는 공장 패턴의 선에 무언가를 생각하고 있습니다.

참고 : 이것은 간단한 학교 프로젝트이므로 결과 쿼리의 보안 또는 성능에 관심이 없습니다.

업데이트: 더 많은 연구와 당신이 제공 한 매우 귀중한 의견을 가지고 나는 사용하기로 결정했습니다. DbProviderFactory. ORM은 흥미로울 것이지만 쿼리 분석기/빌더를 원하기 때문에 하나를 사용하는 점이 보이지 않습니다. 따라서 사용 방법에 대한 자세한 자습서를 알려 주시면 감사하겠습니다. DbProviderFactory 그리고 관련 클래스.

도움이 되었습니까?

해결책

나는 사용하는 것이 좋습니다 System.Data.Common.DbProviderFactories 일반 ADO.NET 클래스를 생성하는 클래스.

지원하려는 데이터베이스에 대한 .NET 제공 업체를 더 많이 찾으려면 앱 경로에 제공자 DLL을 떨어 뜨리고에 대한 참조를 추가하십시오. DbProviderFactory 공급자의 app.config 파일. 사용자가 사용할 공급자를 선택할 수 있습니다.

다음은 주제에 대한 MSDN 기사입니다 a DbProviderFactory (ado.net)

이전 에이 접근법을 사용했으며 사소한 구성 변경으로 동일한 프로젝트에서 MSSQL 및 SQLITE를 지원할 수있었습니다.

확실하지 않습니다. 쿼리 빌더 앱에도 잘 작동하는 경우…

다른 팁

나는 합리적으로 복잡한 쿼리를 시각적으로 편집하는 것이 매우 번거 롭습니다. 또한 사용자가 비주얼 디자이너를 사용하여 데이터를 삽입/삭제할 수 있도록하는 것은 발에 자신을 촬영하는 특정한 방법입니다. Management Studio의 크기 다운 버전 인 Basic SQL Plus 제한 서버 사용자에 대한 지식은 훨씬 더 나은 작업을 수행 할 것입니다.

여전히이 앱을 디자인하는 경향이 있다면 nhibernate가 필요합니다. 더 정확하게, 기준 쿼리 그들이 당신이 필요로하는 것에 가깝게 매핑되기 때문에 일을 할 것입니다.

당신은 놀랄 수도 있지만, 매우 간단한 제공자 독립적 인 DAL은 평범한 오래된 것으로 달성 할 수 있습니다. DataSet 그리고 DataTable.

ADO.NET 엔티티 프레임 워크 (.NET 3.5 SP1 이후 사용 가능)는 엔티티 SQL 언어로 데이터베이스 의존적 SQL을 거의 추상화하기 때문에 훌륭한 선택이라고 생각합니다.

대부분의 ORM (Object-Relational Mapper)은 다양한 데이터베이스 유형과 대화하는 방법을 알고 있습니다.

사용자가 자신의 쿼리를 구축 할 수 있도록하기 위해서는 다음과 같이 조심해야합니다. 사용자가 사고로 악의적 인 쿼리를 만들 수있는 것은 그리 많지 않습니다. 사용 가능한 모든 서버 리소스를 사용하고 데이터베이스에 대한 효과적인 서비스 거부를 만드는 쿼리를 작성하는 것은 놀랍게도 쉽습니다.

이것이 당신의 퀘스트에 도움이되는지 확실하지 않지만, 최근에 배운 한 가지는 다소 배운 것 중 하나는 데이터 모델의 고유 식별자 구현이 데이터 계층 밖에서 직접 전파되지 않고 추상화로 래핑하는 것입니다. 예를 들어 다음은 모델의 식별자를 래핑하는 인터페이스입니다.

public interface IModelIdentifier<T> where T : class 
{
    /// <summary>
    /// A string representation of the domain the model originated from.
    /// </summary>
    string Origin { get; }

    /// <summary>
    /// The model instance identifier for the model object that this 
    /// <see cref="IModelIdentifier{T}"/> refers to.  Typically, this 
    /// is a database key, file name, or some other unique identifier.
    /// <typeparam name="KeyDataType">The expected data type of the 
    /// identifier.</typeparam>
    /// </summary>
    KeyDataType GetKey<KeyDataType>();

    /// <summary>
    /// Performs an equality check on the two model identifiers and 
    /// returns <c>true</c> if they are equal; otherwise <c>false</c> 
    /// is returned.  All implementations must also override the equal operator.
    /// </summary>
    /// <param name="obj">The identifier to compare against.</param>
    /// <returns><c>true</c> if the identifiers are equal; otherwise 
    /// <c>false</c> is returned.</returns>
    bool Equals(IModelIdentifier<T> obj);
}

과거에 전달 된 비즈니스 로직 계층 ints 고유 식별자 (예 : 데이터베이스 테이블의 ID 열에서)로서 다음과 같이 전달됩니다.

    public IPerson RetrievePerson(IModelIdentifier<IPerson> personId)
    {
        /// Retrieval logic here...
    }

그러면 데이터 계층이 구현되는 클래스가 있습니다. IModelIdentifier<Person> 물리적 모델의 고유 식별자로 내부 데이터 유형을 채 웁니다. 이것은 데이터 계층에서 가질 수있는 모든 변경 사항에서 비즈니스 계층을 절제합니다. int 주요 식별자 Guid에스.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top