none
ACCESSデータベースの接続について RRS feed

  • 質問

  • よろしくお願いします。ACCESS2003とVb2005でWindowsアプリを開発しています。

    以下のようなコードでデータベースからSELECT文でデータをDataGRidViewに表示させているのですが、操作により表示ができたり、できなかったりするのですが原因がわからないのでお伺いしたく書込みしました。よろしくお願いします。

     

    「Form1」   データベースから「出勤」データを表示させるコード

     Dim myProg As String = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) ’プログラムフォルダ名取得
            Dim mdb As String = myProg & "\フォルダ名\アプリケーション名フォルダ\データベース名.mdb" ’データベースのファイルパス

    Dim dbcon As New OleDbConnection
            dbcon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Data Source = " & mdb '
            dbcon.Open()

    Try

    ’ここにSELECT文

    Catch ex As Exception

    ’エラーメッセージ

     Finally
                dbcon.Close()
        End Try

     

    「Form2」  DataSetから「金額」データを表示

     Form2_Load・・・・の部分にTableAdapterをFillしています。

    ボタン1ClickでDataSetの該当テーブルからTableAdapterで作ったクエリを呼び出してデータを表示させています。

     

    ------------------------------------------

    アプリケーションを立ち上げて「Form1」の操作をすると問題なく表示されるのですが、「Form2」の操作をしてから「Form2」を閉じ、「Form1」の操作をすると、エラーも何も出ないのですが、データが表示されません。

    ファイルパスの取り方が悪いのか、データベースに直接アクセスする時は何か決まりごとみたいなものがあるのでしょうか?

    「Form2」を閉じる時に何か操作が必要なのでしょうか?

     

    何を調べれば良いのかわかりません、アドバイスありましたらよろしくお願い致します。

     

     

    2007年6月5日 13:13

回答

  • select文をどのように発行し、どのようにDataGridViewに表示しているのでしょうか?
    まずはここの部分を調査し、データが抽出できているのか、またはデータが抽出できているにもかかわらずDataGridViewに表示できないのかを切り分けましょう。このように切り分けを進めていくと、どこに原因があるのかを辿って行けます。

     

    あと、もう少し詳しいソースを提示していただけると、もう少し具体的なアドバイスができると思います。

    2007年6月5日 14:56
    モデレータ
  • SQL文が文字列として組み立てられていますので、表示されない時に思い通りのSQL文が組み立てられているかをまずチェックしてみて下さい。例えば、何らかの関連でMonthCalendarの選択範囲が変わってしまっているなどです。

    あと、稼動日はどのようにセットされていますか? もし、稼働日に時刻情報が含まれている場合、日付だけで抽出範囲を絞ると、同じ日に見えても実は大小関係があって、うまく抽出できない場合があります。

    2007年6月6日 1:02
    モデレータ
  •  bykyo さんからの引用

    この影響をなくす方法を取ればよいか、「Form1」の日付を和暦→西暦に変えたらよいのかと思い、

    色々いじっているのですが解決に至っていません。

    解決法をご存知でしたらご教示いただけませんでしょうか?よろしくお願い致します。

    引き続き、コードの変更などを試してみます。

    焦って部分的に手当てをしてももぐらたたきのようになってしまうだけです。こんな時はすぱっとプログラムを弄るのをやめて、全体をゆっくりと考え直してみることをお勧めします。そうすると以外に良いアイディアが浮かんだり、木だけ見ていたことがわかり、森が見えてくるようになったりするものです。

    さて、Form2で和暦が必要なのは一時的なのでしょうか? ひょっとするとApplication.CurrentCultureを弄る必要はないのかもしれません。もし、一時的に弄るのであれば、弄り終わった後に元に戻すのが原則です。例えばForm2をクローズする時などにです。

    また、Application.CurrentCultureの影響をForm1でも受けるのであれば、カレンダーの日付を和暦から西暦に変換することになるでしょう。この辺りのことは、以下が参考になります。

     

    西暦と和暦を変換するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/034wareki/wareki.html

     

    また、和暦になっていても、MonthCalendar1.SelectionRange.Start.Year は西暦4桁を返すようなので、これを利用してSQL文を組み立てることもできるでしょう。

    2007年6月6日 15:34
    モデレータ

すべての返信

  • select文をどのように発行し、どのようにDataGridViewに表示しているのでしょうか?
    まずはここの部分を調査し、データが抽出できているのか、またはデータが抽出できているにもかかわらずDataGridViewに表示できないのかを切り分けましょう。このように切り分けを進めていくと、どこに原因があるのかを辿って行けます。

     

    あと、もう少し詳しいソースを提示していただけると、もう少し具体的なアドバイスができると思います。

    2007年6月5日 14:56
    モデレータ
  • trapemiyaさま、返信ありがとうございます。

    Select文の部分を書きます。詳しいソースを書かずに投稿してしまい、すみません。

    mdbへの接続が問題なのかと思って、Select文のところを割愛してしまいました。

     

    「Form1」   データベースから「出勤」データを表示させるコード

     Dim myProg As String = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) ’プログラムフォルダ名取得
            Dim mdb As String = myProg & "\フォルダ名\アプリケーション名フォルダ\データベース名.mdb" ’データベースのファイルパス

    Dim dbcon As New OleDbConnection
            dbcon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Data Source = " & mdb '
            dbcon.Open()

    Try

     sql = "SELECT 出勤表.ナンバー,出勤表.氏名 " _
                                        & ",Sum(出勤表.残業時間) AS 残業  "

                          sql &= " FROM 出勤表"
                            sql &= String.Format(" WHERE 出勤表.稼働日 BETWEEN #{0:yyyy/MM/dd}# AND #{1:yyyy/MM/dd}# ", _
                            MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End)  ’カレンダーの選択期間
                            sql &= " GROUP BY 出勤表.ナンバー,出勤表.氏名"
                            sql &= " ORDER BY 出勤表.ナンバー"


                            Dim dbadpt As New OleDb.OleDbDataAdapter(sql, dbcon)
                            Dim ds As New DataSet
                            dbadpt.Fill(ds)
                            DataGridView1.DataSource = ds.Tables(0)

    Catch ex As Exception

    ’エラーメッセージ

     Finally
                dbcon.Close()
        End Try

     

    以上のような感じです。

    返信を読んでとりあえずソースを投稿しましたのでまだ切り分け検証を行っていません。

    どの地点でデータが取れていない、又は表示ができていないのか、これからもう一度調べなおします。

    引き続きアドバイスありましたらどうぞよろしくお願い致します。

     

    2007年6月6日 0:25
  • SQL文が文字列として組み立てられていますので、表示されない時に思い通りのSQL文が組み立てられているかをまずチェックしてみて下さい。例えば、何らかの関連でMonthCalendarの選択範囲が変わってしまっているなどです。

    あと、稼動日はどのようにセットされていますか? もし、稼働日に時刻情報が含まれている場合、日付だけで抽出範囲を絞ると、同じ日に見えても実は大小関係があって、うまく抽出できない場合があります。

    2007年6月6日 1:02
    モデレータ
  • trapemiyaさま、返信ありがとうございます。
    アドバイスに従い、日付部分のSQL文がきちんと組み立てられているか
    見たところ、ご指摘どおり日付の表示が変わっていることが判明しました。
    「Form2」を操作すると、「Form1」のカレンダーの選択範囲の日付が西暦から和暦に変わっていることが分かりました。
    WHERE 出勤表.稼働日 BETWEEN #2006/01/01 AND  #2006/01/31  とならなければならないのに
    WHERE 出勤表.稼働日 BETWEEN #18/01/01  AND #18/01/31 となっていました。


    「Form2」にもDataGridViewがあり、日付の表示を西暦から和暦にしています。
    「Form2」には、


    Imports System.Globalization
    -------------------------------
        Dim myCI As New CultureInfo("ja-JP", False)
            Dim myCIclone As CultureInfo = CType(myCI.Clone(), CultureInfo)
            myCIclone.DateTimeFormat.Calendar = New JapaneseCalendar()
            Application.CurrentCulture = myCIclone
            myCIclone.DateTimeFormat.LongDatePattern = "gg yy'/'MM'/'dd"

     

    というコードを書いており、赤の部分によりアプリケーション全体に和暦表示が影響
    しているからでは?と思っています。

    この影響をなくす方法を取ればよいか、「Form1」の日付を和暦→西暦に変えたらよいのかと思い、

    色々いじっているのですが解決に至っていません。

    解決法をご存知でしたらご教示いただけませんでしょうか?よろしくお願い致します。

    引き続き、コードの変更などを試してみます。

    2007年6月6日 11:48
  •  bykyo さんからの引用

    この影響をなくす方法を取ればよいか、「Form1」の日付を和暦→西暦に変えたらよいのかと思い、

    色々いじっているのですが解決に至っていません。

    解決法をご存知でしたらご教示いただけませんでしょうか?よろしくお願い致します。

    引き続き、コードの変更などを試してみます。

    焦って部分的に手当てをしてももぐらたたきのようになってしまうだけです。こんな時はすぱっとプログラムを弄るのをやめて、全体をゆっくりと考え直してみることをお勧めします。そうすると以外に良いアイディアが浮かんだり、木だけ見ていたことがわかり、森が見えてくるようになったりするものです。

    さて、Form2で和暦が必要なのは一時的なのでしょうか? ひょっとするとApplication.CurrentCultureを弄る必要はないのかもしれません。もし、一時的に弄るのであれば、弄り終わった後に元に戻すのが原則です。例えばForm2をクローズする時などにです。

    また、Application.CurrentCultureの影響をForm1でも受けるのであれば、カレンダーの日付を和暦から西暦に変換することになるでしょう。この辺りのことは、以下が参考になります。

     

    西暦と和暦を変換するには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/034wareki/wareki.html

     

    また、和暦になっていても、MonthCalendar1.SelectionRange.Start.Year は西暦4桁を返すようなので、これを利用してSQL文を組み立てることもできるでしょう。

    2007年6月6日 15:34
    モデレータ
  • trapemiyaさま、返信ありがとうございました。

     

     trapemiya さんからの引用

     

    さて、Form2で和暦が必要なのは一時的なのでしょうか? ひょっとするとApplication.CurrentCultureを弄る必要はないのかもしれません。もし、一時的に弄るのであれば、弄り終わった後に元に戻すのが原則です。例えばForm2をクローズする時などにです。

     

    この度もアドバイスありがとうございました。おかげさまできちんと表示できるようになりました。

    「Form1」でカレンダーの日付の設定を変える方法より、教えて頂いた原則に従い、「Form2」closing~のところでApplication.CurrentCultureを元に戻す方法を採りました。

     

    「Form2」

     Private Sub Form2_FormClosing _
        (ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) _
        Handles MyBase.FormClosing


            '---------'アプリケーションの和暦設定を西暦に
            Dim myCI As New CultureInfo( "ja-JP" ,  False)
            Dim myCIclone As CultureInfo = CType(myCI.Clone(), CultureInfo)
            myCIclone.DateTimeFormat.Calendar = New GregorianCalendar()
            Application.CurrentCulture = myCIclone

     

     

    参考サイトの提示ありがとうございました。和暦⇔西暦の変換の仕方が説明つきでわかりやすく載っていたので勉強になりました。

    この度も助けていただいて本当にありがとうございました。また見かけた時にはよろしくお願いします。

    2007年6月7日 14:02