開発環境:
Visual Studio Express 2017
.NET Framework 4.6.1
DB browser for SQLite
解決したいこと
VB.netにて、windowsフォームアプリを開発中。
ボタンフォーム押下で実行する関数内で、
SQLCON.ExecuteQuery() コマンドで、sqliteのテーブルのデータをupsertしたい。
SQLiteのテーブル構造
delivery_date text(yyyy-mm-dd) PK product_type text PK stock_A integer stock_B integer stock_C integer stock_D integer stock_E integer
実際のコード(VB)
Dim DT As DataTable Dim StrSQLString As String = String.Empty StrSQLString = "INSERT INTO test_aggregate(delivery_date,product_type,stock_A,stock_B,stock_C,stock_D,stock_E)" + "VALUES('2020-08-03','aaa',0,0,0,0,0)" + "on CONFLICT(delivery_date,product_type) " + "DO UPDATE SET stock_A = 0, stock_B = 0, stock_C = 0, stock_D = 0, stock_E = 1" DT = SQLCON.ExecuteQuery(StrSQLString)
VisualStudioのデバッグモードで、上記コードを実行したときのダイアログ
SQL logic error near "on":syntax error
確認したこと
- ほかのSQL文をstrSQLStringに入れて実行し、問題なく動作した。(insert文、select文など)
- DB browser for SQLiteのコンソール(SQL実行タブ)で上記strSQLstring内のupsert文を実行し、問題なく処理された。
(実際には、DB browserで通ったSQL文を、VBのコードで文字列として再度記述しています。
視認性をよくするために改行を行っている以外は完全にコピペです。) - デバッガで見た、strSQLStringの中身
StrSQLString = INSERT INTO test_aggregate(delivery_date,product_type,stock_A,stock_B,stock_C,stock_D,stock_E) VALUES('2020-08-03','aaa',0,0,0,0,0) on CONFLICT(delivery_date,product_type) DO UPDATE SET stock_A = 0, stock_B = 0, stock_C = 0, stock_D = 0, stock_E = 1 SQLite error (1): near "on": syntax error ※VALUES前とon前のスペースは、空いている・空いていない版の両方を試しましたが、結果は同じでした。
ご存じの方、ご指導のほど、よろしくお願いいたします。
「DB browser for SQLiteのコンソール(SQL実行タブ)で上記strSQLstring内のupsert文を実行し、問題なく処理された。」
とのことですが、これはデバッガ等でstrSQLstringの内容を出力して、それをコピペして実行されたのでしょうか?
コメントありがとうございます。
この業界に入って日が浅いので、あまり語彙もなく、うまく説明出来ているかわかりませんが、ご容赦ください。
実際には逆の順序で行っております。
①DB browser for SQLite 内のSQL実行タブで、upsert文を作成し、動作を確認
②①で実行したSQL文を、VBのコード内で文字列変数として記述し、SQLCON.ExecuteQuery()の引数として使用する(ここがコピペです。)
この②実行時にsyntax errorが発生したため、「DB browser側では通ったのに!」と困っている、という具合です。
ほかのSQL文も同じ具合でVB側に実装していますが、問題なく動作しており、insertやselect文の結果をwindowsフォーム上に表示できているため、引数の渡し方や型が違っているとも思えず…
では、デバッガなどでstrSQLstringのSQLを出力するなりして確認してみてください。
スペースが無いためにエラーになっていたり等考えられませんか?
他のツールで実行確認したSQLをプログラムに実装する手順はいいのですが、動作しない場合はプログラムで実際に実行しているSQLが本当に動作するものなのかを確認する必要があります。
ありがとうございます。
本文に、デバッガで出力したstrSQLStringの文面を追記いたしました。
ちなみに、これ(デバッガ文面)を再度DB browser側にコピペして実行しましたが、通りました。
不思議です…
どうも掲載されているソースとSQLを出力した時のソースが異なるようです。
掲載されたソースをそのまま実行して得られるSQLは
INSERT INTO test_aggregate(delivery_date,product_type,stock_A,stock_B,stock_C,stock_D,stock_E)VALUES('2020-08-03','aaa',0,0,0,0,0)on CONFLICT(delivery_date,product_type) DO UPDATE SET stock_A = 0, stock_B = 0, stock_C = 0, stock_D = 0, stock_E = 1
でVALUES句部分やonの部分のスペースが違います。
すみません。スペースのあるなしも色々試行してみたので、若干バージョンが違いました。
valueやonの前にスペースがあるかないかの違いと思いますが、あってもなくても結果は同じようです。
(VBではエラー、DB browser側では通る)
一応ダメ元で、valuesとon前の2か所に対し、スペースのあるなしを変えて4パターン行いましたが、結果は変わりませんでした。
回答1件
あなたの回答
tips
プレビュー