- 題名: VB2010からのSQLコマンドの結果
- 日時: 2014/04/05 19:33:28
- ID: 32240
- この記事の返信元:
- (なし)
- この記事への返信:
- [32242] Re[1]: VB2010からのSQLコマンドの結果2014/04/06 1:00:40
- ツリーを表示
「ー」が「―」になっている点が気になりますが、それは置いといて…。 ■No32240に返信(sironekoさんの記事) > としてみましたがうまくいきません。(選択されません) Access と結果が異なるとのことですが、Access 97 が使用する SQL 構文は ANSI 89 モードの物ですが、Jet OLE DB Provider Version 4.0 のそれは ANSI 92 モードであるため、微妙に差異を生じているのかも知れません。 (ちなみに、同 3.51 Provider は ANSI 89 モードが採用されています) 3 点確認させてください。 (1) 両方の N_CD のフィールド長は同一でしょうか? 長さが異なっていたとか、"A1" の後ろに余計な文字(空白、Tab、NULL文字等)が 含まれていたといった可能性はありませんか? (2) N_CD のテキスト型は、CHAR タイプ/VARCHAR タイプのいずれでしょうか? (注:Access のテーブルデザイナでは両者を識別できません) (3) 既存の mdb ではなく、新規の mdb でも同じ現象になりますか? Imports System.Runtime.InteropServices Imports System.IO Imports System.Data Imports System.Data.OleDb Module Module1 Sub Main() Dim mdb As String = Path.Combine( _ My.Computer.FileSystem.SpecialDirectories.MyDocuments, _ "SAMPLE.MDB") If File.Exists(mdb) Then File.Delete(mdb) End If CreateDatabase(mdb) Dim cb As New OleDbConnectionStringBuilder() cb.Provider = "Microsoft.JET.OLEDB.4.0" cb.DataSource = mdb cb("Locale Identifier") = 1041 cb("Jet OLEDB:Engine Type") = 4 cb("Mode") = 1 Dim sql As String = "SELECT tbl_A.S_No, tbl_B.N_Name, tbl_A.COLOR FROM tbl_A INNER JOIN tbl_B ON tbl_A.N_CD = tbl_B.N_CD;" Dim ds As New DataSet() Using adp As New OleDbDataAdapter(sql, cb.ConnectionString) adp.Fill(ds, "Sample") End Using MsgBox(ds.Tables("Sample").Rows.Count) '期待値は 3 行です End Sub Private Sub CreateDatabase(mdb As String) Dim engine As Object = Nothing For Each id In New String() {"35", "36", "120"} Try engine = CreateObject("DAO.DBEngine." & id) Exit For Catch ex As Exception End Try Next Debug.WriteLine(engine.Version) Dim db = engine.CreateDatabase(mdb, ";LANGID=1041;CP=932;COUNTRY=0;", 32I) 'Dim ver = db.CreateProperty("AccessVersion", 10, "07.53", False) 'Dim props = db.Properties 'props.Append(ver) 'Marshal.ReleaseComObject(ver) 'Marshal.ReleaseComObject(props) db.Execute("CREATE TABLE tbl_A ( S_No INTEGER PRIMARY KEY, N_CD TEXT(2), COLOR TEXT(8));") db.Execute("CREATE TABLE tbl_B ( N_CD TEXT(2), N_Name TEXT(10));") db.Execute("INSERT INTO tbl_A VALUES ( 100, 'A1', 'RED' );") db.Execute("INSERT INTO tbl_A VALUES ( 200, 'A2', 'PINK' );") db.Execute("INSERT INTO tbl_A VALUES ( 300, 'B1', 'BLUE' );") db.Execute("INSERT INTO tbl_A VALUES ( 400, 'B1', 'CYAN' );") db.Execute("INSERT INTO tbl_B VALUES ( 'A1', 'DAO' );") db.Execute("INSERT INTO tbl_B VALUES ( 'A2', 'ADO' );") db.Execute("INSERT INTO tbl_B VALUES ( 'B1', 'RDO' );") engine.Idle(&H8) db.Close() Marshal.ReleaseComObject(db) Marshal.ReleaseComObject(engine) End Sub End Module (※) 自分の手元には、Access 97 の環境がありません。 Access 97 形式の mdb は DAO や ADOX からでは作れないため、 上記では JET 3.0 形式の mdb で代用しています。
分類:[.NET]
アクセス97の選択クエリ―と同じ結果をvb2010ExpressからのSQLコマンドで
実現できなくて困っています。
なぜできないか?またどうすればできるかご教授ください。
mdbのテーブルはtbl_Aとtbl_Bの2個
tbl_AのフィールドはS_No(数値型、主キー)N_CD(テキスト型)COLOR(テキスト
型)の3個
tbl_BのフィールドはN_CD(テキスト型、主キー) N_Name(テキスト型)の2個と
なっております。
なおN_CDのデータはA1,A2,B1,B2といった形で英数文字となっています。
アクセスでの選択クエリ―の内容は
SELECT tbl_A.S_No, tbl_B.N_Name, tbl_A.COLOR FROM tbl_A INNER JOIN tbl_B
ON tbl_A.N_CD = tbl_B.N_CD;
としていまして実行結果も問題ありません。
これをvb2010の方ではそのまま
SQL.CmdText = "SELECT tbl_A.S_No, tbl_B.N_Name, tbl_A.COLOR FROM tbl_A INNER
JOIN tbl_B ON tbl_A.N_CD = tbl_B.N_CD"
としてみましたがうまくいきません。(選択されません)
ただし、N_CDの値をA1,B2,C3とかの英数文字ではなくA,B,Cのように英文字のみ
にするとうまくいきます。(アクセスでの結果と同じ結果になります。)
なおプロバイダはOLEDB.4.0です。
読みにくい長文で申し訳ありませんが原因、解決策をご存知の方、ご教授頂ける
ようお願い致します。