• ベストアンサー

SQLでの変数の扱いについて

VBを利用してのSQL文に変数を使いたいのですが記述方法が良くわかりません。 まず dim a as string dim b as integer dim c as integer a="AAAA" b=10 c=23500 として テーブルZの項目1が nvarchar 項目2が tinyint 項目3がrealであった場合 sql文の記述方法をWebで探していると 文字列変数ならシングルクォーテーションでくくって代入 数値変数ならダイレクトに代入というようにとれるところがあったので下記の 様に記述すると更新されません sqlstr=("UPDATE テーブルZ set 項目1='a',項目2=b,項目3=c where 項目=1") 下記のように分割してそれぞれひとつづつのテストすると更新できます sqlstr=("UPDATE テーブルZ set 項目1=" & a & " where 項目=1") sqlstr=("UPDATE テーブルZ set 項目2='" & b & "' where 項目=1") sqlstr=("UPDATE テーブルZ set 項目2='" & c & "' where 項目=1") 上記の要領で1つにまとめると出来ないので,どのように書けばよいのでしょうか よろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

文字列と変数がごっちゃになってませんか? 解りやすく分けてみましょう。 sqlstr="" sqlstr= sqlstr & "UPDATE テーブルZ " sqlstr= sqlstr & "set 項目1='" & a & "'" sqlstr= sqlstr & ", 項目2=" & cstr(b) sqlstr= sqlstr & ", 項目3=" & cstr(c) sqlstr= sqlstr & " where 項目=1" いかがでしょうか?

mehiro2
質問者

お礼

早速のお返事有難うございました。 こうゆう記述もあるのですね勉強になりました。 ちなみに数値型変数を書き込むときは 項目=" & b & "としても 項目=" & cstr(b)& "としても同じなのでしょうか? 結合すると下記で良いのでしょうか? "UPDATE テーブルZ "&"set 項目1='" & a & "'"& ", 項目2=" & cstr(b)& ", 項目3=" & cstr(c)& " where 項目=1"

その他の回答 (3)

回答No.4

#3です。 SQL文は分けるとトラぶったときなどに 解析しやすいので私はいつもそうしてます。 SELECT文で列をたくさん引っぱってくるときなど みやすくて便利ですよ。 >項目=" & b & "としても >項目=" & cstr(b)& "としても同じなのでしょうか? どちらでもOKだと思うのですが、 sqlstrという変数に、文字列を作っていますので、 数値型は文字列型に変換したほうが無難かと思います。

mehiro2
質問者

お礼

補足へのお返事有難うございました。 マニュアル等見ても良くわからなかったので 大変良くわかりました。 有難うございました

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

まとめた場合と、分割した場合のsqlstrの設定がぜんぜん違っていませんか? また、分割したこの文でうまくいくのでしょうか?(書き間違えているような) sqlstr=("UPDATE テーブルZ set 項目1='" & a & "',項目2=" & b & ",項目3=" & c & " where 項目=1") でだめですか?

mehiro2
質問者

お礼

早速のお返事有難うございました。 頂いた要領で上手く動作しました 大変助かりました

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

SQL文の中に、VBの変数名を直接記述したって、データベース・エンジンには、それがVBの変数だってわかりませんので、エラーになります。 下記の単一SQL文の方では、文字列を連結して、SQL文を組み立ててるのに、上の方で、それを行ってないのはどうして? あと、SQL文を組み立てる際、データをシングルクォートでくくる場合、データに含まれるシングルクォートは、エスケープする必要があります。 そこらへんも確認してみては。 ADOのCommandオブジェクトを使って、パラメータとして、VBの変数値を渡すという手もあります。

mehiro2
質問者

お礼

早速のお返事有難うございました。 変数がどのような動きをするのか確かめているうちに判らなくなっていました。 勉強しなおします

関連するQ&A

  • SQLで 全項目を追加したい

    ACCESS97を使用しています。 SQLを使用して、データの全件削除、全件追加を実施したいのです。 追加元(テーブルA)の項目と、追加先(テーブルB)の項目は同じです。 削除の方は下記の内容で上手くいきましたが 追加は実施できませんでした。 追加の時、*アスタリスクを使用する方法などないのでしょうか? Private Sub コマンド0_Click() Dim SQLstr As String Dim DB As Database Dim RS As Recordset Set DB = CurrentDb() SQLstr = "DELETE FROM テーブルB" DB.Execute SQLstr Set DB = Nothing SQLstr = "" SQLstr = "INSERT INTO テーブルB(*) VALUE (テーブルA*)" Set DB = CurrentDb() DB.Execute SQLstr Set DB = Nothing End Sub

  • VBでの変数宣言は1行に2つできないのですか?

    Visual BASICで変数宣言は1行に2つ以上記述しても実際、動作します。 例 DIM A、B as Integer このように宣言すると、AもBも整数となります。 しかし、このように宣言して、この変数を Call サブプログラム名(B) のように、パラメ-タとして引き渡そうとするとエラーとなってしまうようです。 よくわからないまま、 DIM A as Integer DIM B as Integer と分けて記述したらエラーがきえたようです。 変数宣言は1行に2つ以上まとめて記述してはいけないのでしょうか? VBは Ver 5 です。

  • SQLの書き方

    T1(項目a&b) T2(項目c&d) というテーブルが存在しており、下記のような形でデータが存在しています。 T1 a | b ========== 1 | jj 2 | kk 3 | ll T2 c | d ========= 1 | a1 2 | a2 3 | a3 T1(a)とT2(c)で結合させて、b を d の値で書き換える場合は、どのように記述したら良いのかご教示下さい。 update T1 set b = 'ok' where a in ( select c from T2 where d = 'a2') というように、固定で項目を書き換える所までは出来たのですが、後一歩が上手くいきません。

  • 変数

    Dim トータル As Integer トータル = 200 Dim 変数1(トータル) As Integer Dim 変数2(トータル) As Integer Dim 変数3(トータル) As Integer Dim 変数4(トータル) As Integer ※変数1~4に同じ数の変数(クローン??)を用意したいのですがエラーがでます。 このような使い方は出来ないのでしょうか? なお、VB上ではローマ字で使っています。 変数は6個ぐらいあり 毎回変えるのは面倒なので・・・ (スパイラルモデル方式??といっても使うのは私自信ですが・・・)

  • SQL文がDouble型として認識される

    SQL文がDouble型として認識される 質問させて頂きます。 ユーザーのポイントを引き算し、SQLにアップデートするプログラムを組んでいます。 実行すると String "UPDATE 「テーブル名」 SET 「要素名(Integer)」 " から型 'Double' への変換は無効です。 というエラーが出るのですが、SQL文の部分を何故Doubleに変換するのでしょうか? デバッグにて変数を確認し、String等をいれてみても同じエラーが出る上 SQL文は他の部分で正常に動いているものをコピーしても同じエラーが出ます。 INSERT INTO テーブル名(要素) VALUES(xxx)"であれば 「String "INSERT INTO テーブル名(要素) VALUES」 " から型 'Double' への変換は無効です。」 となります。 SQL文の記述が間違っているとは思えず、VBの記述の問題としてここで質問させて頂きました。 コードは以下の通りで、環境はVB2010 + SQL Server2008です。 回答して頂くために不足している情報がありましたらすぐに追記致します。 至らない文章ではありますが、どうかよろしくお願い致します。 Dim point As Integer point = point(Integer型) - price(Integer型) Dim strSQL As String = "UPDATE 「テーブル名」 SET 「要素(Int型)」 = '" + point + "' WHERE UserID = '" + userid(String型) + "'" cn.ConnectionString = My.Settings.ServerURL Dim cmd4 As New SqlCommand(strSQL, cn) cn.Open() cmd4.ExecuteNonQuery() cn.Close()

  • SQL詳しい方、助けてください。

    こんにちは。 UPDATE テーブルA SET フィールドA1 = '1' WHERE フィールドA2 =(SELECT フィールドB1 FROM テーブルB WHERE フィールドB2 = 'C0' OR フィールドB2 = 'C2' AND フィールドB3='') AND フィールドA3 = '' AND フィールドA4 <> '' というSQLを作成して、動作していたので安心していたら、 テーブルBのレコード数は1件のみだと思っていたら、複数存在する場合があるとのことで、 テーブルBのレコードを追加してみたところ、、 【サブクエリは複数の値を返しました。サブクエリが = 、!= 、<、<= 、>、>= のあとに続く場合や、 サブクエリが 1 つの式として使われる場合に複数の値は許可されません。】 というエラーで終了するようになってしまいました。 そこで、 UPDATE テーブルA AS A INNER JOIN テーブルB AS B ON A.フィールドA2 = B.フィールドB1 SET A.フィールドA1 ='1' WHERE B.フィールドB2 = 'C0' OR B.フィールドB2 = 'C2' AND B.フィールドB3='' AND A.フィールドA3='' AND A.フィールドA4 <> '' としてみました。 なんだか混乱してきて、結合条件があっているかが 自分でもよくわかんなくなっていますが。 しかも、 上記のSQLをSQL SERVER 2000のクエリアナライザで 実行すると、 【キーワード 'inner' 付近に正しくない構文があります。】 というエラーが・・・。 INNER 以下はいろいろおかしいんだろうな・・・と 思っていたのですが、まさか、そんなしょっぱなで引っかかるとは思いませんでした。 いろいろ、記述方法を変更してみたり、考えたんり したんですけど、情けないことにさっぱり解りません。 どなたかお力をお貸しください。 お願いします。

  • access2002 DAOのデータ読込投入

    今access2002のアプリケーションを作っています。 そのデータをエクセルから、テーブルにインポートする作業を仕様としています。 今考えているのは、EXCELのデータを、 ほぼそのままテーブルAとしてインポートし、 そのテーブルを読み込んで編集&項目追加をして、 テーブルBに書き込みます。 その際、のコーディングは、 Private Sub sample_click() DIM dbDAO AS DAO.DATABASE DIM rsDAO AS DAO.RRECORDSET DIM rsDAO2 AS DAO.RRECORDSET set rsDAO = dbDAO.OPENrecordset("テーブルA",dbOpenTable) Do Until rsDAO.EOF = true rsDAO2.AddNew rsDAO2.項目B1 = rsDAO.項目A1+変数A1 rsDAO2.項目B2 = rsDAO.項目A2*変数A2 rsDAO2.項目B3 = rsDAO.項目A3/変数A3 rsDAO2.項目B4 = rsDAO.項目A4-変数A4 rsDAO2.Update rsDAO.MoveNext loop rsDAO.Close: Set rsDAO = Nothin rsDAO2.Close: Set rsDAO2 = Nothin End Sub 上記のように記述すると、テーブルAの全レコードを、 すべて自動編集し、テーブルBに追加できますでしょうか? やりたいことは単純なのですが、クエリーでも僕のレベルでは、 うまくできそうにないので、質問させていただきました。 どうかよろしくお願いします。

  • VBAのプロシージャーと変数の名前の区別について

    VBAの初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • EXCEL VBA VLOOKUP 範囲を変数で

    Excel VBA で VLookup()の第2引数の範囲を行と列の数値の変数で指定したいのすが どのように記述すればよいでしょうか。 以下の式がエラーにならないように具体的に直していただけないでしょうか。 よろしくお願いします。 ----------------------------------- Dim d1 As String Dim d2 As String Dim r1 As Integer Dim r2 As Integer Dim c1 As Integer Dim c2 As Integer Dim c3 As Integer d1 = "愛知" r1 = 2 r2 = 782 c1 = 3 c2 = 5 c3 = 4 d2 = VLookup(d1, Worksheets("Sheet1").Range(Cells(r1, c1), Cells(r2, c2)), c3, False)

  • SQLの条件に変数を

    はじめまして。よろしくお願いします select文のwhere条件にidを指定したいのですがうまくいきません。 べつに変数を使用しなくてもよいのですが良い方法がありましたらご教授下さい Private Sub コマンド8_Click() Dim adoCON As ADODB.Connection Dim adoRS As ADODB.Recordset Dim no As interger no=me.id Set adoCON = Application.CurrentProject.Connection Set adoRS=adoCON.Execute("select varcodeno from varcode_tbl where id=no")strName = adoRS!varcodeno adoRS.Close adoCON.Close Set adoRS = Nothing Set adoCON = Nothing Me.jancode.Value = strName End Sub