- 題名: 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です。
読みにくい長文で申し訳ありませんが原因、解決策をご存知の方、ご教授頂ける
ようお願い致します。