1
string query = 
    "SELECT * FROM table1, table2 WHERE table1.Id = table2.fId";
...
using(IDataReader dataReader = 
    db.ExecuteReader(CommandType.Text, query))
..
string value = dataReader["table2.field"]; //dies

現在、結合クエリを実行し、DataReader を使用して返されたデータにアクセスする .NET コードをいくつか書いています。序数位置を使用して行の値にアクセスする代わりに、何らかの接頭辞表記を使用して、返された行からフィールドにアクセスできるかどうか疑問に思っています (両方のテーブルに重複するフィールドが含まれている場合)。名前)?

4

5 に答える 5

7

事前にフィールド名を知っているので、selectステートメントでそれらを表現してみませんか?

string query = "SELECT table2.field as field2, ... FROM table1, table2 " + 
               "WHERE table1.Id = table2.fId";

次に、を参照できますdataReader["field2"]

于 2009-06-02T16:49:31.020 に答える
3

リソースを浪費するため、select*クエリを本番サーバーに送信しないでください。結合がある場合、少なくとも1つのフィールドが繰り返され、両方を送信するために送信する必要はありません。また、実際にすべての列が必要なわけではない場合は、すべての列を返す必要はありません。さらに、データベース構造の変更に応じて、select*を使用してコードを解読します。これは本当に悪い考えです。

また、ANSII92結合構文の使用方法も実際に学ぶ必要があります。使用する構文は18年しか古くなく、where句の結合条件の1つを忘れるとクロス結合が頻繁に発生するため、多くの問題が発生する可能性があります(ANSII 92結合構文を使用すると、これは渡されません)構文チェック)。また、SQL Serverで古いスタイルの左結合構文(* =)を使用すると、常に正しい答えが得られるとは限りません。これは、クロス結合として解釈される場合がありますが、一貫性がないためです(また、そのスタイルの左結合は非推奨であり、許可されません)。次のバージョンで)。使用しているデータベースはわかりませんが、SQL Serverバックエンドを使用している場合は、そのことに注意する必要があります。

于 2009-06-02T17:11:02.600 に答える
1

フィールドリストの代わりに*を使用することは、スタックオーバーフローの有権者によって決定されるナンバーワンのSQLアンチパターンです。

最も一般的なSQLアンチパターンは何ですか?

于 2009-06-02T17:30:05.257 に答える
0

選択の結果は、列のソースに関係なく単一のテーブルになります。テーブルに共通の列がある場合、不平を言う傾向があることがわかります。:)上にリストしたテーブルに一意の列がある場合は、単に["field"]があります。

于 2009-06-02T16:49:58.083 に答える
0

正当な場合があります。おそらく、データリーダーまたはストアドプロシージャが渡され、ツールやユーティリティライブラリなどのソースを必ずしも制御できるとは限りません。

一般的には*を使用せず、代わりにエイリアシングを使用することをお勧めしますが

DataReader.GetSchemaTableを使用し、BaseTableNameを確認することで、必要なものを取得できます。

また、ExecuteReader(System.Data.CommandBehavior.KeyInfo)を使用してExecuteReaderを呼び出す必要があります。

于 2009-06-02T17:34:26.547 に答える