10

我正在尝试检查表中的记录是否已存在。

我怎么能那样做?

我已经写了以下代码:

string dbName = "Data Source=searchindex.db";
SQLiteConnection con = new SQLiteConnection(dbName);
con.Open();
SQLiteCommand cmd = new SQLiteCommand(con);

// If this sql request return false
cmd.CommandText = "SELECT rowid FROM wordlist WHERE word='word'"; 
cmd.ExecuteNonQuery();

// then add record in table
cmd.CommandText = "INSERT INTO wordlist(word) VALUES ('word')";
4

3 回答 3

21

要检查该记录是否存在,您可以简化代码

cmd.CommandText = "SELECT count(*) FROM wordlist WHERE word='word'"; 
int count = Convert.ToInt32(cmd.ExecuteScalar());
if(count == 0)
{
    cmd.CommandText = "INSERT INTO wordlist(word) VALUES ('word')"; 
    cmd.ExecuteNonQuery();
}

ExecuteScalar将返回查询返回的第一行的第一列。
(链接是针对SqlServer的,但是对于SQLite来说是一样的,因为SQLiteCommand应该实现IDbCommand接口)

另一种使用方法如下

cmd.CommandText = "INSERT INTO wordlist (word) 
                   SELECT ('word')
                   WHERE NOT EXISTS 
                       (SELECT 1 FROM wordlist WHERE word = 'word');";
cmd.ExecuteNonQuery();

这甚至更好,因为您使用单个查询而不是两个查询(尽管本地数据库中的差异应该很小)

于 2013-03-28T14:14:22.587 回答
0
        insert into wordlist(word)
        select 'foo' 
        where not exists ( select 1 from wordlist where word = 'foo')
于 2013-03-28T14:49:32.430 回答
0

如果您使用的是sqlite-net-pcl,您可以编写以下内容。

我有几个表的基类,其中有一个 RowExists 方法。相关源代码如下:

public abstract class BaseSQLiteAccess
{
    protected SQLiteConnection _databaseConnection;
    protected String TableName { get; set; }

    //...

    protected bool RowExists(int id) 
    {
        bool exists = false;
        try
        {
            exists = _databaseConnection.ExecuteScalar<bool>("SELECT EXISTS(SELECT 1 FROM " + TableName + " WHERE ID=?)", id);
        }
        catch (Exception ex)
        {
            //Log database error
            exists = false;
        }
        return exists;
    }
}
于 2019-09-08T14:33:19.537 回答