检查数据库表是否包含任何行

时间:2018-08-17 15:27:26

标签: c# sqlite xamarin

我正在将数据加载到具有3个Entry控件的表单中。

我为此使用的对象称为mySettings,它是SystemSettings的对象,SQLite是我的var db = new SQLiteConnection(dbPath); Entry txtServer; txtServer = new Entry { FontSize = 10 }; controlGrid.Children.Add(txtServer, 2, 0); Grid.SetColumnSpan(txtServer, 4); SystemSettings mySettings; mySettings = db.Get<SystemSettings>(0); txtServer.Text = mySettings.FTPServer; 数据库中的类和数据库表。

到目前为止,我已经有了这段代码,它可以按原样工作。

SystemSettings

但是,在加载值之前,我需要检查SQLiteCommand cmd; cmd = new SQLiteCommand(db); ... int result = Convert.ToInt32(db.ExecuteScalar) 是否包含表中的任何行。

我在网上看到了一些指南。

有人说使用类似的东西

db.

但是,我在这里说错了

  

SQLiteCommand不包含任何包含x参数的方法

无论我传递了多少(0个或更多)。

SystemSettings中似乎还没有方法

那么在尝试使用不存在的数据之前,如何检查[2018-08-17T17:22:00,880][WARN ][org.apache.kafka.clients.NetworkClient] [Producer clientId=%{host}] Error while fetching metadata with correlation id 211 : {etl.No Audio=INVALID_TOPIC_EXCEPTION} [2018-08-17T17:22:05,881][WARN ][org.apache.kafka.clients.NetworkClient] [Producer clientId=%{host}] Error while fetching metadata with correlation id 212 : {etl.No Audio=INVALID_TOPIC_EXCEPTION} [2018-08-17T17:22:10,881][WARN ][org.apache.kafka.clients.NetworkClient] [Producer clientId=%{host}] Error while fetching metadata with correlation id 213 : {etl.No Audio=INVALID_TOPIC_EXCEPTION} [2018-08-17T17:22:15,882][WARN ][org.apache.kafka.clients.NetworkClient] [Producer clientId=%{host}] Error while fetching metadata with correlation id 214 : {etl.No Audio=INVALID_TOPIC_EXCEPTION} [2018-08-17T17:22:20,882][WARN ][org.apache.kafka.clients.NetworkClient] [Producer clientId=%{host}] Error while fetching metadata with correlation id 215 : {etl.No Audio=INVALID_TOPIC_EXCEPTION} [2018-08-17T17:22:25,883][WARN ][org.apache.kafka.clients.NetworkClient] [Producer clientId=%{host}] Error while fetching metadata with correlation id 216 : {etl.No Audio=INVALID_TOPIC_EXCEPTION} 是否包含任何行?

3 个答案:

答案 0 :(得分:1)

您想要做的是获取SystemSettings表中的第一行(如果有): 因此,您应该执行以下Sql语句(或类似方法)并检查是否返回了结果:

Select * from SystemSettings LIMIT 1;

您可以执行查询并按以下方式检查结果:

public bool DoesTableContainRows(string tableName, SQLiteConnection connection)
{
    var command = new SQLiteCommand($"Select * from {tableName } LIMIT 1;", connection);
    var resultReader = command.ExecuteReader();
    // check whether or not a row was returned
    bool containRows = resultReader.Read();
    resultReader.Close();
    return containRows;
}

编辑: 显示如何使用.NET和Microsoft.Data.Sqlite检查表是否包含行,包括更好地处理资源。

public bool DoesTableContainRows(string tableName, SqliteConnection connection)
{
    using (var command = new SqliteCommand($"Select * from {tableName } LIMIT 1;", connection))
    {
        using (var resultReader = command.ExecuteReader())
        {
             // check whether or not a row was returned
             bool containRows = resultReader.Read();
             resultReader.Close();
             return containRows;
        }
    }
}

答案 1 :(得分:1)

下面的模式应该起作用。 .ExecuteScalar()方法实际上在命令上,而不在连接上。

    int count;
    using (SQLiteConnection db = new SQLiteConnection("MY_CXN_STRING"))
    using (SQLiteCommand cmd = new SQLiteCommand("SELECT COUNT(*) FROM SystemSettings"))
    {
        db.Open();
        count = (int)cmd.ExecuteScalar();
        db.Close();
    }
bool hasRows = count != 0;

答案 2 :(得分:1)

基本上您想清除

SystemSettings

尝试仅运行对数据库不返回任何内容的查询。例如:

SystemSettings = $"SELECT * FROM TABLE_NAME WHERE COLUMN_NAME IS 'INVALID_EXPRESSIONdjeiq48724rufnjdrandom stuff'";

无论如何,这都不是最优雅的解决方案,但是它可以工作。

相关问题