I'm trying to insert a DataTable into SQLite table, and i'm using foreach
loop for this, but it throw error SQLiteException: 'database is locked.
i tried to googling about this, and try to dispose my connection with using
Here's my code
public void Insert_to_db(DataTable data)
{
foreach (DataRow row in data.Rows)
{
string alertTag = row["Alert Tag"].ToString();
int group = Convert.ToInt32(row["Group"]);
int line = Convert.ToInt32(row["Line"]);
int task = Convert.ToInt32(row["Task"]);
string sql = string.Format("insert into alert_tag (alert_tag, layer_group, line, task) values ('{0}','{1}','{2}','{3}')", alertTag, group, line, task);
using (SQLiteConnection dbConn = new SQLiteConnection(Tools.SqliteConnString()))
{
using (SQLiteCommand command = new SQLiteCommand(sql, dbConn))
{
dbConn.Open();
command.ExecuteNonQuery();
dbConn.Close();
}
}
}
}
So as @JhonB suggested, i settled on using dapper but first i have to convert my DataTabe to List of Object
private List<AlertTagModel> convert(DataTable dt)
{
var convertedData = (from rw in dt.AsEnumerable()
select new AlertTagModel() {
alert_tag = Convert.ToString(rw["AlertTag"]),
layer_group = Convert.ToInt32(rw["Group"]),
line = Convert.ToInt32(rw["Line"]),
task = Convert.ToInt32(rw["Task"])
}).ToList();
return convertedData;
}
then insert into DB with dapper
public void Insert_to_db(Object data)
{
using (IDbConnection cnn = new SQLiteConnection(Tools.LoadConnectionString()))
{
cnn.Execute("insert into alert_tag (AlertTag, Layer_ID, Line_ID, Task_ID) values (@alert_tag, @layer_group, @line, @task)", data);
}
}
Solved!