我见过类似的问题(1,2),但没有人讨论如何将CSV文件插入SQLite。关于我能想到的唯一事情是使用CSVDataAdapter
并填充SQLiteDataSet
,然后使用SQLiteDataSet
更新数据库中的表:
我找到的唯一的CSV文件DataAdapter实际上并不可用:
CSVDataAdapter CSVda = new CSVDataAdapter(@"c:\MyFile.csv");
CSVda.HasHeaderRow = true;
DataSet ds = new DataSet(); // <-- Use an SQLiteDataSet instead
CSVda.Fill(ds);
要写入CSV文件:
CSVDataAdapter CSVda = new CSVDataAdapter(@"c:\MyFile.csv");
bool InclHeader = true;
CSVda.Update(MyDataSet,"MyTable",InclHeader);
我找到了上面的代码@ http://devintelligence.com/2005/02/dataadapter-for-csv-files/
CSVDataAdapter
应该与OpenNetCF's SDF一起出现,但它似乎不再可用。
有人知道我可以在哪里获得CSVDataAdapter
吗?也许有人知道更简单的事情:如何将CSV文件批量插入到SQLite中......非常感谢您的帮助!
答案 0 :(得分:2)
您可以使用许多工具中的任何一种将数据从.csv文件迁移到数据库,包括:
注意:第一个和第三个解决方案要求您通过jdbc接口访问.csv文件。
所有这些都允许您在某种程度上调整迁移过程(例如批量大小),并且所有这些都假设您希望手动进行迁移,而不是运行C#代码(这会使事情复杂化)。
答案 1 :(得分:1)
试试这个 - Import/Export CSV from SQLite from C# code
你可以创建OleDbConnection到CSV文件(只是google它,这很容易)然后将行加载到DataSet,然后通过SqliteConnection将该数据集放入Sqlite。几行代码。
答案 2 :(得分:1)
我对FileHelpers(http://www.filehelpers.net/)有很好的个人经验。
答案 3 :(得分:1)
解决问题的最后部分:
也许有人知道更简单的事情:如何进行批量插入 将CSV文件放入SQLite ......
鉴于,您需要从CSV文件中将几千(或一百万个)的记录导入sqlite,
当没有通过select或insert命令直接支持csv数据导入时,和迭代逐行读取&amp;插入不具备性能然后一个实际的替代方案是使用“sqlite?.exe”&amp;通过shell执行的import命令从你的c#代码执行。
<强> loadcsvtosqlite.cs 强>
Process proc = new Process {
StartInfo = new ProcessStartInfo {
FileName = @"loadcsvtosqlite.bat",
Arguments = @"",
UseShellExecute = true,
RedirectStandardOutput = false,
CreateNoWindow = true
}
};
proc.Start();
proc.WaitForExit();
<强> loadcsvtosqlite.bat 强>
sqlite3.exe "db name" < loadcsv.sql
<强> loadcsv.sql 强>
drop table if exists <table name>;
create table <table name> (field1 datatype, field2 datatype ....);
.separator ","
.import <csv file name> <table name>
答案 4 :(得分:0)
public void LoadCheckFiletoDatabase(string checkFilePath) { DataTable tempTable = GetDataTableFromCsv(checkFilePath);
foreach (DataRow DataR in this.memDataTable.Columns)
{
Dictionary<string, object> Dic = new Dictionary<string, object>();
foreach (DataColumn DataCol in this.memDataTable.Columns)
{
string field = DataCol.ColumnName.ToString();
object value = (string)DataR[DataCol].ToString();
Dic.Add(field, value);
}
using (SQLiteConnection sQLiteConnection = new SQLiteConnection("data source=" + databasepath))
{
using (SQLiteCommand sQLiteCommand = new SQLiteCommand(sQLiteConnection))
{
System.Data.SQLite.SQLiteHelper sQLiteHelper = new SQLiteHelper(sQLiteCommand);
sQLiteHelper.BeginTransaction();
sQLiteHelper.Insert(tempTable.TableName, Dic);
}
}
}
public static DataTable GetDataTableFromCsv(string path)
{
string pathOnly = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
string sql = @"SELECT * FROM [" + fileName + "]";
using(OleDbConnection connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
";Extended Properties=\"Text;HDR=" + "Yes" + "\""))
using(OleDbCommand command = new OleDbCommand(sql, connection))
using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
DataTable dataTable = new DataTable();
dataTable.Locale = CultureInfo.CurrentCulture;
adapter.Fill(dataTable);
dataTable.TableName = fileName.TrimEnd(new char[] {'.','c','s','v'});
return dataTable;
}
}