2012-03-20 11 views
1

これまでに回答がありましたが、解決策が見つからない場合は申し訳ありません。これはおそらく明らかなことですが、自分のコードで盲目になっています。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(); 
    } 

何らかの理由で、別のデータアダプタの標準生成コマンドで動作します。

ご協力いただければ幸いです。

答えて

1

私のコードがなぜ機能していないのかが分かりました。 この問題は、UpdateCommandのビルド、またはパラメータの割り当てにあります。私の限られた知識の中で私は盲目的に例を追ってきましたが、自分でフィールドの別のコレクションの更新を書き込むまではエラーを見ませんでした。

何が起こったのは、更新が行われた後ではなくDataAdapterをビルドしたときにパラメータが追加されたため、パラメータが古い値を取得したことです。私は

classDataAdapter.UpdateCommand = createCharInstanceCommand(); 

このコードを移動するライブ) と誰かが私の問題を解決するために:)

を言っ学び、私はaddWithValueよりも変数を割り当てるより良い方法は、(ある疑いがある)が、少なくとも、それが今の作品実際にアップデートを実行する部分に移動します。

 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 { } 

     classDataAdapter.UpdateCommand = createCharInstanceCommand(); 
     classDataAdapter.UpdateCommand.Connection = classConnection; 

     int spellinfotest = this.classDataAdapter.Update(dClassInstance); 
     this.classConnection.Close(); 
    } 
関連する問題