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

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

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

Re[4]: ExecuteNonQueryでのDBの更新


(過去ログ 20 を表示中)

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

■8613 / inTopicNo.1)  ExecuteNonQueryでのDBの更新
  
□投稿者/ みこ (5回)-(2007/10/04(Thu) 00:19:18)

分類:[C#] 

VS2005(C#)、Access2007(accdbでなくmdb)、Windows XP にて開発しています。

画面からデータを入力しマスタを作成するプログラムを作ろうとしています。
P-KeyとなるIDをオートナンバー型で取得し、text型、数値型等混在している1レコードをinsertします。
更新の場合は、IDを入力して他情報を表示し、変更してupdateします。

Formのロード時にデータセットに対象のテーブルのデータをFillしています。
データの入力、更新時の情報読み出しはできており、実行するとExecuteNonQueryも完了しています(戻り値が1なので1件のレコードが処理できていると認識しています)しプログラムとしても正常終了しますが、DBに反映されません。

sqlはAccessでクエリ実行すると問題なく使えます。Exeptionもでていません。

以下のような感じでプログラムを書いています(途中ははしょっています)
cn,oda1はそれぞれデザイナで追加したコネクションとデータアダプタです。

ExecuteNonQueryはデータセットではなくDBを直接追加/更新できると思っているのですが違うのでしょうか?
ずっとC言語を使用しており、今回ほぼ初めてC#を使っています。
いろいろな本を読んだりネットで情報を探していますが、何が悪いかさっぱり見当が付きません。

ヒント的なものでもかまいませんので教えてください。よろしくお願いします。


private void Form1_Load(object sender, EventArgs e)
{
ds1.Clear();
oda1.Fill(ds1, "tbl1");
}

private void btnEntry_Click(object sender, EventArgs e)
{
System.Data.OleDb.OleDbCommand cmd;

      〜 中略 ここで入力内容のエラーチェック等行っています 〜

string sql = "insert into tbl1 (a, b, c) values ( a, b, c);
cmd = new System.Data.OleDb.OleDbCommand(sql, cn);
try
{
cn.Open();
}
catch
{
MessageBox.Show("DB接続に失敗しました。", "通知");
if (cn != null)
{
cn.Close();
}
Close();
}

try
{
int num = cmd.ExecuteNonQuery();
cmd.Dispose();

}
catch (Exception ex)
{
MessageBox.Show("登録に失敗しました。" + ex.Message, "通知");
return;
}
finally
{
if (cn != null)
{
cn.Close();
MessageBox.Show("情報を登録しました。", "通知");
}
ds1.Clear();
oda1.Fill(ds1, "tbl1"); // 続けて登録・更新できるよう読みなおし
}
}

引用返信 編集キー/
■8616 / inTopicNo.2)  Re[1]: ExecuteNonQueryでのDBの更新
□投稿者/ はつね (283回)-(2007/10/04(Thu) 01:49:35)
No8613 (みこ さん) に返信
> データの入力、更新時の情報読み出しはできており、実行するとExecuteNonQueryも完了しています

DBへの反映はどのように確認しましたか?
もし、mdbファイルを直接開いてみたという事であれば、そのmdbファイルはプログラムで入出力しているmdbファイルに間違いありませんか?

>             cmd = new System.Data.OleDb.OleDbCommand(sql, cn);
>             try
>             {
>                 cn.Open();
>             }

cn.Openするよりも前にOleDbCommandをcn指定して生成しているようですが、cn.Openしてからにしても状況は変わりませんか?

             try
             {
                 cn.Open();
             }
             catch
             {
                 MessageBox.Show("DB接続に失敗しました。", "通知");
                 if (cn != null)
                 {
                     cn.Close();
                 }
                 Close();
             }
             try
             {
                 cmd = new System.Data.OleDb.OleDbCommand(sql, cn);
                 int num = cmd.ExecuteNonQuery();
                 cmd.Dispose();

引用返信 編集キー/
■8619 / inTopicNo.3)  Re[2]: ExecuteNonQueryでのDBの更新
□投稿者/ みこ (7回)-(2007/10/04(Thu) 02:49:25)
アドバイスありがとうございます。

> cn.Openするよりも前にOleDbCommandをcn指定して生成しているようですが、cn.Openしてからにしても状況は変わりませんか?

cn.Openしてからにしても変わりませんでした。


> DBへの反映はどのように確認しましたか?
> もし、mdbファイルを直接開いてみたという事であれば、そのmdbファイルはプログラムで入出力しているmdbファイルに間違いありませんか?

データ接続の際に指定したmdbファイルを直接開いてみて確認しました。
mdbはプロジェクトのソースと同フォルダに作ってあります。

同名のmdbは他に作ってなかったので指定したmdbをみていたのですが、プロジェクトのbin/debug配下にコピーが作られており、そのmdbでは変更されていました。

このコピーのmdbを削除しても実行するとまた作成されます。
試しに、データ接続をこのコピーを指定してやると想定通りの動きになりました。

そこで別の質問になってしまうのですが、
1.なぜコピーがつくられるのでしょうか?
2.作られてしまうコピーを指定するのではなく、任意の場所においたmdbを指定することはできないでしょうか?

別にした方がよいのかもしれませんが、関連するので続けて質問させてください。

よろしくお願いします。


引用返信 編集キー/
■8620 / inTopicNo.4)  Re[3]: ExecuteNonQueryでのDBの更新
□投稿者/ ひろ (59回)-(2007/10/04(Thu) 09:36:38)
No8619 (みこ さん) に返信

> 1.なぜコピーがつくられるのでしょうか?

プロジェクトに含めた mdb のプロパティを確認してください。
「出力ディレクトリにコピー」という項目が「常にコピーする」もしくは「新しい場合はコピーする」になっていないでしょうか?

> 2.作られてしまうコピーを指定するのではなく、任意の場所においたmdbを指定することはできないでしょうか?

ConnectionString で mdb のパスをどのように設定していますか?
Application.StartupPath を使用した場合、デバッグ実行時の実行アプリケーションパスは、

プロジェクトのパス\bin\Debug

になります。


引用返信 編集キー/
■8621 / inTopicNo.5)  Re[3]: ExecuteNonQueryでのDBの更新
□投稿者/ 魔界の仮面弁士 (444回)-(2007/10/04(Thu) 09:38:37)
No8619 (みこ さん) に返信
> このコピーのmdbを削除しても実行するとまた作成されます。
> 試しに、データ接続をこのコピーを指定してやると想定通りの動きになりました。
その mdb をプロジェクト内に含めていませんか?

含めている場合は、[ソリューション エクスプローラ]でそのファイルを選択したときに、
[プロパティ]ウィンドウの『出力ディレクトリにコピー』の設定がどうなっているかを
確認してみてください。


> 1.なぜコピーがつくられるのでしょうか?
コピーする設定になっていた、とか。


> 2.作られてしまうコピーを指定するのではなく、任意の場所においたmdbを指定することはできないでしょうか?
OleDbConnection をコードから生成しているのであれば、接続文字列で指定できますよね。

Visual Studio 開発環境のサポートを借りて TableAdapter を作っているのでれば、
[ソリューション エクスプローラ]の『Properties』を右クリックで開き、「設定」タブを見れば
接続文字列(の初期値)が書かれています。(内部的には、Settings.settings という XML ファイルです)

コンパイル後に変更するのであれば、exe と同じフォルダに生成される projectName.exe.Config ファイルを
書き換えることになります。(ただし、コンパイルのたびに再生成されます)
なお、プログラムからは string s = Properties.Settings.Default.db1ConnectionString; のようにして読み込めます。
引用返信 編集キー/
■8657 / inTopicNo.6)  Re[4]: ExecuteNonQueryでのDBの更新
□投稿者/ みこ (8回)-(2007/10/05(Fri) 01:18:09)
ありがとうございました。

無事、コピーは作られずターゲットのmdbにレコード作製されるようになりました。

対処としては、以下を行いました。

 ■出力ディレクトリにコピーしないという指定をする。
 ■ConnectionStringをmdbの絶対位置指定にする。


ずっとUNIX/Linuxでの開発が長かったので、便利にできるなぁとちゃんと裏側で設定されている
情報などを知らないまま使用していたのが原因ですね。
毎回すべて調べる時間はありませんが、今後何かあったらまずそのあたりから確認していこうと
思います。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -