【问题标题】:Problems inserting items in a database using SQLite in C#在 C# 中使用 SQLite 在数据库中插入项目时出现问题
【发布时间】:2016-08-31 23:10:50
【问题描述】:

我正在尝试使用 SQLite 在数据库中插入项目,但是当我调用 loadfunction 时,我收到一个错误,如索引不足。我认为问题出在我调用 add 函数时。我检查了参数值,一切似乎都正常,但元素没有插入表中。下面你会看到我的表格,添加函数和加载函数。

桌子:

CREATE TABLE `Fisiere` (
    `Nume`  TEXT,
    `Dimensiune`    INTEGER,
    `Data`  BLOB,
    `Rating_imdb`   REAL,
    `Cale`  TEXT
);

插入函数:

public void addFisier(DirectorVideo[] directors)
        {
            var dbCommand = new SQLiteCommand();
            dbCommand.Connection = _dbConnection;
            dbCommand.CommandText = "insert into Fisiere(Nume, Dimensiune, Data, Rating_imdb, Cale) values(@nume, @dimensiune, @data, @rating_imdb, @cale);";
            try {
                _dbConnection.Open();
                dbCommand.Transaction = _dbConnection.BeginTransaction();
                for (int i = 0; i < directors.Length - 1; i++)
                {
                    for (int j = 0; j < directors[i].nrFisiere; j++)
                    {
                        var numeParam = new SQLiteParameter("@nume");
                        numeParam.Value = directors[i].fisiere[j].numeFisier;
                        var dimensiuneParam = new SQLiteParameter("@dimensiune");
                        dimensiuneParam.Value = directors[i].fisiere[j].dimensiune;
                        var dataParam = new SQLiteParameter("@data");
                        dataParam.Value = directors[i].fisiere[j].data;
                        var ratingParam = new SQLiteParameter("rating_imdb");
                        IMDb rat = new IMDb(directors[i].fisiere[j].numeFisier);
                        ratingParam.Value = rat.Rating;
                        var caleParam = new SQLiteParameter("cale");
                        caleParam.Value = directors[i].cale;

                        Console.WriteLine(numeParam.Value);

                        dbCommand.Parameters.Add(numeParam);
                        dbCommand.Parameters.Add(dimensiuneParam);
                        dbCommand.Parameters.Add(dataParam);
                        dbCommand.Parameters.Add(ratingParam);
                        dbCommand.Parameters.Add(caleParam);



                        Console.WriteLine(caleParam.Value);


                        dbCommand.Transaction.Commit();
                        Console.WriteLine("A fost inserat");

                    }
                }


            }
            catch (Exception)
            {
                Console.WriteLine("muie");
                dbCommand.Transaction.Rollback();
                throw;
            }
            finally
            {
                if (_dbConnection.State != ConnectionState.Closed) _dbConnection.Close();

            }
        }

加载文件功能

public void LoadFiles()
        {
            const string stringSql = "PRAGMA database_list";
            try
            {
                _dbConnection.Open();
                SQLiteCommand sqlCommand = new SQLiteCommand(stringSql, _dbConnection);
                SQLiteDataReader sqlReader = sqlCommand.ExecuteReader();
                try
                {
                    while (sqlReader.Read())
                    {
                        Console.WriteLine("se afiseaza");

                        Console.WriteLine((long)sqlReader["Id_fisier"]);
                        Console.WriteLine((string)sqlReader["Nume"]);
                        Console.WriteLine((long)sqlReader["Dimensiune"]);
                        Console.WriteLine(DateTime.Parse((string)sqlReader["Data"]));
                        Console.WriteLine((long)sqlReader["Rating_imdb"]);
                        Console.WriteLine((string)sqlReader["Cale"]);

                    }
                }
                finally
                {
                    // Always call Close when done reading.
                    sqlReader.Close();
                }
            }
            finally
            {
                if (_dbConnection.State != ConnectionState.Closed) _dbConnection.Close();
            }
        }

【问题讨论】:

    标签: c# sqlite insert


    【解决方案1】:

    你需要Commit你的交易。你打电话给BeginTransaction(),但你永远不会提交你的事务,所以数据永远不会被写入数据库。查看此内容以了解交易的详细信息和工作流程。 https://www.sqlite.org/lang_transaction.html

    另一个问题是您的事务和命令都乱序了。您需要在事务中执行命令,然后提交事务。

        public void addFisier(DirectorVideo[] directors)
            {
                SQLiteTransaction dbTrans;
    
                try
                {
                    _dbConnection.Open();
    
                    // Start Transaction first.
                    dbTrans = _dbConnection.BeginTransaction();
    
                    for (int i = 0; i < directors.Length - 1; i++)
                    {
                        for (int j = 0; j < directors[i].nrFisiere; j++)
                        {
                            // Create commands that run based on your number of inserts.
                            var dbCommand = new SQLiteCommand();
                            dbCommand.Connection = _dbConnection;
                            dbCommand.CommandText = "insert into Fisiere(Nume, Dimensiune, Data, Rating_imdb, Cale) values(@nume, @dimensiune, @data, @rating_imdb, @cale);";
                            dbCommand.Transaction = dbTrans;
    
                            var numeParam = new SQLiteParameter("@nume");
                            numeParam.Value = directors[i].fisiere[j].numeFisier;
                            var dimensiuneParam = new SQLiteParameter("@dimensiune");
                            dimensiuneParam.Value = directors[i].fisiere[j].dimensiune;
                            var dataParam = new SQLiteParameter("@data");
                            dataParam.Value = directors[i].fisiere[j].data;
                            var ratingParam = new SQLiteParameter("rating_imdb");
                            IMDb rat = new IMDb(directors[i].fisiere[j].numeFisier);
                            ratingParam.Value = rat;
                            var caleParam = new SQLiteParameter("cale");
                            caleParam.Value = directors[i].cale;
    
                            Console.WriteLine(numeParam.Value);
    
                            dbCommand.Parameters.Add(numeParam);
                            dbCommand.Parameters.Add(dimensiuneParam);
                            dbCommand.Parameters.Add(dataParam);
                            dbCommand.Parameters.Add(ratingParam);
                            dbCommand.Parameters.Add(caleParam);
    
                            Console.WriteLine(caleParam.Value);
    
                            Console.WriteLine("A fost inserat");
    
                            // Actually execute the commands.
                            dbCommand.ExecuteNonQuery();
                        }
                    }
    
                    // If everything is good, commit the transaction.
                    dbTrans.Commit();
                }
                catch (Exception)
                {
                    Console.WriteLine("muie");
                    dbTrans.Rollback();
                    throw;
                }
                finally
                {
                    if (_dbConnection.State != ConnectionState.Closed) _dbConnection.Close();
    
                }
            }
    

    这也是 SQLiteTransaction 类文档中的一个 sn-p。我建议阅读它:https://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteTransaction.html

    public static void RunSQLiteTransaction(string myConnString) { 
        using (SQLiteConnection sqConnection = new SQLiteConnection(myConnString)) { 
            sqConnection.Open(); 
            // Start a local transaction 
            SQLiteTransaction myTrans = sqConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); 
            SQLiteCommand sqCommand = sqConnection.CreateCommand(); 
            try { 
                sqCommand.CommandText = "INSERT INTO Dept(DeptNo, DName) Values(52, 'DEVELOPMENT')"; 
                sqCommand.ExecuteNonQuery(); 
                sqCommand.CommandText = "INSERT INTO Dept(DeptNo, DName) Values(62, 'PRODUCTION')"; 
                sqCommand.ExecuteNonQuery(); 
                myTrans.Commit(); 
                Console.WriteLine("Both records are written to database."); 
            } 
            catch (Exception e) { 
                myTrans.Rollback(); 
                Console.WriteLine(e.ToString()); 
                Console.WriteLine("Neither record was written to database."); 
            } 
            finally { 
                sqCommand.Dispose(); 
                myTrans.Dispose(); 
            } 
        } 
    } 
    

    【讨论】:

    • 使用更改更新您的代码,以便我们至少可以验证它应该在哪里。
    • @AlexChihaia 我用更多信息更新了我的答案。你永远不会执行你的命令,而且你的新 Commit 是在错误的地方。
    • 欧普斯。不得不编辑,_dbConnection 电话被翻转。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2021-10-17
    • 2022-12-05
    • 2011-12-13
    相关资源
    最近更新 更多