我试图使用oledb csv解析器从csv文件加载一些数据并将其插入sqlite数据库,但是
OleDbAdapter.Fill
方法和它令人沮丧:
类型的未处理异常
'系统.数据.约束异常'
在system.data.dll中发生
附加信息:未能
启用约束。一行或多行
包含违反非空的值,
唯一或外键约束。
以下是源代码:
public void InsertData(String csvFileName, String tableName)
{
String dir = Path.GetDirectoryName(csvFileName);
String name = Path.GetFileName(csvFileName);
using (OleDbConnection conn =
new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
dir + @";Extended Properties=""Text;HDR=No;FMT=Delimited"""))
{
conn.Open();
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + name, conn))
{
QuoteDataSet ds = new QuoteDataSet();
adapter.Fill(ds, tableName); // <-- Exception here
InsertData(ds, tableName); // <-- Inserts the data into the my SQLite db
}
}
}
class Program
{
static void Main(string[] args)
{
SQLiteDatabase target = new SQLiteDatabase();
string csvFileName = "D:\\Innovations\\Finch\\dev\\DataFeed\\YahooTagsInfo.csv";
string tableName = "Tags";
target.InsertData(csvFileName, tableName);
Console.ReadKey();
}
}
“yahootagsinfo.csv”文件如下所示:
tagId,tagName,description,colName,dataType,realTime
1,s,Symbol,symbol,VARCHAR,FALSE
2,c8,After Hours Change,afterhours,DOUBLE,TRUE
3,g3,Annualized Gain,annualizedGain,DOUBLE,FALSE
4,a,Ask,ask,DOUBLE,FALSE
5,a5,Ask Size,askSize,DOUBLE,FALSE
6,a2,Average Daily Volume,avgDailyVolume,DOUBLE,FALSE
7,b,Bid,bid,DOUBLE,FALSE
8,b6,Bid Size,bidSize,DOUBLE,FALSE
9,b4,Book Value,bookValue,DOUBLE,FALSE
我试过以下方法:
-
删除csv文件中的第一行,这样就不会把它与实际数据混淆。
-
将真/假实时标志更改为1/0。
-
我尝试了1和2(即删除第一行并更改标志)。
这些都没有帮助…
一个限制是tagid应该是唯一的。下面是设计视图中的表:
有谁能帮我弄清楚这里有什么问题吗?
更新:
我更改了hdr属性
HDR=No
到
HDR=Yes
现在也不例外了:
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dir + @";Extended Properties=""Text;HDR=Yes;FMT=Delimited""");
我想如果
HDR = NO
我移除了标题(即第一行),然后它应该可以工作…奇怪的是它没用。无论如何,现在我不再有例外了。
新问题由此产生:
SQLiteDataAdapter Update method returning 0