2014-03-13 55 views
1

这里是我使用的代码:接受“数据库被锁定”错误使用SQLite和C#

public bool save(string name, string type, string city, string org) 
    { 
     BLL.maxkey maxkey = new BLL.maxkey(); 
     int maxid = maxkey.getMaxKey(1); 

     { 
      SQLiteConnection sqConnection = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB"); 
      sqConnection.Open(); 

      SQLiteCommand cmd = new SQLiteCommand(); 
      cmd.Connection = sqConnection; 
      SQLiteTransaction trans; 

      trans = sqConnection.BeginTransaction(); 
      cmd.Transaction = trans; 
      int rows = 0; 

      try 
      { 
       cmd.CommandText = "insert into game values(@gameid, @gamename, @gametype, @gamecity, @gameorg)"; 
       cmd.Parameters.AddWithValue("@gameid", maxid); 
       cmd.Parameters.AddWithValue("@gamename", name); 
       cmd.Parameters.AddWithValue("@gametype", type); 
       cmd.Parameters.AddWithValue("@gamecity", city); 
       cmd.Parameters.AddWithValue("@gameorg", org); 

       cmd.ExecuteNonQuery(); 
       trans.Commit(); 
      } 
      catch (Exception ex) 
      { 
       trans.Rollback(); 
       error error = new error(ex); 
      } 
      finally 
      { 
       sqConnection.Close(); 
      } 

      if (rows == 1) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 


    } 

而且也:

public void updateMaxKey(int tablenum) 
    { 
     //using (var conn = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB")) 
     //using (var cmd = conn.CreateCommand()) 
     { 
      SQLiteConnection sqConnection = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB"); 
      sqConnection.Open(); 

      SQLiteCommand cmd = new SQLiteCommand(); 
      cmd.Connection = sqConnection; 
      SQLiteTransaction trans; 

      trans = sqConnection.BeginTransaction(); 
      cmd.Transaction = trans; 

      try 
      { 

       cmd.CommandText = "update maxnumkey set maxnum = (maxnum + 1) where tableid = @tableid"; 
       cmd.Parameters.AddWithValue("@tableid", tablenum); 
       cmd.ExecuteNonQuery(); 
       trans.Commit(); 
      } 
      catch (Exception ex) 
      { 
       trans.Rollback(); 
       error error = new error(ex); 
      } 
      finally 
      { 
       sqConnection.Close(); 
      } 
     } 
    } 

    public int returnMaxKey(int tablenum) 
    { 
     int maxrows = 0; 

     { 
      SQLiteConnection sqConnection = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB"); 
      sqConnection.Open(); 

      SQLiteCommand cmd = new SQLiteCommand(); 
      cmd.Connection = sqConnection; 
      SQLiteTransaction trans; 

      trans = sqConnection.BeginTransaction(); 
      cmd.Transaction = trans; 


      try 
      { 
       cmd.CommandText = "select maxnum from maxnumkey where tableid = @tableid"; 
       cmd.Parameters.AddWithValue("@tableid", tablenum); 

       SQLiteDataReader sqReader = cmd.ExecuteReader(); 
       sqReader.Read(); 
       maxrows = sqReader.GetInt32(0); 
       trans.Commit(); 


      } 
      catch (Exception ex) 
      { 
       trans.Rollback(); 
       error error = new error(ex); 
      } 
      finally 
      { 
       sqConnection.Close(); 
      } 

      if (maxrows > 0) 
      { 
       return maxrows; 
      } 
      else 
      { 
       return -1; 
      } 
     } 


    } 

我可以运行updatemaxkey功能,其次是returnmaxkey函数没有错误。我在数据库中验证正确处理了更新,并且返回的信息匹配。我试图进入保存功能,并在trans.Commit()我得到一个“数据库被锁定”的错误。

我似乎无法找到任何阐述此问题的地方,并给出了解决此问题的方向。

如果您需要任何进一步的澄清只是问。我刚开始使用大约12小时前的sqlite,所以我希望这是简单的,我只是俯瞰。

谢谢!

+0

我更新了代码以利用下面建议的“using”命令,现在在使用块之后有gc.collect(),而且我仍然遇到问题。不知道如何获得数据库文件的版本。 –

+0

好吧,我发现我的问题。我打开阅读器并开始阅读数据,并从未关闭它。其他一切都很好。 –

回答

1

Basic .NET中:

  • 处置一次性的对象。命令,连接都是这样的。

  • 这是最简单的使用“使用”语句。杀死你的一半的代码。

  • 这对交易是非常重要的。

我只能打赌,SqlConncetion - 由于违反要求您dipose实现IDisposable接口对象的基本原则.NET - 不释放的情况下的文件共享你重新打开以及 - 块数据库(它不能很好地处理多个并行访问)。

没有什么特别的SqlCe - 你的C#代码违反了核心.NET原则。

+0

好吧,我正在使用使用命令,但我不再。我有点困惑于此。为了解决这个问题,我需要更改或查看哪些内容? –