连接数据库无法打开?

时间:2018-07-06 11:49:22

标签: c# sqlite uwp

我目前正在使用Microsoft.Data.Sqlite名称空间来开发UWP应用。

我可以将数据写入数据库以及所有内容,但是当我想删除数据库时,出现错误提示ExecuteNonQuery can only be called when the connection is open.

我通常对使用SQLite和数据库真的很陌生,因此肯定会出现一些错误。我似乎找不到与该错误有关的任何东西,所以我不得不在这里询问。

这是我用来初始化数据库的代码:

public static void InitializeDatabase()
{
    using (SqliteConnection db =
        new SqliteConnection($"Filename=DashboardDatabase.db"))
    {
        db.Open();

        const string tableCommand = "CREATE TABLE IF NOT EXISTS " +
                                    "VisibilityTable (" +
                                    "ParameterId INTEGER NOT NULL PRIMARY KEY, " +
                                    "UserVisibility INTEGER NOT NULL, " +
                                    "GeneralVisibility INTEGER NOT NULL, " +
                                    "Format TEXT NOT NULL)";

        SqliteCommand createTable = new SqliteCommand(tableCommand, db);

        try
        {
            createTable.ExecuteReader();
        }
        catch (SqliteException sqliteException)
        {
            Log.Logger.Error("An Error occurred while creating a table in the database:");
            Log.Logger.Error(sqliteException.Message);
        }

        db.Close();
    }
}

这是我用来删除表的代码,它在要运行ExecuteNonQuery方法时会立即产生错误。

public static void DeleteTable()
{
    using (SqliteConnection db = new SqliteConnection("Filename=DashboardDatabase.db"))
    {
        db.Open();

        SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable");

        deleteCommand.ExecuteNonQuery();

        db.Close();
    }
}

在这种情况下,我将非常感谢您的帮助。

编辑:

正如JayV在评论中指出的那样,我未能在SqliteCommand中添加一部分...

因此解决方案是更改此行:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable");

对此:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable", db);

1 个答案:

答案 0 :(得分:1)

在创建deleteCommand对象时,您忽略了向其添加数据库连接。

更改行:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable");

收件人:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable", db);

顺便说一句,您应该考虑像使用Connection一样将整个调用包装在using(..)块中。

示例:

using(SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable", db))
{
    deleteCommand.ExecuteNonQuery();
}