人生でいちばんスベッた瞬間

==================================
<テーブルA>
TagNo(整数)
TagID(文字列)
TagComment(文字列)

<テーブルB>
TagNo(整数)
GroupNo(整数)
==================================

のようなテーブルがあるとします。

これらのテーブルに対し、
下のようなプログラム(抜粋)を使い、
sqlでデータをselectする際、
joinを使うとエラーになります。

==================================
using System.Data;
using System.Data.OleDb;

dataTbl = new DataTable();

OleDbCommand sqlCommand = new OleDbCommand(sql, ConnectionObj, TransactionObj);

using (OleDbDataAdapter adapter = new OleDbDataAdapter(sqlCommand)) {
  adapter.Fill(dataTbl);
  adapter.Dispose();
  sqlCommand.Dispose();
}

for (int i = 0; i < dataTbl.Rows.Count; i++)
{
  DataRow dtRow = dataTbl.Rows[i];
  int tagNo = Convert.ToInt32(dtRow["TagNo"]);
}
==================================

具体的には、

(1)テーブルAのみをselectすると問題なし。

 sql = "select * from A order by A.TagNo asc";

(2)joinを使ってテーブルAとテーブルBを読み込むと例外が発生する。

 sql = "select * from A left join B on A.TagNo = B.TagNo order by A.TagNo asc"

 dtRow["TagNo"] のように列名でアクセスすると例外が発生する。

 エラーの内容:{"列 'TagNo' はテーブル に属していません。"}
 (「テーブル」と「に」の間の空白が気になりますが...。)
 エラーコード 80070057

 但し、dtRow[0] のようにインデックスでアクセスすると値を取り出せます。


そういうものなのでしょうか?
列名でアクセスできないのでしょうか?
やり方が間違いでしょうか?

困っております。
ご存知の方、情報をいただければと思います。
よろしくお願い致します。


(環境)
DB:Microsoft.Jet.OLEDB.4.0(Access mdb)
OS:win7 pro 64 sp1
C#:Microsoft Visual Studio 2012

A 回答 (2件)

>この SQL では、結果を項目名で取得しようとすると、


>A,B両方のテーブルにある値でないとだめなのでしょうか。
実際にこのSQLコマンドに対してAccessが何を返すのかを、Accessのクエリーを作って試してみてはどうでしょう?

>ちなみに、dtRow[0] のように添え字でアクセスすると、取得できるようです。
番号でアクセスした場合はフィールド名に関係なく、Accessが返したフィールドにアクセスできます。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。
あれからいろいろと試行錯誤をしたところ、できました。

Accessのクエリーも試してみました。
すると、クエリーではきちんと結果が返ってくるものの、
やはりプログラムでは動作しませんでした。
結果として dtRow["A.TagID"] ではだめで、やはり dtRow["TagID"] でした。

クセなのでしょうか。
こういうもの、と解釈しています。

アドバイスいただき、どうもありがとうございました。

お礼日時:2014/06/13 08:53

複数のテーブルから取得しているので


SELECT されたフィールド名は
「A.TagNo」「B.TagNo」「A.~」「B.~」のようになっています。
「TagNo」ではどのフィールドかを決定できません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

試してみましたところ、dtRow["A.TagNo"] として TagNo は取得できました。
ところが、TagID は dtRow["A.TagID"] としても結果が変わりません。
同じ例外が発生します。

この SQL では、結果を項目名で取得しようとすると、
A,B両方のテーブルにある値でないとだめなのでしょうか。
ちなみに、dtRow[0] のように添え字でアクセスすると、取得できるようです。

お礼日時:2014/06/06 13:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報