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

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

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

Re[2]: UpdateCommand によって処理予定のエラー


(過去ログ 127 を表示中)

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

■75774 / inTopicNo.1)  UpdateCommand によって処理予定のエラー
  
□投稿者/ yellow (1回)-(2015/05/01(Fri) 10:42:19)

分類:[.NET 全般] 

データベースに更新をかけようとすると、エラーが発生します。

やりたい事は、

@フォームをロード

Aロード時にデータベースからデータを取得し、DataGridViewに表示

BDataGridViewに表示されているデータを編集して、保存をする。

Cデータベースに反映される。

Bで「UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。」と表示されます。

データベースのテーブルにはプライマリーキーは4つ設定されています。

記述したコードは下記になるのですが、どこが間違っているのかわかりません。
大変お手数ですが、どこが間違っているかお教え頂けると助かります。

よろしくお願いします。

public class form1 : Form
{
 private SQLiteConnection cn;
 private SQLiteDataAdapter sqliteDataAdapter;
 private DataTable dt = new DataTable();


//********************Formロード*******************************************************
private void form1_Load(object sender, EventArgs e)
{
using (cn = new SQLiteConnection(CONNECTIONSTRING)) //コネクション
{
cn.Open();
using (SQLiteTransaction trans = cn.BeginTransaction()) //トランザクションスタート
{
SQLiteCommand cmd = cn.CreateCommand();
sqliteDataAdapter = new SQLiteDataAdapter();

cmd.CommandText = "SELECT * FROM TABLE";
sqliteDataAdapter.SelectCommand = cmd;
dt.Clear(); //DataTableを事前にクリア
dt.Columns.Clear(); //列をクリア
sqliteDataAdapter.Fill(dt); //再度DataTableに値をセット
DataGridView1.DataSource = dt;
this.DataGridView1.AllowUserToAddRows = false; //行の追加禁止
}
}
}

//********************Form保存*******************************************************
private void form1Save_Click(object sender, EventArgs e)
{
string selectStmt = @"SELECT * FROM TABLE";
using (cn = new SQLiteConnection(dbConnectionString)) //コネクション
{
try
{
cn.Open();
// STEP # 1
SQLiteCommand selectCommand = cn.CreateCommand();
selectCommand.CommandText = selectStmt;
// STEP # 2
sqliteDataAdapter = new SQLiteDataAdapter(selectCommand);
sqliteDataAdapter.Fill(dt);
sqliteDataAdapter.UpdateCommand = new SQLiteCommandBuilder(sqliteDataAdapter).GetUpdateCommand();
sqliteDataAdapter.Update(dt);
cn.Close();
}
}
}
}
引用返信 編集キー/
■75775 / inTopicNo.2)  Re[1]: UpdateCommand によって処理予定のエラー
□投稿者/ 魔界の仮面弁士 (304回)-(2015/05/01(Fri) 11:25:42)
No75774 (yellow さん) に返信
> 「UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。」と表示されます。

(1) この手のエラーは、DataAdapter に割り当てられた UpdateCommand の内容に
 問題がある場合がほとんどです。自動生成された UpdateCommand に問題が
 あるようなら、UpdateCommand を自前で調整することを検討してみてください。

(2) [TABLE] という表名は、SQLite 的には問題無いのでしょうか。
 CREATE TABLE などの予約語と競合したりはしませんか?
 (SELECT できているということは、許容範囲なのかな…)

(3) 今回利用したテーブルのデータ定義図を教えていただけないでしょうか。
 問題のありそうな列名が含まれて確認しておきたいので。

(4) 同様に、データ型も確認させてください。
 たとえば、主キーが 浮動小数点型 になっている場合や、
 時刻部を含む日付型などの場合に問題が生じることがありそうです。


とはいえ、SQLite は未経験なので、あまりお役には立てそうに無いですけど。
引用返信 編集キー/
■75777 / inTopicNo.3)  Re[1]: UpdateCommand によって処理予定のエラー
□投稿者/ WebSurfer (559回)-(2015/05/01(Fri) 11:56:57)
No75774 (yellow さん) に返信

コードはざっとしか見てませんので他にも問題があるかもしれませんが、少なく
とも form1Save_Click メソッドで sqliteDataAdapter.Fill(dt); しているとこ
ろは変です。(する必要はない、と言うよりしてはいけない)

DataSet/DataTable + DataAdapter を使った非接続型のデータ更新のイメージは
以下の記事の図1と図2が参考になると思いますので見てください。

DB 設計者のための明解 ADO.NET 第 1 回
https://msdn.microsoft.com/ja-jp/library/cc482903.aspx

質問者さんのケースではその図に描かれているもの以外に DataGridView という
UI 用のコントロールがあります。

まず Load イベントで Fill した DataSet に、ユーザーが DataGridView を経由
して図1に描かれているように更新をかけ、ユーザーの更新完了後に図2に書か
れているように DataAdapter.Update メソッドで DB を更新するという手順にな
ります。

なので、form1Save_Click メソッドで再度 Fill するのがマズイの分かります
か?
引用返信 編集キー/
■75781 / inTopicNo.4)  Re[1]: UpdateCommand によって処理予定のエラー
□投稿者/ WebSurfer (561回)-(2015/05/01(Fri) 12:49:31)
No75774 (yellow さん) に返信

【追伸】

どのような構造のアプリを作っているのか分かりませんが、できれば一度
Visual Studio のウィザードを使って定番の構成のアプリを作ってみては
いかがでしょう?

SQLLite でウィザードが使えるかどうか分かりませんが、使えなければ
SQL Server Express を使ってとりあえず作ってみて、ウィザードが自動生
成するコードを見れば今後の開発の参考になると思います。

DB が SQL Server の場合ですが、以下のチュートリアルように、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

Visual Studio のデータソース構成ウィザードを利用して型付 DataSet +
TableAdapter を作って、それを利用してアプリを作ると、以下のページの
図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

操作に慣れると 10 分もかからず作れるはずです。今回のような問題に悩む
ことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。
お試しください。

引用返信 編集キー/
■75799 / inTopicNo.5)  Re[2]: UpdateCommand によって処理予定のエラー
□投稿者/ yellow (2回)-(2015/05/02(Sat) 13:23:09)
魔界の仮面弁士さん、WebSurfer さん

ご回答ありがとうございます。有用なURLのご紹介も頂き感謝です。

>(2) [TABLE] という表名は、SQLite 的には問題無いのでしょうか。
> CREATE TABLE などの予約語と競合したりはしませんか?

⇒SQLiteでは「TABLE」というテーブル名でもOKでした。

>sqliteDataAdapter.Fill(dt); しているところは変です。

⇒こちら、何も考えずにやっていました。ご指摘ありがとうございます。



問題が解決しました。結論から申し上げますと、テーブルの型の問題だったと思います。

列名,型名
A,TEXT
B,TEXT
C,INTEGER

CSVファイルを読み込み、DataGridViewに表示をおこなっていました。
CSVの列名Cの所が、ブランクになっていました。そこでアップデートをかける時にエラーになっていたと思われます。

CSVファイルの列名Cのところにデータを入力したところ、問題なく更新ができました。

本当は50列くらいあるテーブルの各項目の型と、CSVのデータのチェックに漏れがありました・・・

本当にありがとうございます!

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -