• ベストアンサー

VBを介したデータベース閲覧についての質問

VB初心者なのですが、学校の課題でVBを使い簡単なクイズゲームを作ろうと思っています。 クイズは、乱数を使ってランダムに問題を表示させる形式を取っており、マイクロソフトのアクセスで作ったデータベースから問題のデータを取得するというやり方にしようと思っています。 そこで、いざプログラミングしてみたところ、データベースを読み込み、乱数を記述するところまでは上手くいったのですが、 SQLCm.CommandText = SELECT (項目の名前) FORM (クエリー(?)の名前) WHERE (問題番号を記述した項目の名前) = (乱数の名前) と記述すると、なぜか Cn.Open() Value = SQLCm.ExecuteScalar Cn.Close() の、二行目でエラー(例外だったかもしれません)が発生し、無理矢理起動してみても、指定したラベルに何も表示されません。 先生に見ていただいたところ、変数を定義したり、データベースにアクセスできていないというわけではないとのことでした。実際、乱数のところを普通の数字に変えると、データベースに記述されている通りの問題が表示されました。 どなたか、アドバイスをいただけませんでしょうか? また、原因を教えていただけると助かります。 初歩的な質問をして申し訳ありません。沢山のサイトや過去の質問を見てみたのですが、答えにたどり着けませんでした。 是非、ご指南の方をよろしくお願いします。

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

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

何度も分けて書いて申し訳ありませんが… 乱数のところを数字に変えるとうまくいく、んですよね。 だとすると…SQL文のところを、例えば "SELECT QuestionString FROM QuestionTable WHERE QuestionNumber = RandomNumber" みたいに書いてませんか? 上の RandomNumber にあたる部分は、ちゃんと数字(を示す文字列)に変えてやらないとダメです。 SQLCm.CommandText = "SELECT QuestionString FROM QuestionTable WHERE QuestionNumber = " & CStr(RandomNumber) みたいな感じで。 SQL文はあくまで文字列ですので、変数名を記述しても勝手に変換してくれたりは しません。

salere
質問者

お礼

回答ありがとうございました。 CSrt(RandomNumber)と記述したところ、正常に動きました! ダブルクオーテーションがついている時点で、文字列だということに気がつくべきでした…… 初歩的な質問にも関わらず、何度も丁寧に答えていただき本当にありがとうございました!

その他の回答 (4)

回答No.4

あ、ついでに気になったのですが、SQL文はちゃんと "(ダブルクオーテーション)で括ってますか? CommandText(と言うより、コードに記述するSQL文は全て、と言った方がいいか?)は あくまで文字列ですからね。

回答No.3

>SQLCm.CommandText = SELECT (項目の名前) FORM (クエリー(?)の名前) WHERE (問題番号を記述した項目の名前) = (乱数の名前) FORM ではなく、FROM です。 …そういう問題じゃない?

noname#60992
noname#60992
回答No.2

課題ですので、考え方を >実際、乱数のところを普通の数字に変えると、データベースに記述されている通りの問題が表示されました。 であれば、 SQLCm.CommandText をイミディエィトウインドウなどに表示させてみて、意図されているものになっているか確認してみたらどうでしょうか? (乱数の名前)を数字に変えると動くんですよね。 (乱数の名前)は数字で表示されますか?

salere
質問者

お礼

回答ありがとうございます。 課題ということで、考え方を教えてくださったご配慮に感謝しております。 おかげさまで、プログラムが動かない原因が分かりました! ただ答えを教えていただけるより、ずっと頭に残りました。今後とも忘れることは無いと思います。 本当にありがとうございました!

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

(1)乱数で発生させたコードがDB上に存在しない。  例えば、問題番号が1~9なのに、乱数で作ったキーが0だとか・・・ (2)乱数の使い方が誤っている。 ところで、(問題番号を記述した項目)の属性は何ですか? 整数で連続したものでないと、おそらく成功しないと思いますよ。

salere
質問者

お礼

回答ありがとうございました。 1も2も、確認したところきちんと動作していました。 属性についてのご指南、ありがとうございました。 新しくデータベースを製作する予定ですので、その時にはしっかりと気をつけようと思います。 ご解答、ありがとうございました!

関連するQ&A

  • VB2005でMDBに接続方法

    お世話になります。 VB2005でアクセスに接続したいのですが、 よく理解できません。 こんな感じで、ネットで見たのを 記述したのですが、なんかエラーになります。 VB6みたいに参照設定が必要なのでしょうか? (記述例) Dim Cn As New OleDbConnection  ↑で警告?になる。 ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\データ.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand ↑参照コンポーネントがみつかりませんでした。 と怒られます。 宜しくお願いいたします。

  • VB.NET 2008 データベースの接続の方法について教えてください

    VB.NET 2008 データベースの接続の方法について教えてください。 VB6から2008へ乗り換え中の初心者です。 作成しているプログラムでは、DATASETデザイナでデータベースに接続し、 「TABLEADAPTER」を利用して、画面にテキストボックスを作成しています。 また、それとは別に標準モジュールの中で、「OleDb.OleDbDataAdapter」を記述して、 データベースからデータを取得しています。 そこで質問なのですが、 ・VB2008において、このように標準モジュールにおいては、ソースを記述して  「OleDb.OleDbDataAdapter」を用いる方法が正しいのでしょうか?  (フォーム側は項目も多いためTABLEADAPTERから項目を貼り付けるのが便利で助かっています。) ・そして、このように2種類の接続を用いた場合に、  データベースの名前や、ユーザ名、パスワードをINIファイル等から取得するには  どのようにすればいいでしょうか?  色々とサイトを検索して「OleDb.OleDbDataAdapter」側はINIファイルから  取得する方法を見つけたのですが、  フォーム側のデータソースの情報も同じ様にINIファイルから取得出来るのでしょうか?  (プロジェクトのプロパティに記述されている事はなんとかみつけたのですが・・・   どの様にすればいいか分かりません。) 分かりにくい文章とは思いますが、お許しください。 どうぞご教示お願いします。

  • VBでSQL文のUPDATE構文を使った時のエラーについて

    こんにちは。全くのVB初心者ですが回答、ご指摘のほうよろしければお願いします。 Microsoft Visual Studio 2005でデータベース管理のアプリケーションを制作しているんですが、エラーが出て困っています。 本フォームの各Textboxの編集した値を、 利用者カルテフォーム(別フォーム)のDataGridViewとデータベースに反映させるというプログラミングにしようとしています。 以下のコードでデバッグしようとしても「UPDATE ステートメントの構文エラーです。」というエラーメッセージが出てきて実行できない状態です。 VB中学校というサイトのデータベース講座を参考にしました。 ------------------------------------------------------------ Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:xxxx.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Table As DataTable = DirectCast(利用者カルテDataGridView1.DataSource, DataTable) Dim Row As DataRow Dim Adapter As New OleDbDataAdapter(SQLCm) Row = Table.NewRow Row("No") = NotextBox.Text Row("名前") = 名前TextBox.Text Row("フリガナ") = フリガナTextBox.Text Table.Rows.Add(Row) Dim SQL As String = "" SQL = "UPDATE 患者データ SET " SQL &= " No = " & Row("No") & "', " SQL &= " 名前 = '" & Row("名前") & "', " SQL &= " フリガナ= " & Row("フリガナ") & "', " SQL &= " WHERE " SQL &= " No = " & NotextBox.Text SQLCm.CommandText = SQL Cn.Open() ※SQLCm.ExecuteNonQuery() Cn.Close() 利用者カルテ.Show() Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub ---------------------------------------------------------- 以上が実際にエラーがでる部分になります。 ※の部分で「UPDATE ステートメントの構文エラーです。」というエラーが指摘されています。 ちなみに他のフォームでINSERT文も使っているのですが、そちらは問題なく実行できる状態です。 初歩的な質問で申し訳ないですが、よければ回答のほうよろしくお願いします。

  • VB2008からVB2010に更新したのですけど。

    VB2008EEで作ったデーターベース(Accessでつくった。)を操作するプロジェクトをVB2010EEでファイルを更新して実行しましたが、「Micosoft.Jet.OLED.4.0プロバイダーはローカルのコンピューターに登録されていません。」とのエラーが表示され、データーベースにアクセスできません。データーベースは少し古いAccessで作ってます。このエラーを解除する方法を教えてください。いろいろ本を買って読んだり、いろいろ質問項目をみていたのですが、解決方法が見つかりません。どうかよろしくお願い申し上げます。

  • VB2005にてデータベースに接続したい。

    VBの経験は、VB6にて簡単な改修などしか行ったことがない初心者です。質問の内容が自分のスキルと見合っていないことは承知しているのですが、業務上どうしても必要になってしまったのでお分かりでしたら教えて下さい。 現在、簡単な社員管理システムのようなものを作成していて、アクセスで作成したデータベースをVB2005を使って操作するようにしています。 その際に、データベースがある共有フォルダにパスワードが設定してあった場合の接続方法がわかりません。windows上で一度そのフォルダにアクセスして、ユーザー名、パスワードを入力し接続してしまえば、VBからも接続できるのですが・・・ 接続文字列の前に何か記入すべきコードがあるのでしょうか?お分かりの方がいらしたら教えて下さい。よろしくお願いします。 現在の接続文字列は以下のとおりです。 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\192.168.0.1\tadasuke2002\db1.mdb")

  • データベースがつながりません!

    クイズのデータベースを作ってVBで表示するクイズゲームなのですが、セットアップEXEにしてOSとオフィスだけのPCで実行すると、フィールドまたはデータメンバに連結できません’545’とでます。連結の仕方教えてください。お願いします!

  • VBAをVBで焼き直ししたい

    access2003 VBAで下記のように、クエリー(qqq00)を作成し、 そのクエリー元に再処理をし、テーブル(tb0)にupdateしています。 このVBAを、VB2010に焼き直しをしたいのですが、 分かりませんので教えて頂けませんか。 (access2003のプログラム) sql00 = " SELECT xren.*" _ & " FROM xren ; " sql01 = " SELECT Avg(qqq00.kei04) AS avkei04," _ & " FROM qqq00 ; " Set qrdef_0 = db.CreateQueryDef("qqq00", sql00) Set tb = db.OpenRecordset("qqq00") Do nsu = nsu + 1 tb0.AddNew tb0!ren_no = tb!ren_no tb0!avkei04 = tb!avkei04 tb0.Update tb.MoveNext Loop Until tb.EOF DoCmd.DeleteObject acQuery, "qqq00" qrdef_0.Close: Set qrdef_0 = Nothing (VB2010のプログラム) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\xxxxxs.mdb")     Dim SQLCm As OleDbCommand = Cn.CreateCommand     Dim Adapter As New OleDbDataAdapter(SQLCm)     Dim Table As New DataTable     SQLCm.CommandText = "SELECT * xren"     Adapter.Fill(Table) ここからが分かりません。      (1)クエリー(qqq00)名のつけ方      (2)qqq00の実行方法      (3)テーブル(tb0)へのupdate方法     Table.Dispose()     Adapter.Dispose()     SQLCm.Dispose()     Cn.Dispose() End Sub

  • .NET MDBデータベース更新について質問です

    DataGridViewで表示するところまでできたのですが DataGridView上で編集したものを更新ボタンで MDBデータベースに上書き保存という形で 行いたいのですがいろいろ調べてもわかりませんでした。 VBを初めて日が浅いのでこつこつ勉強中なのですが 業務上の都合でDBの作成を行っています。 基本的に書き直したもの 'データベース取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=保存場所" ) Dim Cm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(Cm) Dim Table As New DataTable Cn.Open() Cm.CommandText = "SELECT * FROM Aテーブル" Adapter.Fill(Table) DataGridView1.DataSource = Table DBにはこのように接続しております。 ここまでも手探りで行ったので熟練の方から見ればへんかもしれませんが指導おねがいします。

  • VB6でデータベースを変えるとテーブル形式エラーになります

    VB6 とACCESS97 でプログラムを作成、問題なく動いていました。 事情により、このパソコンにACCESS2000をインストールし(ACCESS97 と ACCESS2000 の二つが入っています)VB6のデータベースをACCESS2000に変換しました。 VBの参照設定をMicrosoft Access8.0 Object Livery から9.0 に換え、ACCESS 2000のデータベースのプロパティでファイルの種類をMicrosoft Access から Microsoft Access for Windows に換えました。 これを実行すると「実行時エラー3343 データベースの形式 "C:\SALES\TEST.mdb" を認識できません」と出ます。 他に修正すべきところがあるのでしょうか?それともバージョンの違うACCESS を併用するのはまずいのでしょうか? TEST.mdb をクリックすると、ACCESS2000で問題なく立ち上がります。 なお、VBからACCESSへの接続は下記のように書いています。 Public DB As DAO.Database Set DB = DBEngine.Workspaces(0).OpenDatabase("C:\SALES\TEST.mdb") 宜しくお願いします。

  • Vb2010にアクセスのデータを出力

    前回、似たような質問をさせて頂いたのですが、私の説明が悪く、解決には至らなかったので、再度練った説明で質問させていただきます。 ・visual basic 2010 設置コントロール TextBox1、TextBox2、TextBox3 Button1 ・アクセスのテーブル  ID(数字)、氏名(テキスト)、性別(テキスト) TextBox1にアクセスのID入力し、その横に設置したButtomを押したら、そのIDのデータ(名前、性別)がTextBox2,TextBox3に出力される、というプログラムを書き方のヒントを教えていただけないでしょうか。 Imports System.Data.OleDb Public Class Form1 Private Sub Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Enter '▼データの取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\Animals.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(SQLCm) Dim Table As New DataTable SQLCm.CommandText = "SELECT * FROM T_akusesu" Adapter.Fill(Table) '▼データの連結 textbox.DataBindings.Add("Text", Table, "名前") textbox2.DataBindings.Add("Text", Table, "性別") Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub End Class また、Buttonのイベントには何を書くべきなのでしょうか? 以上、よろしくお願い致します。

専門家に質問してみよう