• 締切済み

OleDbDataAdapterのエラー

OS:Windows7 Visual Studio2012Professional いつもこちらでお世話になっています。 OleDbプロバイダーのOleDbDataAdapterでAccessファイルからDataSetへデータを取込む作業をしています。 下記のコードで、一度はDataSetへデータを取り込めたのですが、接続文字列を変更したところ、変更前の接続文字列(パス)を参照に行ってしまいエラーになります。 リビルドしたり、プロジェクトを作成し直したりしましたが、やはり変更前の接続文字列を使用してしまいます。 【コード】 private void Form1_Load ( object sender, EventArgs e ) {  string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\hoge変更後\○○.mdb;"  string sql = @"SELECT * FROM Table;";  DataSet ds = new DataSet();  OleDbConnection cn = new OleDbConnection();  cn.ConnectionString = connectionString;  OleDbCommand cmd = new OleDbCommand();  using (OleDbDataAdapter da = new OleDbDataAdapter()) {  cmd.Connection = cn;  cmd.CommandText = sql;  da.SelectCommand = cmd;  da.Fill( ds ); ← ここで『System.Data.OleDb.OleDbException』エラー   } this.dataGridView.DataSource = ds.Tables[0]; } 【エラー】 System.Data.OleDb.OleDbException はハンドルされませんでした。 HResult=-2147467259 Message=パス 'D:\hoge前\○○.mdb' は正しくありません。パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。 Source=Microsoft JET Database Engine ErrorCode=-2147467259 どなたか原因がおわかりになりますでしょうか。 どうぞよろしくお願いいたします。

みんなの回答

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

>>それでもどこかに古いパスが残っているのかも知れないと、念のためプロジェクト全体を検索しましたが、どこにも見つかりませんでした。 プロジェクト全体ではなく、ソリューション全体で検索してみてはどうでしょう?ただ、プログラムが1プロジェクトのみで構成されているなら、これは関係ないですけどね。 また、ソリューションユーザオプションの *.suo も削除してみてください。 それから、どこかのテキストファイルの中にパスを記録しているのかもしれませんので、ディレクトリ以下のファイルを全てテキスト検索してみるのもいいかと思います。(私の使っているPeggyPro for PHPエディターは、サブディレクトリーまで検索してくれますので、こういう検索時に役立っています) どうしてもダメなら、別ディレクトリの下に、作成したソリューションのディレクトリやファイルをコピーして、不要なファイル(怪しいと思うファイル)を削除してビルドし、動作がどうなるか?を確認してみるのも価値があると思います。そのディレクトリー下には、本来、古いパスの情報が無いはずですから、たとえエラーが発生しても古いパスが表示されなくなるはずですのでね。 基本的に、.Net Frameworkで作成したプログラムはレジストリ登録不要で動作しているはずですので、プロジェクト(ソリューション)ディレクトリの下に全情報があると思っています。どこかに古いパスが残っていると思います。

chibiken6
質問者

補足

lv4uさん、たびたびありがとうございます。 全てのディレクトリで接続文字列を検索しましたが、見つかりませんでした。 バイナリ変換されている気もしますが。 ひとつ気になった点があります。 [新しいデータソースの追加]-[データソース構成ウィザード]に、古いデータ接続(接続文字列も含む)が表示されています。 これは新規にソリューションを作成しても、規定値のように表示されます。 この古いデータ接続情報は、ウィザードでは削除できません。 Visual Studioは、このデータ接続情報をどこに保持しているのでしょう...

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

エラーメッセージが「パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを確認してください。」っていうことですので、AccessのMDBファイルの場所が正しく認識されていないのだと思えます。(私はC#でAccessファイルを使っていますが、先日、同様のエラーが出ました。) たぶん、データセットのソースかどこかを探せば、古いパスが残っていると思いますので、それを検索して、正しいパスに修正してあげれば、直ると思います。 Visual Studio (VS)は、メタ・プログラミングの考え方を取り入れて、私たちの入力に反応して、ソースコードを色々と生成してくれています。クリーンな状態からソースコードを生成される場合は、問題が起こりにくいですけど、今回のように、一応出来上がった後に、一部を修正したような場合、関連するソースコードがうまく生成・修正されないことがあります。ある意味、VSのバグといえるかもしれませんね。 自動生成されたソースコードには、「このコードを変更しないでください」みたいなコメントが入っていると思いますけど、リビルドでは解決せず、その警告を無視して、生成されたソースコードを削除・修正してあげないと解決できないことがありますので、VSを使うときには、注意が必要みたいです。 ちなみに、上記の問題以外でも、「なんでエラーが解消されないの?自分の入力したコードに間違いは無いはずなのに?リビルドしたのに?」と思うことが何度かあって、問題のある自動生成ソースコードを探すのに時間とられました・・・。

chibiken6
質問者

補足

lv4uさん、回答いただきありがとうございます。 今回作成したコードについて補足します。 私もVisual Studioに自動生成させた際のデメリットとしてlv4uさんがおっしゃられる点を感じています。 そのため、今回は自動生成を行っておりません。 それでもどこかに古いパスが残っているのかも知れないと、念のためプロジェクト全体を検索しましたが、どこにも見つかりませんでした。 しかしエラーに記されているパスは古いものですので、どこかに古いパスが残っているはずなのです。 一からプロジェクトを作成し直しても同じエラーになるので、Visual Studioはどこにその古いパスを隠し持っているのかが分かりません。

関連するQ&A

  • DataSet ds = new DataSet();

    DataSet ds = new DataSet(); System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(); da.SelectCommand = cmd; da.Fill(ds); でデータを格納したときに、 重複データを省きたいのですが可能でしょうか? DataReader ならひとつひとつ格納していくので、 重複データを省くことができるのですが。

  • GridViewのデータソースの入れ方がわかりません

    OleDb.OleDbDataAdapter' が定義されていません DataSet' が定義されていません。 OleDb.OleDbConnection' が定義されていません。 OleDb.OleDbDataAdapter' が定義されていません 以上の エラーが出ます 定義の、意味がわかりません 教えてください お願いします WinXP Microsoft Visual Web Developer 2008 ASPX Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("顧客台帳") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\*******\*****.mdb;") 'データセットに取得し、DataGridViewに関連付ける dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 顧客台帳", cn) dAdp.Fill(dSet, "顧客台帳") Me.GridView1.DataSource = dSet.Tables("顧客台帳") End Sub

  • VB2008でMDBのオ-トナンバの項目をキ-にして読み込めなくて困っています

    VB2008とADO.NETを勉強中の超初心者です。 MDBのオ-トナンバの項目をキ-にして、読み込みたいと思って以下のようなプログラムを作ってみました。 Dim yobidashikey As Int32 = 1 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\KEYCHECK.mdb" Dim da As OleDbDataAdapter 'da = New OleDbDataAdapter("SELECT * FROM data WHERE key1 = 2", cn) da = New OleDbDataAdapter("SELECT * FROM data WHERE key1 = '" & yobidashikey & "'", cn) Dim ds As New DataSet da.Fill(ds, "data") DataGridView1.DataSource = ds.Tables("data") コメントアウトしてある直接「2」を指定した時は、デ-タグリッドビュ-にオ-トナンバが2の行が表示できました。 次に、yobidashikeyにオ-トナンバの値を入れて動作させると、da.Fill(ds, "data")で「抽出条件でデータ型が一致しません。」のエラ-が出てしまいました。 ちなみに、Dim yobidashikey As Int32 としたのは、DRead.GetFieldType(i).ToString()でオ-トナンバの項目がInt32と 表示されたので、この型にしました。 実際にオ-トナンバをキイ-にして読み込むシステムを作りたいので、是非教えて頂きたいと思います。 よろしくお願いします。

  • データリーダーからのデータ読み出し方法(VB)

    お世話になってます。 先日データコネクションを質問しその後うまくいっているように見えたのですが、表記でまた躓いています。 コードは Dim cn As New OleDb.OleDbConnection Dim cmd As New OleDb.OleDbCommand Dim dr As OleDb.OleDbDataReader 'コマンドのコネクション設定 cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\DB\Report.mdb" 'コネクションを開く cn.Open() 'コマンドの定義 cmd.CommandText = "SELECT password FROM T_Staff WHERE Staff_ID = '" & txtUserID.Text & "'" 'データリーダーからのデータの読み出し dr = cmd.ExecuteReader() ************************************************** 最後の行で ExecuteReader: Connection プロパティは初期化されていません。 と言うエラーメッセージが出ます。 少し検索してみましたがよくわかりません。 これって結局接続できていないのでしょうか? 初期化されていなというのはどういう状態のことなんでしょう? よろしくお願いいたします。

  • VB2005とADO.NETを使った時のSELECT文の書き方で分らないことがあり困っています

    VB2005とADO.NETを本で勉強中の超初心者です。本のサンプルを参考に以下のようなコ-ドを作って動作させるとDataGridViewにDBの内容が正しく表示されますが、 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\Order.mdb" Dim da As OleDbDataAdapter da = New OleDbDataAdapter("SELECT * FROM Goods;", cn) Dim ds As New DataSet da.Fill(ds, "Goods") DataGridView1.DataSource = ds.Tables("Good 特定のコ-ドをFormのテキストボックスから入力して、表示させたいと思い"SELECT * FROM Goods WHERE GoodsId = TextBox1.Text;"とするとエラ-になってしまいました。ちなみに"SELECT * FROM Goods WHERE GoodsId = 'A0001';として動作させるとA0001だけを表示することはできました。 どのようにすればテキストボックスや変数で、表示したいコ-ドを指定したら良いか教えて頂けないでしょうか。

  • VB.netでJet.OLEDBを使いCSVを読み

    VB.netでOleDbConnectionを使ってCSVを読み込むと便利ですが、属性判定を勝手にされたくありません。 どうすればコントロールできますか? 個別に属性を決めるか、もしくは全部文字列として受け取りたいです。 何もしなければ、項目の属性が自動で決まりますが、その属性判断が甘く、属性に合わない値が消えます。 例えば、 日付項目っぽい値が入っている項目にたまに文字列がるとすると、 その項目が日付項目になって、日付項目に合わないデータは空白になってしまいます。 CSVの読み込みは一旦すべて文字列にして受け取り、その後の事はアプリでコントロールしたいです。 どうすればできますか? Dim OleDbConnection1 As New OleDb.OleDbConnection Dim OleDbCommand1 As New OleDb.OleDbCommand Dim OleDbDataAdapter1 As New OleDb.OleDbDataAdapter Dim FileInfo1 As New FileInfo(CSVファイルの名前をフルパスで) OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & FileInfo1.DirectoryName & "\;" _ & "Extended Properties=" & ControlChars.Quote & "Text;HDR=No;FMT=Delimited" & ControlChars.Quote OleDbConnection1.Open() OleDbCommand1.CommandText = "SELECT * FROM [" & FileInfo1.Name & "]" OleDbCommand1.Connection = OleDbConnection1 OleDbDataAdapter1.SelectCommand = OleDbCommand1 OleDbDataAdapter1.Fill(DataTable1) OleDbDataAdapter1.Dispose() OleDbCommand1.Dispose() OleDbConnection1.Dispose()

  • datagridviewからexcelへエクスポートしたい

    datagridviewからexcelへエクスポートしたい アクセス2000に接続をして、クエリから得られる結果をdatagridviewに表示は出来たのですが、 それをエクセルに吐き出す事が出来ずに苦慮しております。 Public Class form1 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2008\xxxxx.mdb;") Dim cmd As New OleDb.OleDbCommand("Q1") cmd.CommandType = CommandType.TableDirect Dim da As New OleDb.OleDbDataAdapter() da.SelectCommand = cmd da.SelectCommand.Connection = cn Dim dt As New DataTable da.Fill(dt) DataGridView1.DataSource = dt End Sub 上記のコードでdatagridviewに表示は出来ました。 webで色々調べたのですが、サンプルとなるコードが見つからずの状態です。 サンプルとなるコードはありますでしょうか? そもそも、エクセルに吐き出す事は可能でしょうか? 可能であれば、どのようなコードを書けばよいでしょうか? 環境ですが、 XP(SP3)、 VB2008EXPRESS EDITION Access2000(SP3) Excel2007(SP2) 以上になります。 お忙しい所お手数をお掛けしますが、 ご教授下さい。 以上、宜しくお願いします。

  • データセットへの取得について

    VB2005はじめたばかりです。 MDBからデータを抽出してデータセットへのところでエラーとなります。 Private Sub Button1_Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_社員") Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\SampleDB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 社員 where 社員番号=>101", cn) dAdp.Fill(dSet, "t_社員") ★ここでエラーとなってしまいます。【where 社員番号=>101", 】をトルと正常となります。 恐れ入りますがご指摘いただけますでしょうか。

  • ADO.NETのデータベースについて

     こんにちは。いつもお世話になっております。  プログラミングの初心者で、現在VC++でプログラムを作成しています。環境は、OSがWindowsXP、統合環境はVisualStudio2008 Professionalを使用しています.  ADO.NETでデータベースを作成しているのですが、DataSetを介して、任意のフィールドを変更・更新がうまくいきません。プログラムの内容は、保存されているAccessデータから表を読み込み、その表に対して挿入、変更、削除を行い、最後にupdateをしてAccessのデータを更新するというものです。以下、プログラムの一部を抜粋します。拙い説明で申し訳ありません。原因が分かる方、よろしくご教授ください。 m(_)m private: bool LoadAccessFile(String^ path) { // コネクションを作成 OleDbConnection^ cn = gcnew OleDbConnection(); cn->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" "Data Source=" + path; // すべてのデータを読み込む OleDbDataAdapter^ da = gcnew OleDbDataAdapter("select * from 実績テーブル", cn); OleDbDataAdapter^ da2 = gcnew OleDbDataAdapter("select * from クエリ1", cn); OleDbCommandBuilder^ builder = gcnew OleDbCommandBuilder(da); //test OleDbCommand^ selectCommand = cn->CreateCommand(); OleDbCommand^ selectCommand2 = cn->CreateCommand(); OleDbCommand^ insertCommand = cn->CreateCommand(); OleDbCommand^ updateCommand = cn->CreateCommand(); OleDbCommand^ deleteCommand = cn->CreateCommand(); selectCommand->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号 from 実績テーブル where 通し番号=2"; selectCommand2->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー名称, 銀行口座口座名称 from クエリ1"; insertCommand->CommandText = "insert into 実績テーブル (通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号) values (@通し番号, @日付, @内容, @金額, @カテゴリー番号, @銀行口座通し番号)";      (中略) // OleDbDataAdapterのスキーマと、SelectCommandで抽出したデータを格納 da->FillSchema(ds, System::Data::SchemaType::Mapped); da->Fill(ds->Tables["Table"]); // "Table"表の2行3列目のデータを変更 ds->Tables->Add("クエリ1"); //test(090223) DataRow^ row = ds->Tables["Table"]->Rows[1]; //Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」 DataColumn^ column = ds->Tables["Table"]->Columns[2]; row[column] = "本"; // "Table"表の0行目を削除 ds->Tables["Table"]->Rows[0]->Delete(); //Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」

  • 【VB】データグリッドに読み込んだテーブルの変更を元のデータベースに反映させたい

    VB歴6ヶ月です。 VBのバージョンは2005です。 mdbから読み込んだデータベースをデータグリッドビューコントロールで表示しました。 CNには接続パスが入っていてmdbとの接続は確立しています。 データグリッドビューコントロールのオブジェクト名はDGVです。 読み込むテーブル名はt社員マスターです。 Private sub メンテナンス() Dim DS As DataSet = New DataSet("社員マスター") Dim SQL As String = "SELECT * FROM t社員マスター" Dim DA As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(SQL, CN) DA.Fill(DS, "社員マスター") Dim DV As DataView = New DataView(DS.Tables("社員マスター")) DGV.DataSource = DV End sub これでグリッドに読み込ますことはできたのですが、 読み込んだデータをグリッド上で変更したら元のデータベースにも反映したいのですが やり方がわかりません >< 具体的なコード、やり方を教えていただけたらありがたいです。

専門家に質問してみよう