none
SQL構文でエラーがでます RRS feed

  • 質問

  • SQL = "use tempdb " & _
              "if exists (select * from sysobjects where id = object_id(N'[dbo].[" & _
              TblName & "]') and OBJECTPROPERTY(id,N'IsUserTable') = 1 ) " & _
              "drop table [dbo].[" & TblName & "] " & _
              "use kyohoDB"

    Cnn.Execute(SQL, rCount)

    SQL = "select * into " & TblName & " from 単品マスタ where "
    SQL = SQL & "浮貸先1='" & IpAiteCD1 & "' or "
    SQL = SQL & "売上先='" & IpAiteCD1 & "'"

    Cnn.Execute(SQL, rCount)

     

    2つ目の実行で「オブジェクト名'単品マスタ'が無効です」と表示されます。

    私的には、あってるように見えますが、何がおかしいいでしょうか?

    ご指導お願いします。

     

    2011年5月23日 4:44

回答

  • もう1つの可能性として、接続先のデータベースはどこになっているのでしょうか? 接続文字列を挙げてくれると判断しやすいです。

    ちなみに1つ目で use kyohoDB を実行していますが、Execute()が完了した時点で効力を失いますので、2つ目は接続文字列で指定されたデータベースに対して実行されます。原因切り分けのために

    SQL = "use kyohoDB; select * into " & TblName & " from 単品マスタ where "

    としてみて動作するなら接続文字列の見直しが必要です。

    • 回答としてマーク 京太郎 2011年5月31日 4:22
    2011年5月23日 5:17
  • >> ADO.NETに変えてもいいと思いますが、変更は大変でしょうか?
    >> connectionのところを変えるだけで大丈夫でしょうか?

    > CnnインスタンスがADODB.Connectionクラスなので、ADOへの切り替えってそのまま行けちゃう気もします・・・

    いえ・・・totojoさんと私が言ってるのは ADO.NET ですから(汗


    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答としてマーク 京太郎 2011年5月31日 4:24
    2011年5月26日 1:14
    モデレータ

すべての返信

  • 「単品マスタ」という名前のテーブルは存在しているのでしょうか?
    ご質問の内容からは読み取ることができません。 
    2011年5月23日 4:54
  • すいません。

    「単品マスタ」のテーブルは存在しています。

     

    2011年5月23日 4:59
  • 「マスタ」が半角だったり長音記号がついてたり、微妙に違ってませんか?
    2011年5月23日 5:05
  • 大丈夫っぽいです。

    文法的にはあってますか?

    2011年5月23日 5:07
  • もう1つの可能性として、接続先のデータベースはどこになっているのでしょうか? 接続文字列を挙げてくれると判断しやすいです。

    ちなみに1つ目で use kyohoDB を実行していますが、Execute()が完了した時点で効力を失いますので、2つ目は接続文字列で指定されたデータベースに対して実行されます。原因切り分けのために

    SQL = "use kyohoDB; select * into " & TblName & " from 単品マスタ where "

    としてみて動作するなら接続文字列の見直しが必要です。

    • 回答としてマーク 京太郎 2011年5月31日 4:22
    2011年5月23日 5:17
  • 一見問題ないようには思えますが・・・データベースは SQLServer でしょうか?

    2度目の Cnn.Execute(SQL, rCount) の行にブレークポイントを設け、変数 SQL の中身をウォッチしてみてください。
    変数 SQL がきちんとクエリーになってるか、TblName・IpAiteCD1 の各変数には値が正しく設定されてるか、確認できますでしょうか?
    ちなみにウォッチした文字列の内容を貼り付けることはできますか?


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2011年5月23日 5:19
    モデレータ
  • データベースへログインしているユーザーが単品マスタにアクセスする権限が無いということはありませんか? また、単品マスタの前にスキーマ名を付けるとアクセスできるようになりませんか?

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年5月23日 6:03
    モデレータ
  • ウォッチ式は

      sql "select * into #WKTPN_TBL from 単品マスタ where 浮貸先1='027200' or 売上先='027200'" String

    となっています。

     

    2011年5月23日 6:17
  • データベースアクセス権限は解放していますので、大丈夫かと・・・

     

    2011年5月23日 6:20

  • 佐祐理さんの指摘は試されましたか?

    私もそこが本命に思います。

    2011年5月23日 6:29
  •   [kyohoDB].[dbo].[単品マスタ]

    みたいに、データベース名とスキーマ名を律儀に書くと?
    2011年5月23日 6:43
  • 返信が遅くなり申し訳ありません。

    SQL = "use kyohoDB; select * into " & TblName & " from 単品マスタ where "

    にしてみたら、エラーは出ませんでした。

     

    どこの接続文字列を直せばいいのでしょうか?

    VB.NETは素人なので、すいません。

     

    • 回答としてマーク 京太郎 2011年5月23日 8:50
    • 回答としてマークされていない 京太郎 2011年5月24日 2:27
    2011年5月23日 8:50
  • Cnnに設定した接続文字列です。

    2011年5月23日 8:57
  • たとえば、どのようにしたら良いでしょうか?
    2011年5月23日 9:35
  • それはコネクションに何を用いているかで変わってくるかと思いますよ。

    Cnnインスタンスのクラスは何ですか?


    下記を参考にして調べて下さい。

    http://kissme.dtiblog.com/blog-entry-189.html

    2011年5月23日 9:40
  • Cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=" & Trim(DataSource) & ";" & _
                                           "Initial Catalog=" & Trim(DataBaseName) & ";" & _
                                           "Persist Security Info=True;" & _
                                           "User ID=" & Trim(AdminUserID) & ";" & _
                                           "Password=" & Trim(AdminPassword)
                    Cnn.Open()

     

    このような書き方ではダメでしょうか?

     

    2011年5月23日 10:17
  • うまくいった SQL 文とうまくいかなかった SQL 文とを比較して、それを ConnectionString の何に当てはめれば良いかを確認すればいいと思うのですが。

    # さすがに ConnectionString のどこをどう変えるかを「具体的に」聞き出すのは為にならないと思います。
    2011年5月23日 10:20
  • ADO接続で、VB6ではこの接続方法でうまくいったのですが、

    .NETでも他の接続等は、この書き方でいけています。

    今回のとこがこの書き方でうまくいかないのは、根本的に書き方が違うのでしょうか?

     

    2011年5月23日 10:26
  • Cnnのクラス名はなんでしょうか? 質問者が一番情報を持っていることを自覚してください。
    2011年5月23日 10:30
  • すいません。クラス名とは???

    SQLのことでしょうか?

     

    2011年5月23日 10:32
  • 大変失礼な言い方になりますが、おそらく質問者以外皆さん感じていると思われるのであえて言わせて頂きます。

    せめてクラス名という言葉の意味くらいは自分で調べたらいかがでしょう。

    その方が次に繋がると思います。

     

    デバック実行してCnnインスタンス内の各プロパティ値がコネクションのOpen時から

    SQL文のExecute時までにどの様に変遷しているかをまず確認しましょう。

    情報がいただけない以上、そうして下さいとしか言えません。

     

    気分を害されたら申し訳ありませんが、頑張って下さい。

    2011年5月24日 0:04
  • パスワードが見えていますが大丈夫ですか? 至急確認して下さい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年5月24日 2:33
    モデレータ
  • すいません。ありがとうございます。
    2011年5月24日 2:48
  • 「京朋通知」と埋め込まれているので、会社名もおおよそわかってしまいましたね。本人の意思で公開されたID / Passwordを使用してログインしたのなら不正アクセスには該当しないでしょうし。気になさらないなら構いませんが。先日の某スレッドもそうですが、開発者以前の問題ががが…。

    メソッド名がExecuteなので疑問に思っていましたが、ADODB.Connectionでしたか。

    そしてこれってもっと根本の問題としてVBのバージョンはいくつなんでしょうかね? VBに詳しくないので、コードからコンパイル可能なバージョンを推測することはできませんでした。

    本題ですが、Initial Catalogが指定されているので正しいようにも思えました…。うーん、原因がわからずです。

    2011年5月24日 3:00
  • ありがとうございます。

    VBのバージョンは、2010です。

    SQLは、2008です。

     

    2011年5月24日 3:06
  • 最初の質問に戻りますが、kyubuDB に 「単品マスタ」 というテーブルは存在しますか?


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2011年5月24日 3:15
    モデレータ
  • 単品マスタ テーブルは存在しています
    2011年5月24日 3:20
  • では確認ですが、「単品マスタ」があるのは、kyubuDB ですか?kyohoDB ですか?

    添付コードの ConnectionString をよくご確認ください。
    2011年5月24日 3:24
  • kyubuDBの中にあります。

    kyohoDBとkyohoDBは同じものです。

    kyubuDBをリネームしたものです。

     

    2011年5月24日 3:41
  • エラーが出ていると指摘されている部分ですが、

    ここだけ他の部分と違ってタグ(<em><strong>Cnn.Execute(SQL)</strong></em>)に囲まれてますけど合ってますか?


    2011年5月24日 5:33
  • kyubuDBの中にあります。

    kyohoDBとkyohoDBは同じものです。

    kyubuDBをリネームしたものです。

     


    こんにちは。
    佐祐理さん、ひらぽんさんのご指摘が本命だと僕も思います。

    1度、SQL Server Management Studio等のクエリツールで

    use kyubuDB
    go
    
    select * from 単品マスタ
    


    を実行して、意図された結果になるかどうか確認してください。(kyohoDBじゃなくて。)

    2011年5月24日 6:25
  • この部分(浮貸マスタ一時テーブル作成)の2つ目のExecuteのところです。

     

    2011年5月25日 0:21
  • おはようございます。

    use kyubuDB
    go
    
    select * from 単品マスタ
    

    をストアドで実行したところ、結果が正確に表示されました

     

    2011年5月25日 0:32
  • ADODB.Connection.Execute の仕様がイマイチ判ってないのですが・・・
    いまコードを見直しましたが、問題が発生する Cnn.Execute(SQL) の直前の Cnn.Execute(SQL)。
    ここのクエリ、最後に "use kyohoDB" を実行させてますよね。これが引っかかります。
    この一行を削除するとどうなります?もしくは  "use kyubuDB" に変えるとどうでしょうか?


    ひらぽん http://d.hatena.ne.jp/hilapon/

    2011年5月25日 1:10
    モデレータ
  • 少し試したのですが、Connection を Open して一番はじめに "use tempdb ~" の SQL を発行すると、Connection の DefaultDatabase が "tempdb" にすり替わってしまいますね。以降でどれだけ "use kyohoDB" とか "use kyubuDB" をしても、DefaultDatabase は "tempdb" のまま変わらず...。
    とりあえずは Connection の Open 直後にダミーで kyubuDB の適当なテーブルを SELECT しておけば、DefaultDatabase がすり替わることはないようですが。
    このような現象に遭遇している人がいないかとネットで検索してみましたが、このような話は見つけられませんでした。

    ADO.NET だとこのような現象は発生しませんでした。
    この際なので、いっそのこと ADO.NET に移行してしまってはいかがでしょうか?
    2011年5月25日 3:03
  • ADO.NETに変えてもいいと思いますが、変更は大変でしょうか?

    connectionのところを変えるだけで大丈夫でしょうか?

     

    2011年5月25日 3:38
  • use kyohoDB の一行を削除して実行しましたが、同じでした。

    また、use kyubuDB にして行っても同じ結果でした。

     

    2011年5月25日 3:42
  • ADO.NETに変えてもいいと思いますが、変更は大変でしょうか?
    connectionのところを変えるだけで大丈夫でしょうか?


    まったくアーキテクチャが違うので変更はかなり大変だと思います。でも .NET 使うなら ADO.NET がでふぉですよ。今回は直ちに無理かもしれませんが、勉強する必要性大です。

    ADO.NET基礎講座

    あと初心者ならこの辺りの本が判り易そうです。

    http://www.amazon.co.jp/dp/4774128058


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2011年5月25日 5:07
    モデレータ
  • となると、ADODB が試せる状況じゃないので断言できませんが、totojo さんの 「DB がすり替わる」 という話が原因のような気がします。 


    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答の候補に設定 aviator__ 2011年5月26日 0:31
    • 回答の候補の設定解除 aviator__ 2011年5月26日 0:31
    2011年5月25日 5:12
    モデレータ
  • CnnインスタンスがADODB.Connectionクラスなので、ADOへの切り替えってそのまま行けちゃう気もします・・・

    Cnn.ConnectionString = "Provider=SQLOLEDB;" & _
         "Data Source=192.168.0.104;" & _
         "Initial Catalog=kyubuDB;" & _
         "Persist Security Info=True;" & _
         "User ID=sa;" & _
         "Password=**********"
    を、

    Cnn.ConnectionString = "Data Source=192.168.0.104;" & _
         "Initial Catalog=kyubuDB;" & _
         "Persist Security Info=True;" & _
         "User ID=sa;" & _
         "Password=**********"
    とかにしたらどうなりますかね?※一行目いらない

    クラスがADOなので変にプロバイダを指定しなければ良い気もするんですが。

    2011年5月26日 0:34
  • >> ADO.NETに変えてもいいと思いますが、変更は大変でしょうか?
    >> connectionのところを変えるだけで大丈夫でしょうか?

    > CnnインスタンスがADODB.Connectionクラスなので、ADOへの切り替えってそのまま行けちゃう気もします・・・

    いえ・・・totojoさんと私が言ってるのは ADO.NET ですから(汗


    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答としてマーク 京太郎 2011年5月31日 4:24
    2011年5月26日 1:14
    モデレータ
  • ADO.NET への移行に着手する前に、まずは Connection の Open 直後にダミーの SELECT を発行してお茶を濁しておいて、余力ができてから ADO.NET に乗り換えるのがいいと思います。
    ダミーの SELECT は、"SELECT GETDATE()" みたいなやつでも問題なさそうです。
    Connection を Open して最初の SQL が "use tempdb" のときに DefaultDatabase がすり替わってしまうように見えます。
    まずは、ご自身で DefaultDatabase を監視しながら、本当にすり替わるかどうかを確認してみてください。

    ADO.NET への切り替えは SqlConnection/SqlCommand/SqlDataReader あたりに置き換えることになろうかと思われます。
    SqlConnection には Execute 系のメソッドが存在せず SqlCommand 経由にする必要があったり、その SqlCommand にも Execute という名のメソッドはなく ExecuteXXXXX というメソッドがいくつかあったり、作りを見直すべきところが結構出てきます。
    少なくとも Connection のところを変えれば何とかなる規模ではないと思います。
    2011年5月26日 2:21
  • 忘れて下さい・・・ごっちゃごちゃになってました

    2011年5月26日 3:08
  • 返答が遅くなって申し訳ございません。

    一度試してみます。

     

    2011年5月26日 23:59
  • 私も同じ現象に遭いました。
    接続文字列のInitial Catalog=kyubuDB の部分が不適切だと、「オブジェクト名'*****'が無効です」 の例外が発生します。
    kyubuDB変数の内容に問題がある可能性が高いです。
    2020年3月23日 8:03