DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■34323 / inTopicNo.1)  JOIN操作の構文エラー
  
□投稿者/ 社畜からの開放 一般人(3回)-(2019/10/22(Tue) 19:57:18)
  • アイコン環境/言語:[Win10 64bit VB.NET] 
    分類:[.NET] 

    お世話になっております。
    (前回の質問と名前を合わせるために見ていたら開放を誤字していて恥ずかしいです。)

    VB.NETでSQL文を使用しようとしたところ
    「System.Data.OleDb.OleDbException: 'JOIN 操作の構文エラーです。'」というエラーが表示されます。

    SQLの構文が何か間違っているのだとは思いますが、原因がわかりません。

    試したこととしては
    Dim commText As String = "SELECT * FROM " & csvfile_Order
    ⇒正常にDataGridViewに表示されます。

    Dim commText As String = "SELECT * FROM [""" & csvfile_Order & """] LEFT OUTER JOIN [""" & csvfile_Shop & """] ON [""" & csvfile_Order & """].[ShopCode]=[""" & csvfile_Shop & """].[ShopCode]"
    ⇒System.Data.OleDb.OleDbException: ''["OrderMaster.csv"].[ShopCode]' のかっこの使い方が正しくありません。'

    Dim commText As String = "SELECT * FROM [" & csvfile_Order & "] LEFT OUTER JOIN [" & csvfile_Shop & "] ON [" & csvfile_Order & "].[ShopCode]=[" & csvfile_Shop & "].[ShopCode]"
    ⇒System.Data.OleDb.OleDbException: ''["OrderMaster.csv"].[ShopCode]' のかっこの使い方が正しくありません。'

    また、使用しているcsvですが試作のためのダミーデータです。
    JOINしようとしているデータ型が違う等の凡ミスもないと思っております。
    コードの下に、schema.iniも記載いたします。
    (日付もCharにしているのは実力不足ですので気にしないでください。)

    以下コードです。
    Form1.vb
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Const csvDir = "C:\Users\UserName\Desktop\"
    Const csvfile_Order = "OrderMaster.csv"
    Const csvfile_Shop = "ShopMaster.csv"
    'Const csvfile_Goods = "GoodsMaster.csv"

    Dim conString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & csvDir & ";Extended Properties =""text;HDR=Yes;FMT=Delemited"""
    Dim con As New System.Data.OleDb.OleDbConnection(conString)


    Dim commText As String = "SELECT * FROM " & csvfile_Order & " LEFT OUTER JOIN " & csvfile_Shop & " ON " & csvfile_Order & ".[ShopCode]=" & csvfile_Shop & ".[ShopCode]"
    Debug.Print(commText)
    Dim da As New System.Data.OleDb.OleDbDataAdapter(commText, con)

    Dim dt As New DataTable
    da.Fill(dt)
    DataGridView1.DataSource = dt

    MsgBox("完了")

    End Sub


    schema.ini

    [OrderMaster.csv]
    ColNameHeader=True
    Format=CSVDelimited
    Col1="OrderKey" Integer
    Col2="ShopCode" Char
    Col3="GoodsCode" Char
    Col4="PlanDate" Char
    Col5="StatusCode" Char
    Col6="RgstDate" Char
    Col7="UpdtDate" Char
    Col8="UpdtCode" Char

    [GoodsMaster.csv]
    ColNameHeader=True
    Format=CSVDelimited
    Col1="GoodsKey" Integer
    Col2="GoodsCode" Char
    Col3="GoodsName" Char

    [ShopMaster.csv]
    ColNameHeader=True
    Format=CSVDelimited
    Col1="ShopKey" Integer
    Col2="ShopCode" Char
    Col3="ShopName" Char

マルチポストを報告
違反を報告
引用返信 削除キー/
■34324 / inTopicNo.2)  Re[1]: JOIN操作の構文エラー
□投稿者/ Hongliang 大御所(566回)-(2019/10/22(Tue) 21:48:11)
  • アイコン
    2019/10/22(Tue) 21:49:09 編集(投稿者)
    
    テーブルにはエイリアスをつけて、以降はエイリアスの方を使うようにします。
    あと、&で文字を結合するより、String.Formatか、Visual Studio 2015以降であれば
    文字列補間を使うことをお勧めします。
    
    文字列補間を使った場合はこんな感じ。文字列開始が"ではなく$"になります。
    ついでに、Visual Studio 2015以降だと文字列中に改行も入れられます。
    
    Dim commText As String = $"SELECT *
    FROM  [{csvfile_Order}] AS order
    LEFT OUTER JOIN [{csvfile_Shop}] AS shop
      ON order.ShopCode = shop.ShopCode"

違反を報告
引用返信 削除キー/
■34325 / inTopicNo.3)  Re[2]: JOIN操作の構文エラー
□投稿者/ 社畜からの開放 一般人(4回)-(2019/10/23(Wed) 20:47:17)
  • アイコンHongliangさん、回答ありがとうございます。
    無事目指すものがうまく表示されました。

    エイリアス(AS使うやつ?)がフィールド名以外でも使えることを知りませんでした。

    文字列補間は便利そうですが、変数の型とか定数と変数とか意識しないと一気にぐちゃぐちゃ書いちゃう人なので参考とさせていただきます。

    後学のために教えていただきたいのですがなぜパス名指定ではうまくいかず、エイリアスによる指定ではうまくいったのでしょうか。

    1つのスレッドで複数の質問に該当する場合は申し訳ございません。
    一方で解決済みにしてよいものかも判断できないため数日様子を見させていただきます。
違反を報告
引用返信 削除キー/
■34326 / inTopicNo.4)  Re[3]: JOIN操作の構文エラー
□投稿者/ Hongliang 大御所(567回)-(2019/10/24(Thu) 10:49:06)
  • アイコン> 変数の型とか定数と変数とか意識しないと一気にぐちゃぐちゃ
    というのが文字列を&で結合するのとどう関係するのかよく分かりませんが、文字列を&で結合するのよりは文字列補間の方がぐちゃぐちゃにはならないと思います。

    > 後学のために教えていただきたいのですがなぜパス名指定ではうまくいかず、エイリアスによる指定ではうまくいったのでしょうか。
    正確なところは分かりませんが、少なくともOleDb/JETでcsvを扱う場合において、基本的にピリオドは [] や `` の有無に関わらず識別子として存在してはいけない文字のようですね。
    ただし、FROM句やJOIN句にはテーブル名が指定されることが明らかなので、ピリオドが含まれていても良く、[] や `` も必要ないようです。

    なおピリオドは # で代用することができるようです。これを使えば
    SELECT [hoge#csv].name FROM hoge#csv
    なんて記述もできます。
    まあエイリアスを使うのをお勧めしますが。
違反を報告
引用返信 削除キー/
■34327 / inTopicNo.5)  Re[4]: JOIN操作の構文エラー
□投稿者/ 社畜からの開放 一般人(5回)-(2019/10/24(Thu) 18:25:38)
  • アイコンHongliang様、回答ありがとうございます。

    csvを扱うのに.がエスケープさえ許されないのは少し不思議です。
    教わったエイリアスを使わせていただきます。

    文字列補間は新しい知識に困惑していますが頑張って練習してみます。
解決み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -