7

さまざまなプロバイダーを対象としたC#でSQLステートメントを作成する方法を探しています。SQLステートメントを区別する典型的な例は、PostgreSQLのLIMITとMSSQLのTOPです。

上記の2つのようなSQL構文を解決して、ユーザーが選択するプロバイダーに応じてifステートメントを作成するか、フロー制御としてtry catchステートメントを使用する唯一の方法はありますか(LIMITは機能しませんでした。代わりにTOPを試してみます)?LINQ Takeメソッドを見たことがありますが、LINQなしでこれを実行できるかどうか疑問に思っています。

言い換えると、C#には、使用できるものを見つけることができなかった汎用SQLプロバイダークラスがありますか?

4

5 に答える 5

7

Entity Framework は、さまざまなデータベースを対象にすることができます。これにより、両方のデータベースで機能する LINQ ステートメントを作成できます。Entity Framework 用の postgresql プロバイダーを見つける必要があります。いくつかの選択肢があります。

お役に立てれば。

于 2010-05-30T10:47:31.203 に答える
3

「汎用SQLプロバイダー」はないと思います。

当店では、DB2とSQL Serverの両方をサポートする必要があるため、モデル、データアクセス、およびビジネスロジッククラスを作成するレイヤーパターンを実装することを選択しました。データアクセス層は、さまざまなDBMSへの接続を処理し、モデルクラスをロードして、それらをビジネスロジックに戻します。ビジネスロジックとモデルクラスは、データアクセス層がどこでデータを取得するかを認識していません。

データアクセス層がデータベース内のストアドプロシージャを呼び出すため、SQLの違いが処理されます。両方のシステムに適切な構文で実装されたストアドプロシージャがあります。別のデータベースに移動する必要がある場合は、新しいDBMSに必要な手順を実装するだけで、すべてが正常に機能するはずです。

于 2010-05-30T13:45:50.347 に答える
3

DBLinqがあります:

Oracle、PostgreSQL、MySQL、Ingres、SQLite、Firebird、および ... SQL Server (C# 3.0) 用の LINQ プロバイダー

LINQ to SQL を使用してクエリを生成すると、生成された SQL を表示して保存することができます。

ただし、「LINQを使用せずに」要件を満たしていません。LINQ を利用できる場合は、それを使用してみませんか?

于 2010-05-30T10:46:49.367 に答える
1

Marc Tiddのアイデアに参加する-Linqが必要ない場合は、プロバイダーごとに個別のDALクラスを作成するか、各DBに実装されるストアドプロシージャを使用します。

于 2010-05-30T13:51:17.470 に答える
0

何らかの理由で、クエリ インターフェイスとしての linq が気に入らず、しばらく前に SQL 生成ライブラリの作成を開始しました。LambdaSql を見てください。今のところ、select句とwhereフィルターの基本的なシナリオが含まれています。設定フィールド、where、group by、having、order by、join、ネストされたクエリは既にサポートされています。挿入、更新、および削除は、後でサポートされる予定です。また、既存の動作を拡張するためのいくつかのポイントも含まれています。たとえば、Limitその方法を使用して実装されます。

例:

var qry = new SqlSelect
(
    new SqlSelect<Person>()
        .AddFields(p => p.Id, p => p.Name)
        .Where(SqlFilter<Person>.From(p => p.Name).EqualTo("Sergey"))
    , new SqlAlias("inner")
).AddFields<Person>(p => p.Name);

Console.WriteLine(qry.ParametricSql);
Console.WriteLine("---");
Console.WriteLine(string.Join("; ", qry.Parameters
    .Select(p => $"Name = {p.ParameterName}, Value = {p.Value}")));

出力:

SELECT
    inner.Name
FROM
(
    SELECT
        pe.Id, pe.Name
    FROM
        Person pe
    WHERE
        pe.Name = @w0
) AS inner
---
Name = @w0, Value = Sergey

詳細はこちらhttps://github.com/Serg046/LambdaSql

于 2018-09-09T21:50:55.650 に答える