これまでに回答がありましたが、解決策が見つからない場合は申し訳ありません。これはおそらく明らかなことですが、自分のコードで盲目になっています。DataAdapter.Update()はデータベースを更新せずに1を返します
一部のテキストボックスの情報でデータベースを更新しようとしています。デバッグ中に、DataTableの行が変更で更新され、dataadapter.updateが1を返していることがわかりました。しかし、後のデータベースをチェックすると、変更はありません。奇妙な部分は、最初の更新呼び出しでは動作しますが、他の呼び出しでは動作しません。
使用後に接続を切断しています。
私はこれを実現させるためにいくつかの方法を試しましたが、私が何を試みても、これを動作させることはできません。私はそれをできるだけ均等に作成しましたが(私がこれを初めて使っているように)働いている人には同じですが、まだ何もありません。私は更新のために私自身の更新コマンドを作成しようとしました。
これは私のコマンドです:ここでは
private SqlCeCommand createCharInstanceCommand()
{
SqlCeCommand updateCommand = new SqlCeCommand();
updateCommand.CommandText = "UPDATE [CharacterClassInstance] SET " +
"[CharID] = @p1, [ClassID] = @p2, [Lvl] = @p3, [SpellsKnown0] = @p4, [SpellsKnown1] = @p5, [SpellsKnown2] = @p6, " +
"[SpellsKnown3] = @p7, [SpellsKnown4] = @p8, [SpellsKnown5] = @p9, [SpellsKnown6] = @p10, [SpellsKnown7] = @p11, " +
"[SpellsKnown8] = @p12, [SpellsKnown9] = @p13, [SpellsPrDay0] = @p14, [SpellsPrDay1] = @p15, [SpellsPrDay2] = @p16, " +
"[SpellsPrDay3] = @p17, [SpellsPrDay4] = @p18, [SpellsPrDay5] = @p19, [SpellsPrDay6] = @p20, [SpellsPrDay7] = @p21, " +
"[SpellsPrDay8] = @p22, [SpellsPrDay9] = @p23, [SpellSaveDC0] = @p24, [SpellSaveDC1] = @p25, [SpellSaveDC2] = @p26, " +
"[SpellSaveDC3] = @p27, [SpellSaveDC4] = @p28, [SpellSaveDC5] = @p29, [SpellSaveDC6] = @p30, [SpellSaveDC7] = @p31, " +
"[SpellSaveDC8] = @p32, [SpellSaveDC9] = @p33, [BonusSpell1] = @p34, [BonusSpell2] = @p35, [BonusSpell3] = @p36, " +
"[BonusSpell4] = @p37, [BonusSpell5] = @p38, [BonusSpell6] = @p39, [BonusSpell7] = @p40, [BonusSpell8] = @p41, [BonusSpell9] = @p42 " +
"WHERE ([ClassInstanceID] = @p43)";
for (int i = 1; i <=43;i++)
{
if (i == 43) updateCommand.Parameters.AddWithValue("@p43", chosenClassInstance);
else updateCommand.Parameters.AddWithValue("@p" + i, dClassInstance.Rows[chosenClassInstance - 1].ItemArray.GetValue(i).ToString());
}
return updateCommand;
}
は、テーブルを更新することになっているコードは(バージョンNR 8と思う)です。私は行が何らかの理由で変更されたとして登録されているかどうかは確かではないので、私の最後の試みの1つとして行修正を追加しました。
private void updateClassInstance()
{
DataRow row = dClassInstance.Rows[chosenClassInstance - 1];
for (int i = 4; i <= 42; i++)
{
if (i <= 23) row[i] = Convert.ToInt32(spellInfoBoxes[i - 4].Text);
if (i >= 34) row[i] = Convert.ToInt32(spellInfoBoxes[i - 14].Text);
}
try
{
dClassInstance.Rows[chosenClassInstance - 1].AcceptChanges();
dClassInstance.Rows[chosenClassInstance - 1].SetModified();
}
catch { }
int spellinfotest = this.classDataAdapter.Update(dClassInstance);
this.classConnection.Close();
}
データアダプタとコマンドの作成。
private void fillSpellInfo()
{
classConnection = new SqlCeConnection(sConnectionString);
string sqlClassInstance = "SELECT * " +
"FROM CharacterClassInstance " +
"WHERE (CharID = " + iCharacterID +
//") AND (ClassInstanceID = "+chosenClassInstance+
")";
SqlCeCommand selectClassInstance = classConnection.CreateCommand();
selectClassInstance.CommandText = sqlClassInstance;
this.classConnection.Open();
classDataAdapter = new SqlCeDataAdapter(selectClassInstance);
//SqlCeCommandBuilder cb = new SqlCeCommandBuilder(classDataAdapter);
//classDataAdapter.UpdateCommand = cb.GetUpdateCommand();
dClassInstance = new DataTable();
classDataAdapter.Fill(dClassInstance);
classDataAdapter.UpdateCommand = createCharInstanceCommand();
dClassInstance.DefaultView.RowFilter = "ClassInstanceID = " + chosenClassInstance;
setSpellInfoValues();
this.classConnection.Close();
}
何らかの理由で、別のデータアダプタの標準生成コマンドで動作します。
ご協力いただければ幸いです。