проблемы вставки тегов в sqlite DB, C # - PullRequest
1 голос
/ 29 мая 2009

у меня есть 2 стола

        "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();
            }
        }

Ответы [ 2 ]

1 голос
/ 29 мая 2009

Это может быть не лучшим решением, но использование оператора SELECT и проверка, если объект нулевой, работает.

-edit- мне лень менять и проверять его, но код должен делать вставку ... где не существует (выбрать) по соображениям безопасности валюты.

    void insertMediaTags(List<string> tags, long mediaId)
    {
        foreach(string tag in tags)
        {
            long tagId;
            command.CommandText = "SELECT tagid FROM tag_name WHERE title=@title;";
            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 голосов
/ 29 мая 2009

Если вы используете INSERT OR REPLACE вместо INSERT OR IGNORE, я считаю, что last_insert_rowid будет таким, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...