如何在 C# 中使用带有 odbc 事务的计数器

How to use counter with odbc transaction in C#

如何实现计数器,以便它提交多个查询,例如每 1000 个 "queries"。问题是有或没有事务查询是由 "ExecuteNonQuery()" 执行的,它一个一个地执行,而不是我想要的,例如每 1000 个?

        odbc.dbsqlite.Open();
        odbc.dbkopito.Open();


        OdbcCommand comlite = odbc.dbsqlite.CreateCommand();
        OdbcCommand comkopit = odbc.dbkopito.CreateCommand();
        OdbcTransaction transaction = null;

        comkopit.CommandText =
            "SELECT DISTINCT ... "

        #region TRY
        try
        {
            OdbcDataReader dbKopitReader = comkopit.ExecuteReader();

            var ordinal = new
            {
                cenik = dbKopitReader.GetOrdinal("sifra"),
                ident = dbKopitReader.GetOrdinal("ident"),
                klasifikacija = dbKopitReader.GetOrdinal("klasifikacija"),
                cena = dbKopitReader.GetOrdinal("cena"),
                eankoda = dbKopitReader.GetOrdinal("eankoda"),
            };

            int stevec = 0;

            while (dbKopitReader.Read())
            {
                var cena = Convert.ToDouble(dbKopitReader.GetDouble(ordinal.cena));
                var ident = Convert.ToString(dbKopitReader.GetString(ordinal.ident));
                var cenik = Convert.ToString(dbKopitReader.GetString(ordinal.cenik));
                var klasi = Convert.ToString(dbKopitReader.GetString(ordinal.klasifikacija));
                var eanko = Convert.ToString(dbKopitReader.GetString(ordinal.eankoda));

                using (var cmd = odbc.dbsqlite.CreateCommand() )
                {
                    try
                    {
                        cmd.CommandText = "INSERT OR REPLACE INTO ARTIKLI (KLASIFIKACIJA, CENA, BARKODA, CENIK, IDENT) " +
                                          "VALUES (?,?,?,?,?);";

                        cmd.Parameters.AddWithValue("@KLASIFIKACIJA", klasi);
                        cmd.Parameters.AddWithValue("@CENA", cena);
                        cmd.Parameters.AddWithValue("@BARKODA", eanko);
                        cmd.Parameters.AddWithValue("@CENIK", cenik);
                        cmd.Parameters.AddWithValue("@IDENT", ident);

                        cmd.ExecuteNonQuery();
                        if (stevec % 1000 == 0)
                        {
                            transaction.Commit();
                            transaction = odbc.dbsqlite.BeginTransaction();
                            cmd.Transaction = transaction;
                        }
                        stevec++;

                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        try
                        {
                            transaction.Rollback();
                        }
                        catch
                        {
                            Console.WriteLine("Transakcija ni aktivna");                               
                        }
                    }
                }
            }

            comlite.Dispose();
            odbc.dbsqlite.Close();

            dbKopitReader.Close();
            comkopit.Dispose();
            odbc.dbkopito.Close();
  1. 事务未在第一次迭代时启动(应该得到 null 异常)。
  2. 事务未分配给命令。
  3. 您每隔 1000 个创建事务并将其分配给命令,但接下来的 999 个命令是在没有事务的情况下创建的。
  4. 您在第一次迭代时提交事务。

这是您的代码的示例:

var transaction = odbc.dbsqlite.BeginTransaction();
int count = 0;
while(read)
{
  count++;
  if(count % 1000 == 0)
  {
     transaction.Commit();
     transaction = odbc.dbsqlite.BeginTransaction();
  }
  //I imagine this CreateCommand() is assigning connection...
  using(var cmd = odbc.dbsqlite.CreateCommand())
  {
     cmd.CommandText = "INSERT...";
     //Params...
     cmd.Transaction = transaction;
     cmd.ExecuteNonQuery();
  }
}