C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: mdb(oleb)の更新ができない


(過去ログ 13 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■3921 / inTopicNo.1)  mdb(oleb)の更新ができない
  
□投稿者/ hikaru (3回)-(2007/05/29(Tue) 06:58:49)

分類:[C# (Windows)] 

はじめまして。hikaruです。初歩的な質問かもしれませんが、ここ数日間悩んでいます。
色々なサイト、書籍を見てみましたが、どうにもならず皆さんのお力をかしていただけるとありがたいです。

事象は、mdbファイルを更新したいのですが、なにも更新されないまま終了してしまいます。
コーディングで言いますとlog(ファイル名)の接続から//データROWのセット、までの確認は取れています。
//更新処理 以降がおかしい?のではないかと思いますが、、、。
皆さんのご意見を聞かせてください。

コーディング

 string dt = DateTime.Now.ToString("yyyyMMdd");
 System.Data.OleDb.OleDbConnection cn3;
 System.Data.OleDb.OleDbDataAdapter da3;
 System.Data.OleDb.OleDbCommand cmd3;
 cn3 = new System.Data.OleDb.OleDbConnection();
 cn3.ConnectionString = "Provider=" + pro + ";Data Source=" +  Log ;
 cn3.Open();

 //ログの取得
 da3 = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM   Log", cn3);

 //データセットへの読み込み
 DataSet ds3 = new DataSet(Log);
 da3.Fill(ds3,  Log);
              
 //データテーブルのセット
 DataTable tb3 = ds3.Tables[Log];
 tb3.PrimaryKey = new DataColumn[] { tb3.Columns["番号"] };

 //データROWのセット(1件しかありません)
 if (tb3.Rows.Count == 1)
  {
      DataRow dr3 = ds3.Tables[Log].NewRow();
      object kousinbi = (object)tb3.Rows[0]["更新日"];
      kousinbi2 = Convert.ToString(kousinbi);
      object bangou = (object)tb3.Rows[0]["番号"];
      bangou2 = Convert.ToInt16(bangou);
      //日付が違っていたら更新
     if (kousinbi2 == dt)
      {
       dr3["番号"] = bangou2 + 1;
       dr3["更新日"] = dt;
      }
      else
      {
       dr3["番号"] = 1;
       dr3["更新日"] = dt;
      }

   //更新処理
      cmd3 = new System.Data.OleDb.OleDbCommand
       ("UPDATE " + Log + " SET 番号=?, 更新日 = ? ", cn3);
      cmd3.Parameters.Add(new System.Data.OleDb.OleDbParameter("番号", System.Data.OleDb.OleDbType.BigInt, 4, "番号"));
                    cmd3.Parameters.Add(new System.Data.OleDb.OleDbParameter("更新日", System.Data.OleDb.OleDbType.VarChar, 8, "更新日"));
     da3.UpdateCommand = cmd3;
     da3.Update(ds3,  Log);
  }
  else
  {
//エラー処理
---

  }

以上よろしくお願いします。

引用返信 編集キー/
■3924 / inTopicNo.2)  Re[1]: mdb(oleb)の更新ができない
□投稿者/ ぽぴ王子 (206回)-(2007/05/29(Tue) 07:42:27)
ぽぴ王子 さんの Web サイト
No3921 (hikaru さん) に返信

確認してみてください。
http://www.atmarkit.co.jp/fdotnet/dotnettips/532dbfilecopy/dbfilecopy.html
引用返信 編集キー/
■3951 / inTopicNo.3)  Re[2]: mdb(oleb)の更新ができない
□投稿者/ hikaru (4回)-(2007/05/29(Tue) 20:27:25)
No3924 (ぽぴ王子 さん) に返信
質問するときに、環境を記述していませんでした。
開発環境は、Visual Studio 2005 Express Edition、Windows XP プロフェッショナル、言語はC#です。

ぽぴ王子 さま、ありがとうございます。
教えていただいたサイト、確認させていただきました。
私はACCESSを使用していますので、SQL Server 2005は使っていないのと、アタッチ機能の開発は行っていません。
なので、申し訳ないのですが、解決には至りませんでした。
でも、勉強になります。

これからもよろしくお願いします。


> ■No3921 (hikaru さん) に返信
>
> 確認してみてください。
> http://www.atmarkit.co.jp/fdotnet/dotnettips/532dbfilecopy/dbfilecopy.html
引用返信 編集キー/
■3956 / inTopicNo.4)  Re[3]: mdb(oleb)の更新ができない
□投稿者/ ダッチ (133回)-(2007/05/29(Tue) 22:21:10)
> 私はACCESSを使用していますので、SQL Server 2005は使っていないのと、アタッチ機能の開発は行っていません。
アタッチのところではなく「DBファイルの「出力ディレクトリにコピー」プロパティ」の部分が重要です。

それと気になるのですが、SQL の UPDATE を行っているようですが da3.Update(ds3, Log); この部分の ds3 の中身って本当に変更されているんですか?
ds3 の「Log」テーブルのレコードに RowState が Modified になっているレコードが存在していますか。

引用返信 編集キー/
■3961 / inTopicNo.5)  Re[4]: mdb(oleb)の更新ができない
□投稿者/ hikaru (5回)-(2007/05/30(Wed) 11:50:08)
No3956 (ダッチ さん) に返信
> アタッチのところではなく「DBファイルの「出力ディレクトリにコピー」プロパティ」の部分が重要です。
>
ご指摘ありがとうございます。アタッチを勘違いしていました。

> それと気になるのですが、SQL の UPDATE を行っているようですが da3.Update(ds3, Log); この部分の ds3 の中身って本当に変更されているんですか?
> ds3 の「Log」テーブルのレコードに RowState が Modified になっているレコードが存在していますか。
>
dr3のRowStateを調べたところ、「Detached」となりました。
UPDATEが行われていないようです(違っていたらご指摘下さい)。
何が間違っているんでしょうか???お手上げです。



引用返信 編集キー/
■3962 / inTopicNo.6)  Re[5]: mdb(oleb)の更新ができない
□投稿者/ はつね (167回)-(2007/05/30(Wed) 12:00:19)
はつね さんの Web サイト
No3961 (hikaru さん) に返信
>>ds3 の「Log」テーブルのレコードに RowState が Modified になっているレコードが存在していますか。
> >
> dr3のRowStateを調べたところ、「Detached」となりました。
> UPDATEが行われていないようです(違っていたらご指摘下さい)。
> 何が間違っているんでしょうか???お手上げです。

DataRow dr3 = ds3.Tables[Log].NewRow();
しているのに、dr3をds3.Tables[Log]にAddしていないように思います。
※新規行のバッファを作って、そこに値を設定しているのに、テーブルに追加していない状況
「//更新処理」のコメントの直前辺りに記述が必要かと。



引用返信 編集キー/
■3963 / inTopicNo.7)  Re[6]: mdb(oleb)の更新ができない
□投稿者/ hikaru (6回)-(2007/05/30(Wed) 13:07:47)
2007/05/30(Wed) 13:09:30 編集(投稿者)
2007/05/30(Wed) 13:09:09 編集(投稿者)

No3962 (はつね さん) に返信
私の考えが間違っていたらすいません。ご指摘ください。何でも勉強です。

はつねさんのおっしゃること、納得です。
値を設定しているのにテーブルに反映されていないですね。

そこでお知恵を拝借したいのですが、その前に仕様が説明不足でした。すいません。
そもそもこのLogデータは1件しかないく、データの日付で更新内容を判断し、更新日と番号を上書き(更新)します。
なので、DataRow dr3 = ds3.Tables[Log].NewRow();でデータをテーブルをコピーしていますが、そもそもこれが間違ってるんですかね。
それをどうしたら、テーブルに反映できるのでしょうか?

この更新方法が間違っていたら教えていただけるとありがたいです。お願いします。
長々と書いてすいません。

> ■No3961 (hikaru さん) に返信
> >>ds3 の「Log」テーブルのレコードに RowState が Modified になっているレコードが存在していますか。
>>>
>>dr3のRowStateを調べたところ、「Detached」となりました。
>>UPDATEが行われていないようです(違っていたらご指摘下さい)。
>>何が間違っているんでしょうか???お手上げです。
>
> DataRow dr3 = ds3.Tables[Log].NewRow();
> しているのに、dr3をds3.Tables[Log]にAddしていないように思います。
> ※新規行のバッファを作って、そこに値を設定しているのに、テーブルに追加していない状況
> 「//更新処理」のコメントの直前辺りに記述が必要かと。
>
>
>
引用返信 編集キー/
■3965 / inTopicNo.8)  Re[7]: mdb(oleb)の更新ができない
□投稿者/ ぽぴ王子 (208回)-(2007/05/30(Wed) 13:29:59)
ぽぴ王子 さんの Web サイト
No3963 (hikaru さん) に返信

ダッチさんフォローありがとうございます。
私が気にしていたのはまさに「出力ディレクトリにコピー」のところでした。
初心者の方がよくやるミスなので。
なのに mdb を例に挙げたページが見つからなかったので SQL Server を使った
ページをリンクしてみたり(これはこれで混乱させてしまったみたいですね)
しかも原因は全然違うところだったりして、申し訳ないです orz

ということで、改めてちょっと書いてみます。

ds3.Tables[Log].NewRow() だと、文字通り新しい行を作っているので、それを
追加していないから反映されてないんだね!というのがはつねさんの意見ですよ
と。
ただ、hikaru さんの説明(最初のコードにも書いてありますね)では、1行しか
ないテーブルなので、追加ではなく本当は編集したいのじゃよーぎゃわーと。
その場合はどうするかというと

     DataRow dr3 = ds3.Tables[Log].NewRow();

ここが

     DataRow dr3 = ds3.Tables[Log].Rows[0];
     dr3.BeginEdit();

になって、//更新処理 の前に

     ds3.EndEdit();

が入れば大丈夫なのではないか…と思ったり思わなかったり。

引用返信 編集キー/
■3972 / inTopicNo.9)  Re[7]: mdb(oleb)の更新ができない
□投稿者/ はつね (168回)-(2007/05/30(Wed) 15:12:12)
はつね さんの Web サイト
No3963 (hikaru さん) に返信
> そこでお知恵を拝借したいのですが、その前に仕様が説明不足でした。すいません。
> そもそもこのLogデータは1件しかないく、データの日付で更新内容を判断し、更新日と番号を上書き(更新)します。
> なので、DataRow dr3 = ds3.Tables[Log].NewRow();でデータをテーブルをコピーしていますが、そもそもこれが間違ってるんですかね。
> それをどうしたら、テーブルに反映できるのでしょうか?

tb3.Rows.Count == 1
で判断していますので、もし、その1レコードを更新したいのであれば、ぽぴ王子が書かれているほう方がまさにレコードの更新を行うための方法です。

引用返信 編集キー/
■3980 / inTopicNo.10)  Re[8]: mdb(oleb)の更新ができない
□投稿者/ hikaru (7回)-(2007/05/30(Wed) 17:46:44)
No3972 (はつね さん) に返信
ぽぴ王子さま、ダッチさま、はつねさま、ありがとうございました。

まさに、 ぽぴ王子さまの言われる通りです。
私の文章を理解していただき、ありがとうございます。
DataRow dr3 = ds3.Tables[Log].Rows[0];
dr3.BeginEdit();
ds3.EndEdit();
を追加したら解決できました。

これをきっかけに、複数行の更新も試みましたが、エラーとなりました。
自分で考え、解決できなかったら別スレで質問すかもしれませんので、
そのときは、あ〜、あのときの質問かと思ってまたお知恵をおかしください。

余談なんですが、、、今回のように1件のデータを抽出して更新、または、削除するとき
DataSet(非接続型)を使うべきでしょうか?もしくはコマンド(ExecuteNonQuery?)を使用したらいいのでしょうか?
今回、悩みましたが、勉強もかねて(皆さんに迷惑をおかけしましたが)DataSetを使いました。
ADO.NET(接続型、非接続型)の基本的なことかもしれませんが、皆さんのお知恵をお貸しください。
本を読んだり、サイトも拝見しましたが、納得できませんでした。
もしよろしければ、ご意見などお伺いできたら、ありがたいです。

> ■No3963 (hikaru さん) に返信
>>そこでお知恵を拝借したいのですが、その前に仕様が説明不足でした。すいません。
>>そもそもこのLogデータは1件しかないく、データの日付で更新内容を判断し、更新日と番号を上書き(更新)します。
>>なので、DataRow dr3 = ds3.Tables[Log].NewRow();でデータをテーブルをコピーしていますが、そもそもこれが間違ってるんですかね。
>>それをどうしたら、テーブルに反映できるのでしょうか?
>
> tb3.Rows.Count == 1
> で判断していますので、もし、その1レコードを更新したいのであれば、ぽぴ王子が書かれているほう方がまさにレコードの更新を行うための方法です。
>
引用返信 編集キー/
■3982 / inTopicNo.11)  Re[9]: mdb(oleb)の更新ができない
□投稿者/ はつね (169回)-(2007/05/30(Wed) 18:12:00)
はつね さんの Web サイト
No3980 (hikaru さん) に返信
> 余談なんですが、、、今回のように1件のデータを抽出して更新、または、削除するとき
> DataSet(非接続型)を使うべきでしょうか?もしくはコマンド(ExecuteNonQuery?)を使用したらいいのでしょうか?

DataSetにするかコマンドにするかの判定基準はデータ件数ではありません。要は、取得してから更新するまでの間に何をしたいのかという事になります。

また、今回の件はWHERE句で明示的に1件を抽出しているわけではありませんので「1件のデータを抽出して更新」という状況でもありません。ソースコードから垣間見えるのは「テーブルを丸ごと取得して、その結果が1件だったならば更新する」に相当します。これをExecuteNonQueryで実現するのはちと面倒かも知れません。

引用返信 編集キー/
■3988 / inTopicNo.12)  Re[10]: mdb(oleb)の更新ができない
□投稿者/ hikaru (8回)-(2007/05/30(Wed) 23:15:18)
No3982 (はつね さん) に返信
はつねさま、最後までお付き合いありがとうございました。
なるほど、、、取得してから更新するまでの間に何をしたいのかですか。
これから何回もDBを触っていくうち解るでしょうかね。がんばります。
それにしても、皆さんのコメント、とても解りやすいのでとても参考になります。

また、ぽぴ王子さま、ダッチさま、ありがとうございました。
重ね重ねありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -