2009-05-29 7 views
1

にタグを挿入iが2つのテーブル問題SQLiteのDB、C位

 "CREATE TABLE if not exists tag_name(" + 
     "tagid INTEGER PRIMARY KEY, " + 
     "title TEXT UNIQUE);"; 

     "CREATE TABLE if not exists media_tags(" + 
     "media_id INTEGER, " + 
     "tagid INTEGER);"; 

を有するが、私はこのコードでそれらを挿入します。問題は、last_insert_rowidは私が期待しているものではないということです。私はINSERTが無視されると、挿入を失敗させるROWIDを返します。たとえば、 "tag1"、 "tag2"、 "tag3"を挿入するとします。 "tag2"を挿入すると、最後に挿入された成功した行の代わりに2が返されます。どのように私はこれを解決するのですか?

 void insertMediaTags(List<string> tags, long mediaId) 
     { 
      foreach(string tag in tags) 
      { 
       command.CommandText = 
        "INSERT OR IGNORE INTO tag_name(title) VALUES(@title); " + 
        "SELECT last_insert_rowid() AS RecordID;"; 
       command.Parameters.Add("@title", DbType.String).Value = tag; 
       long tagid = (long)command.ExecuteScalar(); 
       command.CommandText = 
        "INSERT INTO media_tags(media_id, tagid) " + 
        "VALUES(@media_id, @tagid);"; 
       command.Parameters.Add("@media_id", DbType.Int32).Value = mediaId; 
       command.Parameters.Add("@tagid", DbType.Int64).Value = tagid; 
       command.ExecuteNonQuery(); 
      } 
     } 

答えて

1

これは最善の解決策ではない可能性がありますが、SELECT文を使用して、オブジェクトがnullであるかどうかを確認します。

-edit-私は変更してテストするのが面倒ですが、コードは挿入を行っています...通貨の安全上の理由から存在しません。

void insertMediaTags(List<string> tags, long mediaId) 
    { 
     foreach(string tag in tags) 
     { 
      long tagId; 
      command.CommandText = "SELECT tagid FROM tag_name WHERE [email protected];"; 
      command.Parameters.Add("@title", DbType.String).Value = tag; 
      object o = command.ExecuteScalar(); 
      if (o == null) 
      { 
       command.CommandText = 
        "INSERT OR IGNORE INTO tag_name(title) VALUES(@title); " + 
        "SELECT last_insert_rowid() AS RecordID;"; 
       command.Parameters.Add("@title", DbType.String).Value = tag; 
       tagId = (long)command.ExecuteScalar(); 
      } 
      else 
       tagId = (long)o; 

      command.CommandText = 
       "INSERT INTO media_tags(media_id, tagid) " + 
       "VALUES(@media_id, @tagid);"; 
      command.Parameters.Add("@media_id", DbType.Int32).Value = mediaId; 
      command.Parameters.Add("@tagid", DbType.Int64).Value = tagId; 
      command.ExecuteNonQuery(); 
     } 
    } 
0

あなたの代わりにINSERT OR IGNOREINSERT OR REPLACEを使用している場合、私はあなたがそれになりたいとlast_insert_rowidが可能になると考えています。

+0

replaceは、古いPK Intを使用してすべてのエントリを壊す主キーを変更すると言いました。 –