【发布时间】:2011-02-12 05:40:38
【问题描述】:
我正在尝试使用 OleDb CSV 解析器从 CSV 文件加载一些数据并将其插入到 SQLite 数据库中,但 OleDbAdapter.Fill 方法出现异常,这令人沮丧:
未处理的类型异常 'System.Data.ConstraintException' 发生在 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 文件中的第一行,以免将其与真实数据混淆。
- 将 TRUE/FALSE 实时标志更改为 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 并且我删除了标题(即第一行),那么它应该可以工作......奇怪的是它没有工作。无论如何,现在我不再遇到异常了。
【问题讨论】:
-
@John 我把它分成一个单独的问题,因为我不想把这个问题弄得太乱。
标签: c# exception ado.net oledb