2016-07-05 86 views
0

应用程序的功能是从一个数据库(PSQL)中选择一些值并将其插入到另一个数据库(SQLite)中。但是,下面的代码不起作用,它停止在执行行并显示没有错误,但永远持续(如果我使用SELECT TOP 1 ...)。如何使用c#中的ODBC执行SQLite中的INSERT INTO操作

//... odbc conection to DSN, this works fine 
odbc.dbsqlite.Open(); 
odbc.dbpsql.Open(); 

//sql command 
OdbcCommand comsqlite = odbc.dbsqlite.CreateCommand(); 
OdbcCommand compsql = odbc.dbpsql.CreateCommand(); 

//SQL for select ... this works 
compsql.CommandText = "SELECT DISTINCT ..." 

compsql.Parameters.AddWithValue("@sifra", "VP"); 
... 

// from here is problem 
try 
{ 
    OdbcDataReader dbReader = compsql.ExecuteReader(); 
    OdbcTransaction transaction = odbc.dbsqlite.BeginTransaction(); 

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

    int count = 0; 

    while (dbReader.Read()) 
    { 
     //here single variable gets results 
     var cena = Convert.ToDouble(dbReader.GetDouble(ordinal.cena)); 
     var ident = Convert.ToString(dbReader.GetString(ordinal.ident)); 
     var cenik = Convert.ToString(dbReader.GetString(ordinal.cenik)); 
     var klasi = Convert.ToString(dbReader.GetString(ordinal.klasi)); 
     var eanko = Convert.ToString(dbReader.GetString(ordinal.eankoda)); 

     comsqlite.CommandText = "INSERT INTO ARTIKLI (KLASI, CENA, BARKODA, CENIK, IDENT) VALUES (?,?,?,?,?);"; 

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

     if (count % 1000 == 0) 
     { 
      transaction.Commit(); 
      transaction.Dispose(); 
      **comsqlite.ExecuteNonQuery(); //here it stops and give no results** 
      transaction = odbc.dbsqlite.BeginTransaction(); 

     } 
     count++; 

     } 

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

     transaction.Commit(); 
     transaction.Dispose(); 

     dbReader.Close(); 
     compsql.Dispose(); 
     odbc.dbpsql.Close(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error: "+ e); 
      throw; 
     } 
+1

至少在处置事务之前尝试移动ExecuteNonQuery。并非每1000次读取都应为每个插入执行ExecuteNonQuery。 – Steve

+0

此外命令应该关联到事务,我没有看到任何地方的[DbCommand.Transaction]的设置(https://msdn.microsoft.com/en-us/library/system.data.common.dbcommand .transaction(v = vs.110).aspx)属性 – Steve

回答

0

我不知道你的CommandText的样子,在这一点上,但你应该尝试设置与周围的一些价值观单引号是你的数据库的字符串/字符。

comsqlite.CommandText = "INSERT INTO ARTIKLI (KLASI, CENA, BARKODA, CENIK, IDENT) VALUES ('?','?','?','?','?');"; 
+1

那些是参数,它们不需要引号 – Steve

+0

@Steve正确,那些是参数,因为我使用了paremetrization for SQL。 – DaniKR

+0

噢,明白了:) –