应用程序的功能是从一个数据库(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;
}
至少在处置事务之前尝试移动ExecuteNonQuery。并非每1000次读取都应为每个插入执行ExecuteNonQuery。 – Steve
此外命令应该关联到事务,我没有看到任何地方的[DbCommand.Transaction]的设置(https://msdn.microsoft.com/en-us/library/system.data.common.dbcommand .transaction(v = vs.110).aspx)属性 – Steve