• ベストアンサー

SQLの選択処理について

SQLの選択処理が上手くいきません Dim j As Integer と宣言します。 j=1 とします。  strSQL = "SELECT * FROM LINK WHERE 工番 =j;" だと 上手くいきません。ちなみに  strSQL = "SELECT * FROM LINK WHERE 工番 =1;" だと上手くいきました。   昨日、更新処理時については教えて頂いたのですが 上記は何故上手くいかないのでしょうか?  変数が数字で設定しているから?

  • cdma
  • お礼率36% (91/247)

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

  • ベストアンサー
  • mfuku
  • ベストアンサー率50% (173/345)
回答No.2

正しくは、 strSQL = "SELECT * FROM LINK WHERE 工番 =" & CStr(j) & ";" としてください。 strSQL = "SELECT * FROM LINK WHERE 工番 =j;" とすると、「工番が『j』のレコードをLINKテーブルから取得する」というSQLになってしまいます。 「工番が『j』の~」ではなく「工番が『jの変数の値』の~」という条件のはずですよね。 上記の正しい記述の意味は、文字型変数strSQLに、"SELECT * FROM LINK WHERE 工番 ="と、Integer型変数jを文字型に型変換した値と、";"を代入する、という意味になります。

cdma
質問者

お礼

早速の回答 ありがとうございました。 会社から質問して10分後に回答頂き 即業務に実施できました。 社内でも 聞くことができず、行き詰まっていたところです。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

strSQLは文字列である必要があるのはご存知ですよね。だからこそ=で右辺に”SELECT・・・”を結べる(=代入できる)訳けです。 その”と”の中(間)に=jを入れているわけですから工番の内容がj(jというjの小文字の内容)のものがあれば選択するが、工番は数字のものしかないのでしょうから何も選択しません。 ”・・・工番=1;”は1という内容の工番のものは存在しますでしょうから、選択するわけです。 ここを相対化してSQL文を作るにはjを内容を決めたあと、文字列化して、工番=の後に、その文字列を&などで くっ付ければ良い。従って””の後方の”は「・・工番=」の直後に”を付けなければなりません。 SQL文は実行する時変数部分の具体的文字列化までは やった上で実行は「してくれません。」プログラマーの方で具体的文字列化をする必要があります。

  • misoka
  • ベストアンサー率35% (56/160)
回答No.1

strSQL = "SELECT * FROM LINK WHERE 工番 = " & CStr( j ) という具合でやればよいのではないでしょうか? ""(ダブルクォーテーション)内では変数は使えないだろうと思います。

cdma
質問者

お礼

早速の回答 ありがとうございました。 会社から質問して10分後に回答頂き 即業務に実施できました。 社内でも 聞くことができず、行き詰まっていたところです。

関連するQ&A

  • SQLの文章 羅列について

    SQLの文章を変更しようとしています。 更新対象の項目が増えてくるので1行の文章を分けたいのですが strSQL3 = "UPDATE LINK SET A ='" & a & "',B ='" & b & "' WHERE 工番=" & CStr(j) & ";" の1行の文章を 下記の通りしたのですが できませんでした。何故でしょうか? strSQL3 = "UPDATE TPK_LINK SET" strSQL3 = strSQL3 & "A ='" & a & "'" strSQL3 = strSQL3 & ",B ='" & b & "'" strSQL3 = strSQL3 & "WHERE 工番=" & CStr(j) & ";"

  • SQL文の作成について

    前の質問が解決してないのに、すいません。 SQL文を作成して、関数に投げると配列で 実行結果が返ってくるらしいのですが。 SQL文作成時に変数をWHERE節に組み込む 記述の仕方が自信ないです。以下のような感じです。 Dim srtSql As String Dim Key_Id As String Call Key_Get(Key_Id)  ’キーを取得 strSql = strSql & ”Select Tb*” strSql = srtSql & ” From Tb ” strSql = strSql & ”Where ” srtSql = strSql & ”Tb_Key_Id = ’” strSql = strSql & Key_id & ”’” のように(Accessだとこんな感じ【キーはSring】)ダブルクォーテーションの外に書いてよいのでしょうか?

  • SQLの更新の時、記号 ’ について

    SQLの更新で不明な点があります。 strSQL = "UPDATE LINK SET 備考 ='" & B & "' WHERE 工番=" & CStr(j) & ";" LINK の備考1に 変数Bの値を更新したいのですが この時 Bの中に 'の記号が入っていれば"オブジェクトが無効"と出てきます。 例えば 24' (24インチを意味する) と表示したいのです。 'の記号を変換するしか ないのでしょうか? ※ 質問内容が足りなければ再度 詳しく質問したいと思います。

  • MSFlexGridでデータの追加の方法は?

    VB6.0 WINXP DB:Oracle10g  よろしくお願いします。 SELECT文でデータベースからデータを取ってきてMSFlexGridにデータを送ったのですが、そのデータに更に追加したいと思います。 ' ADOのオブジェクト変数を宣言する Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim STRSQL As String 'Oracleとの接続 cn.Open "Provider=MSDAORA;" & _ "Data Source=NT;", "scott", "tiger" ' SQLステートメントを指定してレコードセットを作成する re.Open STRSQL = "select * from TOKUI WHERE A01 = 100" rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic 'グリッドに送る Set MSFlexGrid1.DataSource = rs 'ここからのSELECT文を追加したいと思います。 STRSQL = "SELECT TOKUI FROM WHERE A01 = 200" Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic よろしくお願いします。

  • access97でのFunctionプロシージャの使い方

    Access97で作業しています。 以下の記述で定義したレコードセットを同一の*.mdbのなかで共有したい(他のイベントプローシージャで呼びたい)のですが、どのようにするのでしょうか? これをFunctionプローシージャにする? Public にする? それと、このプロシージャで定義した変数名は他のイベントプロシージャでも使えるのでしょうか? プロシージャの性質も良く判らない状態です。宜しくお願い致します。 Dim strSQL As String Dim i, j, TOL, cnt As Integer Dim rsFLT, rsTBL As DAO.RecordSet Dim DB As Database Set DB = CurrentDb strSQL = "SELECT * FROM [Q-Order用] WHERE ID='" & [Forms]![F-Order用]![IDbox] & "'" Set rsFLT = DB.OpenRecordset(strSQL)

  • T-SQLの sp_executesql について

    SQL-Serverでストアドプロシージャを作っています。 EXEC sp_executesql で検索結果をテーブル型変数に格納したいですができるのでしょうか。動的にSQLを発行し、結果を格納する必要がありますのでEXEC sp_executesqlを使わざる得ない状況です。下記にそのサンプルがあります。 Declare @tblAA Table(NO int) declare @strSQL nVarChar(1000) set @strSQL = '' set @strSQL = @strSQL + ' Insert into @tblAA' set @strSQL = @strSQL + ' Select NO from TBLBango' EXEC sp_executesql @strSQL ,N'@tblAA table(No int) OUTPUT', @tblAA OUTPUT Select * from @tblAA これを実行すろと「変数 '@tblAA' を宣言する必要があります。」というエラーがでます。 解決方法を分かる方教えてください。

  • SQLデータベースへのアクセスがわからない

    VB.Netを始めて一ヶ月。 DB接続は出来たもののREADのみで、更新処理が全く出来ません。 何が悪いのか、どうすればいいのかもわからず途方に暮れています。 どなたかお知恵をお貸し下さい。 下記にプログラムを記載します。 ■◇■ 共通定数 ■◇■ Public gstrSysd As String = "DSN=DbName;UID=UserId;PWD=Password" 一部名称を変更しています。 ■◇■ Readプログラム ■◇■ Public Sub psubDBReadK(ByVal strSql As String, Optional ByVal intDcnt As Integer = 0)   Dim godbSysd As New OdbcConnection(gstrSysd)   godbSysd.Open()   Dim odbCom As New OdbcCommand(strSql, godbSysd)   Dim odbRead As OdbcDataReader = odbCom.ExecuteReader(CommandBehavior.CloseConnection)   Dim intLcnt As Integer   Erase gtblDb   glngDcnt = 0   While odbRead.Read()     glngDcnt = glngDcnt + 1     ReDim Preserve gtblDb(intDcnt, glngDcnt)     For intLcnt = 1 To intDcnt       If IsDBNull(odbRead.GetValue(intLcnt - 1)) Then         gtblDb(intLcnt, glngDcnt) = ""       Else         gtblDb(intLcnt, glngDcnt) = Trim(odbRead.GetString(intLcnt - 1))       End If     Next intLcnt   End While   odbRead.Close()   godbSysd.Close() End Sub 上記モジュールをSQL文を作成してCallします。   strSql = ""   strSql = strSql & "SELECT Mm, Wd, Dd, Nm "   strSql = strSql & " FROM TableName "   strSql = strSql & "WHERE Fd <= '" & lngYear & "' "   strSql = strSql & " AND Ed >= '" & lngYear & "' "   strSql = strSql & "ORDER BY Mm, Wd, Dd "   Call psubDBReadK(strSql, 4) ここまでは動作確認も出来ましたが、問題はWRITE処理です。 ■◇■ WRITEプログラム ■◇■ Public Sub psubDbWriteK(ByVal strSql As String)   Dim odbSysd As New OdbcConnection(gstrSysd)   odbSysd.Open()   Dim odbCom As New OdbcCommand(strSql, odbSysd)   odbCom.Connection.Open()   odbCom.ExecuteNonQuery()   odbSysd.Close() End Sub 上記コードだとコネクションのオープン時に『既に開かれています』のエラーとなりました。 同コードを削除するとエグゼキュートノンクエリーにて『システムエラー』となり、やはり上手く動作していないようです。 同様にOdbcDataAdapterを使う方法も試してみましたが上手くいきませんでした。 DBアクセスの方法はいくつかあると思いますが、SELECT句と同様の方法でINSERT、UPDATEも行いたいのですが、どうすれば良いのでしょうか? 環境 OS WIN2K VS.Net Professional(VB) DB SqlServer2K

  • SQLとDAOで取得するレコード件数が違う?

    Access2007でSQLで実行した結果と、レコードセットで取得した件数が一致せずに困っています。 いろいろ調べてはみたのですが、なぜかわかりません。 よろしくお願いします。 ○TableA 型 Code1 数値型(主キー) Text テキスト型 Code2 数値型 ○TableA データ Code1 Text Code2 111 AAA 10 112 BBB 15 113 CCC 20 114 DDD 20 ○VBAコード Dim strSQL As String Dim db As DAO.Database Dim rstFind As DAO.Recordset strSQL = "SELECT * FROM TableA Where Code2 = 20" Set db = CurrentDb() Set rstFind = db.OpenRecordset(strSQL, dbOpenSnapshot) MsgBox rstFind.RecordCount この状態でSQLビューから実行すると2件が抽出され、上記VBAを実行するとMsgBoxには「1」と表示されます。

  • PL/SQLのエラー処理について

    PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin      insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。

  • SQLServerのクエリ速度の違いについて

    Webアプリケーション(ASP.NET)より、SQLServer2005に対してデータを取得しています。 その際にSELECT句のSQL文を実行しているのですが、以下のパターンによって処理速度が異なります。 ■ パターン(1) SQLCommandクラスに対して、SQL文、パラメータを渡し実行. 処理時間 = 1分程度. [SQL文] SELECT * FROM T_TEST WHERE code = @code; [ソース] Dim sqlCom As New SqlCommand(strSql, con) sqlCom.Parameters.add(New SqlParameter("@code", SqlDbType.Int)).Value = 100 …略 ■ パターン(2) 以下のSQL文をSQLCommandクラスに渡して実行. 処理時間 = 15秒程度. [SQL文] DECALRE @code As Int; SET @code = 100; SELECT * FROM T_TEST WHERE code = @code; [ソース] Dim sqlCom As New SqlCommand(strSql, con) …略 システム自体はパターン(1)の形で共通のメソッドを作成しています。 処理が遅かったのでSQLをSSMSにて解析しようとして、パターン(2)の様に変数定義をDECLAREで記述した所、速くなり、 実際のシステム上で試した所、同じような速度となりました。 パターン(1)の様な形ではパターン(2)の様な速度はやはり出ないのでしょうか? ちなみにProfilerでパターン(1)のSQL文を見たら、"EXEC sp_executesql N'SELECT ~"が実行されていました。 以上、どなたか分かる方ご教授ください。

専門家に質問してみよう