1


1

私は、SQL VIEWSを使って単純なデータベース計算(リレーションのカウントなど)を抽象化することで十分であり、手続き(==手続き型コード)を必要としないという考えを持っています。

単純なsql * view * a * where *句>>パラメータを持つストアドプロシージャ

この点を指摘しながら、私はSQLを書かずに、そしてwhere節を書かずにテーブル/ビューデータを検索する方法を想像しました。

しかし、驚いたことに、ADO.NET 2.0以降でこれを達成する方法はないようです。

私が試したことを教えてください。

  • SqlDataAdapter SqlCommandBuilderでは、まだ「SELECTを書く必要があります。

    1. FROM" and the WHERE CLAUSE in strings (plus, if you put the 'where’では、Update / Insert / DeleteCommandをあまり使用しないでください。

  • 型指定されたデータセットでは、データテーブル全体を取得してからフィルタを適用することしかできません。 フィルタは、エスケープすることなく文字列です。 (一重引用符を2倍にする必要があります!)

  • MSSQLに限定され、肥大化したSQLクエリを生成し、(既存のDomain Modelクラスを除く)DAOのまったく新しいスタックを生成し、これらすべてに.net 3.5を必要とするなど。 (つまり、これらすべてが私にとって不利な点です)

他のORMはSQL to Entitiesと同様の問題を抱えています。

私が探しているのは、データベーステーブル/ * _ views_ *にアクセスする厳密な型指定の方法です。

  • 他のDAOのセットは付属していません(K.I.S.S)

  • 文字列に "SELECT"を書かずにテーブルを問い合わせることができます(強い型付け)

  • 適切にエスケープされたパラメータを使ってテーブルをフィルタリング(* _ WHERE_ *)することを可能にします(そして事前にデータ全体を検索することなく)

  • 後で更新/挿入/削除を発行できます

私は.NETにはかなり慣れていますが、バカではありません。これは存在するのでしょうか。

ありがとう。

11 Answer


4


http://fluentado.codeplex.com/[FluentADO]


2


あなたがやりたいことが、ある種のORMや、データベーススキーマ、型/列情報などをどうにか知っているコンパイラ付きの特別なDSLを使わなくても達成できるとは本当に思っていません。

C#は汎用言語であり、そのコンパイラはデータベースの種類をまったく意識していないため、通常は特別なSQLクエリ(文字列)、NHibernate、または同様のマッピングファイルを含む抽象層を使用せずにバインドできません。 (より多くの文字列)および/またはDAO。


2


http://subsonicproject.com[Subsonic]にはかなり軽量な http://subsonicproject.com[queryツール]があり、SQLを抽象化したQueryオブジェクトを使ってデータベースに対して直接クエリを実行できます。 必要に応じて、そのコード生成機能を使用してデータベーステーブルをPOCOにマップしたり、厳密に型指定されたスキーマのみを作成したりすることもできます(列/テーブル名など)。


1


WHERE句を書きたくない場合は、Filterオブジェクトを使用して必要な条件を追加する方法があります。 例えば:

var sc = new Filter(); sc.Add( "Contacttitle"、 "Sales Agent"); sc.Add( "city"、 "london"、Logical.Or); var customers = D2Bk.Fetch(sc、new Customers());

しかし、DAOを使用したくない場合(上記の顧客はそのようなものです)、SQLステートメントを書いてwhere句を指定する必要があります。

DataSet ds = D2Bk.Fetch( "SELECT *顧客からの連絡先= @ PAR1または都市= @ PAR2"、 "販売代理店"、 "ロンドン");


1


私は一度ストアドプロシージャでこのようなことをしました。 基本的に、WHERE句で一致するフィールドの置換を指定したいのですが、わずかに異なるパラメータリストとwhere句を持つ100個のsprocsを書きたくありませんでした。

だから、私はこのようなことをしました:

CREATE PROCEDURE [GetSimpleCustomers](@ID varchar(50)= null、@ Name varchar(50)= null、@ IsActive bit = null、@ Address1 varchar(50)= null、@ Address2 varchar(50)= null、@ City varchar(50)= null、@State varchar(50)= null、@ Zip varchar(50)= null)AS

SELECT ID、名前、IsActive、住所1、住所2、市区町村、都道府県、郵便番号FROM SimpleCustomerExample WHERE(ID = @IDまたは@IDがNULL)AND(名前= @Nameまたは@NameがNULL)AND(IsActive = @IsActiveまたは@ IsActiveがNULL)AND(Address1 = @ Address1または@ Address1がNULL)AND(Address2 = @ Address2または@ Address2がNULL)AND(City = @Cityまたは@CityがNULL)AND(State = @Stateまたは@StateがNULL)AND(Zip = @ Zipまたは@ZipがNULL)

これはあなたがあなたのコードの中でsprocを呼び、あなたがフィルタリングに興味を持っているparamsだけを通過させるでしょう、そしてあなたがそれらをnullのままにしておくなら残りは因数分解されないでしょう。

だから、あなたはのようなことをすることができます

public List GetAllCustomersFromOhio(){リストリスト=新しいリスト(); using(SqlCommand cmd = new SqlCommand(blah blah)){cmd.Parameters.AddWithValue( "State"、 "Ohio"); //または(OH) "(IDataReader oDR = cmd.ExecuteReader()){ //レコードセットからSimpleCustomersのリストをハイドレートします。 リストを返します。 }

編集:コメントへの返信:あなたは簡単に十分に変更することでDeleteSimpleCustomersにGetSimpleCustomersを変更することができます

SimpleCustomersから選択

SimpleCustomersから削除

そして同じ論理を守ってください。 アップデートについても同様です。 また、私は質問で質問に答えます:あなたは実際にこのレベルのカスタムフィルタリングを必要とするテーブルをいくつ持っていますか? 構文は非常によく似ているので、1日ですべて書き出すことができます(または、簡単なスクリプトを組み合わせて記述した場合はそれ以下になります)。


1


私はあなたが LINQとhttp://msdn.microsoft.com/en-us/data/bb931106.aspx[ADO.Net Data Services]を見たと思います。そしてこれらはあなたの要求のいくつかを満たさないのですか?

ネイティブADO.Netはデータベースプロバイダであるため、基盤となるデータソースへの直接SQLインターフェイスを提供します。 さまざまなCRUBベースのソリューションがあり、さまざまな程度に提案したものをシミュレートしています。

データベースをデータベースチームに任せ、データベースへのメインインターフェースとしてWebサービスを使用するという強い社内的な傾向があります。これは主に、依然としてサポートが必要なDelphiコードベースのためです。

実際に私はとりわけADO.Net Data Servicesによって使用されている ADO.Net Entity Frameworkを追加するのを忘れたと信じることはできません。 LINQ to Entitiesプロバイダーもあります。


1


厳密に型指定されたデータセットを使用している場合は、クエリの先頭に@を付けた識別子を追加することによって、Visual Studioエディタでパラメータ化クエリを作成できます。 Visual StudioでDataSet XSDファイルを作成し、Productsという名前の新しいテーブルを作成し、それに新しいクエリを追加します。

例えば:

Category = @categoryのProductsから*を選択します。

これはいっぱいになったデータセットのためのメソッドを自動生成するか、追加のパラメータを取るデータテーブルを取得します。 それは文字列をエスケープするproperyも処理します(コマンドオブジェクトのパラメータを使用します)。 私はこれを使って、超簡単なプロトタイプWebアプリケーションをかなり素早く作成しました。


1


私は最近、SQLのwhere句を生成するためのクエリ 'framework’を書きました。

主なコンポーネントは、プロパティを文字列セクションに変換するためにリフレクションを使用するToWhereClause()関数を持つBaseQueryArgsクラスです。 これは値のエスケープと適切なフォーマットの作業を処理する必要があります。

BaseQueryArgsを継承するクラスは、単にパブリックプロパティを宣言するだけでよく、厳密に型指定されたクエリオブジェクトになります。 オプションのプロパティでは、値をNULL可能(ref typeまたはNullable <>)にし、SQLジェネレータはNULL値を除外します。

カスタム属性を使用して、各プロパティに追加機能を定義できます。

  • プロパティ名と異なるカスタム列名

  • カスタム値処理(BETWEENテスト式として使用されている日付値など)

これは、次のように強く型付けされた問い合わせオブジェクトを使って問い合わせを作成するために使うことができます。

MyCustomQueryArgs args = new MyCustomQueryArgs {ProductFamilyID = 17、Region = Regions.Northwest、Active = true};

リストproduct = QueryProcessor.GetProductsWhere(args);

GetProductsWhere()は明らかに、生成されたSQLでビューにアクセスするデータメソッドを呼び出します。

更新/削除の解決策はありませんが、テーブル名を決定するためにスイッチまたは属性を使用してオブジェクトインスタンスをSQLステートメントに変換するメソッドを書くのはそれほど難しくありません。

これは非常に「独自にロール」することですが、ニーズに合わせてカスタマイズすることができ、大量のORM / DAOラッピングは含まれていません。


0


http://www.mindscape.co.nz/[Mindscapes Lightspeed]製品をご覧ください。

これは、厳密に型付けされたLINQ照会可能モデルを構築して、さまざまなデータベースエンジンで効率的なSQLコードを生成し、MemcachedおよびLuceneのサポートを含みます。


0


私はいくつかのプロジェクトでXPOを使用しました、そして、それらのより新しいバージョンは質問に対するより良いサポートを持っています。

実装は、それらすべてのように、しかしその欠点がないわけではありません。