2009-07-15 11 views
0

この関数がレコードをデータベースに挿入しない理由がわかりません。 :( は、私は一切エラーメッセージや、データベース内だけで何も得るこのクエリで何が問題になっていますか?

EDIT:これは私のクエリは、今どのように見えるかです..まだ何も..

connection.Open(); 
XmlNodeList nodeItem = rssDoc.SelectNodes("/edno23/posts/post"); 

foreach (XmlNode xn in nodeItem) 
{ 
    cmd.Parameters.Clear(); 
    msgText = xn["message"].InnerText; 
    C = xn["user_from"].InnerText; 
    avatar = xn["user_from_avatar"].InnerText; 
    string endhash = GetMd5Sum(msgText.ToString()); 
    cmd.Parameters.Add("@endhash",endhash); 
    cmd.CommandText = "Select * FROM posts Where [email protected]"; 
    SqlCeDataReader reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     string msgs = reader["hash"].ToString(); 

     if (msgs != endhash || msgs == null) 
     { 
      sql = "INSERT INTO posts([user],msg,avatar,[date],hash) VALUES(@username,@messige,@userpic,@thedate,@hash)"; 
      cmd.CommandText = sql; 
      cmd.Parameters.Add("@username", C); 
      cmd.Parameters.Add("@messige", msgText.ToString()); 
      cmd.Parameters.Add("@userpic", avatar.ToString()); 
      cmd.Parameters.Add("@thedate", dt); 
      cmd.Parameters.Add("@hash", endhash); 
      cmd.ExecuteNonQuery();// executes query 
      adapter.Update(data);// saves the changes 
     } 
    } 

    reader.Close(); 
} 

connection.Close(); 
+0

whileループを入力し、ifブロックに入ったことを確認しましたか? –

+2

デバッガを使用してコードをステップ実行すると、より速く学ぶことになります –

答えて

2

を役に立てば幸いnodeItemは実際にそれですべてのアイテムを持っていますか?そうでなければ、foreachループの内容は実行されていません。

どのようなアダプタとデータが使用されていますか?クエリと更新は、他のコマンドやリーダーを介して行われるようです。

「ハッシュ」には実際に何が含まれていますか?それがハッシュの場合、なぜあなたはwhileループの中でハッシュの内容をハッシュしていますか?そうでない場合、クエリ内のハッシュと比較されるのはなぜですかSELECT * FROM posts WHERE hash = @endhash

ループを終了する前に接続を閉じないと、ループを制御するリーダーが無効になりますか?

+0

私はハッシュをしていますcuz私はコンテンツが100%ユニークであれば比較したいと思っています。コンテンツを挿入していない場合はコンテンツを挿入してください。次のコンテンツへスキップします:)すでに接続を終了しました。 – Aviatrix

+1

@Aviatrix:ハッシュ質問のポイントを逃した。 'hash'カラムはハッシュを含んでいます、はい? 'endhash'に含まれるハッシュを持つレコードを特に照会します。その列に含まれている値を99.99%* gauranteed *でハッシュして、完全に異なるハッシュを生成し、元のクエリ値と比較します* *決して一致しません。 –

+0

私はfixed that ..私は2つのハッシュを比較したいが、間違って私はハッシュをハッシュ.. OOの人..まだレコードが追加されていない:( – Aviatrix

0

プログラムをデバッグする方法: http://www.drpaulcarter.com/cs/debug.php

SQL CEの代わりにSQL Server Expressを使用すると機能するのでしょうか?もしそうなら、SQLプロファイラを分解してSQLコマンドを見てみることができますか?実行?

0

同じSqlCeCommandインスタンスを再利用しようとしていることが問題であると思われます。

whileループ内で新しいSqlCeCommandを作成してみてください。また、usingステートメントを使用してデータオブジェクトを閉じることもできます。


なぜデータセットをまったく変更していないので、adapter.Update(data)に電話するのはなぜですか?私はadapter.Fill(data)に電話したいと思う。 Updateメソッドは、データセット内のすべての変更をデータベースに保存します。あなたがDataReaderオブジェクトを持つレコードをループに「cmdを」コマンドを使用して、挿入を実行するwhile文の内部で同じ「CMD」コマンドを使用しているここで起こって物事の

1

たくさん...

ステートメント。以前は別のコマンド 'cmdAdd'を宣言していましたが、どこにも使用していないようです。それはあなたが挿入ステートメントのために使用しようとしていたものですか?

また、データループをwhileループ内で閉じて、データレデイアを繰り返し処理します。あなたは1つのレコードを読んで、その方法であなたのデータベースへの接続を閉じます。挿入条件が満たされていない場合は、データベースに何も書き込まないことになります。

EDIT:

あなたは本当にXMLNodeの上のforeachの外のデータベースへの接続を開閉する必要があります。ループするノードが10個ある場合、db接続は10回開いて閉じます(接続プーリングはおそらくそれを妨げるでしょうが...)

また、表をデータセットに変換する必要はありません。データセット内の値を変更していなくても、そのデータセットの更新を繰り返し呼び出すようにしています(「save shanges」)。 'posts'テーブルが遠隔であっても、これは何の理由もない(ハンドヘルドデバイスでは、それ以上ではない)多くのメモリを吸うことになります。

+0

私はその見た目を再び見直しました.. :) – Aviatrix

+0

ハッシュが既に存在しない場合にのみレコードを挿入します。もしそうなら、あなたはdatareaderを繰り返し処理する必要はありません。代わりに、単に「ハッシュ= @エンドハッシュの投稿からカウント(*)をハッシュカウントとして選択」してください。値がゼロの場合は、レコードを挿入します。 –

+1

@Aviatrix:コマンドオブジェクトのパラメータコレクションにループのたびに* new *パラメータを追加します。 –

1

なぜデータベース接続を終了しますか whileループ?
投稿したコードcmd.ExecuteNonQuery()を開こうとしていないDB接続オブジェクトで呼び出すときに、が例外をスローする必要があります。

SqlCeCommand.ExecuteNonQuery()メソッドは、影響を受ける行の数を返します。
以下に示すように、デバッガで1が戻ってきているかどうかをチェックしないのはなぜですか?

int rowsAffectedCount = cmd.ExecuteNonQuery(); 

はそれが:-)

1

「* FROM posts where where hash = @ endhash」から返されたものはありますか?あなたがブロック「を使用して、」実装していないといくつかの問題を持っている

1

ない場合は、whileループの事項の内部は何も...。私はあなたの内部コードにいくつかを追加しました。接続と選択コマンドのブロックは、私の考えでもっとうまく考えています。私はあなたがデータアダプタで同じことをしていることを願っています。

using (var connection = new SqlCeConnection(connectionString)) 
{ 
    connection.Open(); 
    var nodeItem = rssDoc.SelectNodes("/edno23/posts/post"); 

    foreach (XmlNode xn in nodeItem) 
    { 
     using (
      var selectCommand = 
       new SqlCeCommand(
        "Select * FROM posts Where [email protected]", 
        connection)) 
     { 
      var msgText = xn["message"].InnerText; 
      var c = xn["user_from"].InnerText; 
      var avatar = xn["user_from_avatar"].InnerText; 
      var endhash = GetMd5Sum(msgText); 
      selectCommand.Parameters.Add("@endhash", endhash); 
      selectCommand.CommandText = 
       "Select * FROM posts Where [email protected]"; 
      using (var reader = selectCommand.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        var msgs = reader["hash"].ToString(); 

        if (msgs == endhash && msgs != null) 
        { 
         continue; 
        } 

        const string COMMAND_TEXT = 
         "INSERT INTO posts([user],msg,avatar,[date],hash) VALUES(@username,@messige,@userpic,@thedate,@hash)"; 
        using (
         var insertCommand = 
          new SqlCeCommand(
           COMMAND_TEXT, connection)) 
        { 
         insertCommand.Parameters.Add("@username", c); 
         insertCommand.Parameters.Add(
          "@messige", msgText); 
         insertCommand.Parameters.Add(
          "@userpic", avatar); 
         insertCommand.Parameters.Add("@thedate", dt); 
         insertCommand.Parameters.Add(
          "@hash", endhash); 
         insertCommand.ExecuteNonQuery(); 
          // executes query 
        } 
        adapter.Update(data); // saves teh changes 
       } 

       reader.Close(); 
      } 
     } 
    } 

    connection.Close(); 
} 

もちろん、追加の入れ子を使用すると、部分は別の方法として分割する必要があります。

+0

解決策を働かせてくれてありがとう、しかし私は間違ったSQLを使用していたと思う私が必要とする全てを読み込むExecuteReader()の代わりにExecuteReader()を呼び出すExecuteScalar()は1つの結果しか返さず、もっと必要はありません:)ハッシュが/ isntになっていることを確認する必要があります:) http:// /avi.pastebin.com/f5aca84f4 <<時にはそれよりもシンプルに見えます:D – Aviatrix

関連する問題