6

ユーザーが SQL クエリをテキストとして入力できるアプリケーションがあり、アプリケーション内の C# DataTable/Dataset に対して実行する必要があります。することは可能ですか?

編集:回答に基づいて、さらに調査を行うことはできません-アプリケーションに既に読み取ったテーブルにSQLクエリを適用する方法はありません。考えられる回避策については、回答を参照してください。

編集 2: 私の場合の最終的な解決策は、ANTLR を使用して単純なパーサーを実装することでした。これにより、ユーザーは「AND」および「OR」キーワードと括弧を使用して簡単なクエリを入力できました。ANTLR で生成されたクラスは、それを一連の命令に変換し、それを使用して C# データセットをクエリできます。

4

3 に答える 3

5

ユーザーが最も単純なselectステートメント以外のものを入力する場合、これを行うのは非常に困難です。あなたのプロジェクトがSQL用の完全なパーサーを書くのは法外な費用がかかると思いますが、それは本質的にあなたが話していることです。

私たちが持っている自家製のORMの場合、基本的に事前定義されたSQLクエリをで使用できるものに変換するクラスがありますDataTable.Selectが、where句はSqlParametersから生成されます。

考えられる解決策

おそらく、次のプロジェクトを組み合わせて、自分が求めているものに近づけることができます。

Linqer(SQLからLINQへのコンバーター)、次にLINQからDataSetへ

私自身はLinqerを使用していません。

他のいくつかの考え

あなたはこれについて少し考えてきたと思いますが、これを行うのが難しいということは、少しズームアウトした方が良い方法があることを意味しているのかもしれません。厳密に言えば、不明なクエリを使用してキャッシュにクエリを実行するということは、キャッシュにすべての可能なデータを入力するか、クエリの送信時にそのデータを呼び出せるようにする必要があることを意味します。定義上、これは、ソースを直接クエリするよりも優れたパフォーマンスを提供することはできません。ただし、キャッシュが古くなる前に十分にキャッシュをヒットして、それを価値のあるものにする場合を除きます。アドホックレポートシステム(私の仮定)の場合、それが事実であると疑う傾向があります。また、エッジケース以外ではデータベースエンジンを上回らないのではないかと心配しています。

@JoshCは、Sqliteの可能性についても言及しています。また、SQL Server 2012 LocalDBもありますが、これらは確かに.netデータセットではありません。

于 2012-09-20T14:05:47.890 に答える
4

アプリケーション内のc#datatable/datasetに対して検索文字列を実行する場合

メソッドでフィルター式を使用できますselect

myDataTable.Select("columnName1 like '%" + value + "%'");

于 2012-09-20T13:48:17.250 に答える