C# 从CSV文件填充SQLite Db表
我正在努力让我的代码正常工作 我结合了我在这里找到的例子: 及 我正在使用OleDbConnection和OleDbDataAdapter(正在工作)将CSV文件读入数据集,然后使用SQLiteConnection和SQLiteDataAdapter(不工作)将该数据集保存到SQLite Db 上面第二个示例中的测试代码运行良好,其中数据集是根据代码创建的,然后保存到数据库中 数据库中的MasterDataTable已存在。我直接在目标数据库中创建了它 这是我的密码:C# 从CSV文件填充SQLite Db表,c#,sqlite,csv,C#,Sqlite,Csv,我正在努力让我的代码正常工作 我结合了我在这里找到的例子: 及 我正在使用OleDbConnection和OleDbDataAdapter(正在工作)将CSV文件读入数据集,然后使用SQLiteConnection和SQLiteDataAdapter(不工作)将该数据集保存到SQLite Db 上面第二个示例中的测试代码运行良好,其中数据集是根据代码创建的,然后保存到数据库中 数据库中的MasterDataTable已存在。我直接在目标数据库中创建了它 这是我的密码: using System
using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SQLite;
using System.IO;
namespace DataAdapterExample
{
class Program
{
static void Main(string[] args)
{
// Create a simple dataset
DataTable table = new DataTable("MasterDataTable");
DataSet ds = new DataSet();
ds.Tables.Add(table);
var filename = @"C:\Users\willi\Downloads\MasterDataReport2.csv";
var connString = string.Format(
@"Provider=Microsoft.Jet.OleDb.4.0;
Data Source={0};
Extended Properties=""Text;
HDR=YES;
FMT=Delimited""",
Path.GetDirectoryName(filename));
using (var conn = new OleDbConnection(connString))
{
conn.Open();
var query = "SELECT * FROM [" + Path.GetFileName(filename) + "]";
using (var adaptr = new OleDbDataAdapter(query,conn))
{
adaptr.Fill(table);
}
}
// Save in an SQLite file
string desktopPath =
Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
string fullPath = desktopPath + "\\class.db";
SQLiteConnection con = new SQLiteConnection("Data Source=" + fullPath);
con.Open();
// Create a table in the database to receive the information from the DataSet
SQLiteCommand cmd = new SQLiteCommand(con);
SQLiteDataAdapter adaptor = new SQLiteDataAdapter("SELECT * from MasterDataTable", con);
adaptor.InsertCommand = new SQLiteCommand("INSERT INTO MasterDataTable VALUES (" +
":startTime, " +
":entryId, " +
":entryType, " +
":category, " +
":class, " +
":participants, " +
":studioName, " +
":routineTitle)",
con
);
adaptor.InsertCommand.Parameters.Add("startTime", DbType.String, 0, "StartTime");
adaptor.InsertCommand.Parameters.Add("entryId", DbType.Int16, 0, "EntryID");
adaptor.InsertCommand.Parameters.Add("entryType", DbType.String, 0, "EntryType");
adaptor.InsertCommand.Parameters.Add("category", DbType.String, 0, "Category");
adaptor.InsertCommand.Parameters.Add("class", DbType.String, 0, "Class");
adaptor.InsertCommand.Parameters.Add("participants", DbType.String, 0, "Participants");
adaptor.InsertCommand.Parameters.Add("studioName", DbType.String, 0, "StudioName");
adaptor.InsertCommand.Parameters.Add("routineTitle", DbType.String, 0, "Routine Title");
adaptor.Update(ds, "MasterDataTable");
//Check database by filling the dataset in the other direction and displaying
ds = new DataSet();
adaptor.Fill(ds, "MasterDataTable");
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine("Table {0}", dt.TableName);
foreach (DataRow dr in dt.Rows)
{
foreach (DataColumn dc in dt.Columns)
{
Console.Write("{0,-18}", dr[dc]);
}
Console.WriteLine();
}
}
}
}
}
任何帮助都将不胜感激。我找到了原因和解决方案 原因是从OleDbDataAdapter.Fill()向数据集添加了状态为“未更改”的行。Update()方法读取“Unchanged”行状态,不执行INSERT查询 我的解决办法是:
foreach (DataRow row in ds.Tables[0].Rows)
{
row.SetAdded();
}
在Fill()调用之后,将每行的RowState设置为“Added”
最终的工作解决方案是:
using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SQLite;
using System.IO;
namespace DataAdapterExample
{
class Program
{
static void Main(string[] args)
{
// Create a simple dataset
DataSet ds = new DataSet();
var filename = @"C:\Users\willi\Downloads\MasterDataReport2.csv";
var connString = string.Format(
@"Provider=Microsoft.Jet.OleDb.4.0;
Data Source={0};
Extended Properties=""Text;
HDR=YES;
FMT=Delimited""",
Path.GetDirectoryName(filename));
using (var conn = new OleDbConnection(connString))
{
conn.Open();
var query = "SELECT * FROM [" + Path.GetFileName(filename) + "]";
using (var adaptr = new OleDbDataAdapter(query,conn))
{
adaptr.Fill(ds);
}
}
// Change the RowState to "Added" for the Update() method
foreach (DataRow row in ds.Tables[0].Rows)
{
row.SetAdded();
}
// Save in an SQLite file
string desktopPath =
Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
string fullPath = desktopPath + "\\class.db";
SQLiteConnection con = new SQLiteConnection("Data Source=" + fullPath);
con.Open();
// receive the information from the DataSet into the db
SQLiteCommand cmd = new SQLiteCommand(con);
SQLiteDataAdapter adaptor = new SQLiteDataAdapter("SELECT * from MasterDataTable", con);
adaptor.InsertCommand = new SQLiteCommand("INSERT INTO MasterDataTable VALUES (" +
":startTime, " +
":entryId, " +
":entryType, " +
":category, " +
":class, " +
":participants, " +
":studioName, " +
":routineTitle)",
con
);
adaptor.InsertCommand.Parameters.Add("startTime", DbType.String, 0, "StartTime");
adaptor.InsertCommand.Parameters.Add("entryId", DbType.Int16, 0, "EntryID");
adaptor.InsertCommand.Parameters.Add("entryType", DbType.String, 0, "EntryType");
adaptor.InsertCommand.Parameters.Add("category", DbType.String, 0, "Category");
adaptor.InsertCommand.Parameters.Add("class", DbType.String, 0, "Class");
adaptor.InsertCommand.Parameters.Add("participants", DbType.String, 0, "Participants");
adaptor.InsertCommand.Parameters.Add("studioName", DbType.String, 0, "StudioName");
adaptor.InsertCommand.Parameters.Add("routineTitle", DbType.String, 0, "Routine Title");
adaptor.Update(ds);
//Check database by filling the dataset in the other direction and displaying
ds = new DataSet();
adaptor.Fill(ds);
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine("Table {0}", dt.TableName);
foreach (DataRow dr in dt.Rows)
{
foreach (DataColumn dc in dt.Columns)
{
Console.Write("{0,-18}", dr[dc]);
}
Console.WriteLine();
}
}
}
}
}
这段代码只是一个较大项目的工作原型,但它按预期工作。命令中的参数没有指定值。。。是否尝试在不使用适配器或数据集的情况下直接对命令运行insert查询?参数使用列标题作为键,从数据集中的每一行获取其值。我认为现在发生的是OleDbDataAdapter的Fill()方法,它从CSV文件填充数据集,将RowState属性设置为“Unchanged”;然后SQLiteDataAdapter的Update()方法不执行插入,因为DataRow是“未更改的”。有没有办法更新RowState?