C# 创建SQLite数据库时发生异常

C# 创建SQLite数据库时发生异常,c#,sqlite,exception,windows-phone,windows-phone-8.1,C#,Sqlite,Exception,Windows Phone,Windows Phone 8.1,我开发了一个使用本地SQLite数据库的通用应用程序。因为我需要知道数据库版本,所以我存储了一个包含此信息的附加信息 在应用程序启动时,我检查数据库是否存在,以及数据库版本是否已更改 public sealed partial class App : Application { // DB Name public static string DBFileName = "myDb.sqlite"; public static string DBpath; // D

我开发了一个使用本地SQLite数据库的通用应用程序。因为我需要知道数据库版本,所以我存储了一个包含此信息的附加信息

在应用程序启动时,我检查数据库是否存在,以及数据库版本是否已更改

public sealed partial class App : Application
{
    // DB Name
    public static string DBFileName = "myDb.sqlite";
    public static string DBpath;

    // DB Version
    public static string DBVersionFilename = "myDb.version";
    public static string DBVersionPath;
    public static string DBVersion = "1.1.0";

    public App()
    {
        this.InitializeComponent();
        this.Suspending += this.OnSuspending;
        ManageDB();
    }

    private async Task ManageDB()
    {
        if (!CheckDbExist().Result)
        {
            CreateDb();
        }
        else
        {
            if (CheckDbVersionUpdated().Result)
            {
                await DeleteDb();
                CreateDb();
            }
        }
    }

    private async Task<bool> CheckDbExist()
    {
        try
        {
            StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(DBFileName);
            DBpath = storageFile.Path;
            return true;
        }
        catch { }
        return false;
    }

    private void CreateDb()
    {
        try
        {
            StorageFile storageFile = ApplicationData.Current.LocalFolder.CreateFileAsync(DBFileName, CreationCollisionOption.OpenIfExists).GetResults();
            DBpath = storageFile.Path;
            var dbconnection = new SQLiteAsyncConnection(DBpath, false);
            dbconnection.CreateTableAsync<Article>();
            //...

            StorageFile file = ApplicationData.Current.LocalFolder.CreateFileAsync(DBVersionFilename, CreationCollisionOption.ReplaceExisting).GetResults();
            FileIO.WriteTextAsync(file, DBVersion);
        }
        catch (Exception e)
        { }
    }

    private async Task<bool> DeleteDb()
    {
        try 
        {
            StorageFile storageFile = ApplicationData.Current.LocalFolder.CreateFileAsync(DBFileName, CreationCollisionOption.OpenIfExists).GetResults();
            await storageFile.DeleteAsync(StorageDeleteOption.PermanentDelete);
            return true;
        }
        catch { }
        return false;
    }

    private async Task<bool> CheckDbVersionUpdated()
    {
        try
        {
            string userDBVersion;
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(DBVersionFilename);
            userDBVersion = await FileIO.ReadTextAsync(file);
            if (userDBVersion != DBVersion)
                return true;
            else
                return false;
        }
        catch { }
        return false;
    }
}
公共密封部分类应用程序:应用程序
{
//数据库名
公共静态字符串DBFileName=“myDb.sqlite”;
公共静态字符串DBpath;
//数据库版本
公共静态字符串DBVersionFilename=“myDb.version”;
公共静态字符串DBVersionPath;
公共静态字符串DBVersion=“1.1.0”;
公共应用程序()
{
this.InitializeComponent();
this.Suspending+=this.OnSuspending;
ManageDB();
}
专用异步任务ManageDB()
{
如果(!CheckDbExist().Result)
{
CreateDb();
}
其他的
{
if(CheckDbVersionUpdated().Result)
{
等待DeleteDb();
CreateDb();
}
}
}
私有异步任务CheckDbExist()
{
尝试
{
StorageFile StorageFile=Wait ApplicationData.Current.LocalFolder.GetFileAsync(DBFileName);
DBpath=storageFile.Path;
返回true;
}
捕获{}
返回false;
}
私有void CreateDb()
{
尝试
{
StorageFile StorageFile=ApplicationData.Current.LocalFolder.CreateFileAsync(DBFileName,CreationCollisionOption.OpenIfExists)。GetResults();
DBpath=storageFile.Path;
var dbconnection=新的SQLiteAsyncConnection(DBpath,false);
dbconnection.CreateTableAsync();
//...
StorageFile file=ApplicationData.Current.LocalFolder.CreateFileAsync(DBVersionFilename,CreationCollisionOption.ReplaceExisting).GetResults();
WriteTextAsync(文件,DBVersion);
}
捕获(例外e)
{ }
}
专用异步任务DeleteDb()
{
尝试
{
StorageFile StorageFile=ApplicationData.Current.LocalFolder.CreateFileAsync(DBFileName,CreationCollisionOption.OpenIfExists)。GetResults();
等待storageFile.DeleteAsync(StorageDeleteOption.PermanentDelete);
返回true;
}
捕获{}
返回false;
}
私有异步任务CheckDbVersionUpdated()
{
尝试
{
字符串userDBVersion;
StorageFile file=Wait ApplicationData.Current.LocalFolder.GetFileAsync(DBVersionFilename);
userDBVersion=await FileIO.ReadTextAsync(文件);
if(userDBVersion!=DBVersion)
返回true;
其他的
返回false;
}
捕获{}
返回false;
}
}
CreateDB()
上有问题:

  • 如果我使用断点一步一步地浏览这段代码,就不会有问题
  • 但若我并没有放置断点,那个么在调用
    vardbconnection=newsqliteasyncconnection(DBpath,false)后会遇到异常
System.InvalidOperationException:在意外时间调用了方法。 在意外时间调用了一个方法。 在Windows .Fun.IasycCurress 1 .GETRESULTS() 在TestRating.App.CreateDb()处 你对遇到的问题有什么想法吗?还有其他方法吗?

当我删除“.Results()”时,似乎“CreateDb()”函数工作正常:

private异步任务CreateDb()
{
尝试
{
StorageFile StorageFile=Wait ApplicationData.Current.LocalFolder.CreateFileAsync(DBFileName,CreationCollisionOption.OpenIfExists);
DBpath=storageFile.Path;
var dbconnection=新的SQLiteAsyncConnection(DBpath,false);
dbconnection.CreateTableAsync();
//...
StorageFile file=wait ApplicationData.Current.LocalFolder.CreateFileAsync(DBVersionFilename,CreationCollisionOption.ReplaceExisting);
WriteTextAsync(文件,DBVersion);
返回true;
}
捕获(例外e)
{ }
返回false;
}

你有什么解释吗

private async Task<bool> CreateDb()
{
    try
    {
        StorageFile storageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(DBFileName, CreationCollisionOption.OpenIfExists);
        DBpath = storageFile.Path;
        var dbconnection = new SQLiteAsyncConnection(DBpath, false);
        dbconnection.CreateTableAsync<Article>();
        //...
        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(DBVersionFilename, CreationCollisionOption.ReplaceExisting);
        FileIO.WriteTextAsync(file, DBVersion);
        return true;
    }
    catch (Exception e)
    { }
    return false;
}