C# SQLiteDataAdapter填充异常
我试图使用OleDb CSV解析器从CSV文件加载一些数据并将其插入SQLite数据库,但我在使用C# SQLiteDataAdapter填充异常,c#,exception,ado.net,oledb,C#,Exception,Ado.net,Oledb,我试图使用OleDb CSV解析器从CSV文件加载一些数据并将其插入SQLite数据库,但我在使用OleDbAdapter.Fill方法时遇到了一个异常,这令人沮丧: 类型的未处理异常 “System.Data.ConstraintException” 发生在System.Data.dll中 其他信息:未能访问 启用约束。一行或多行 包含违反非null的值, 唯一或外键约束 以下是源代码: public void InsertData(String csvFileName, String tab
OleDbAdapter.Fill
方法时遇到了一个异常,这令人沮丧:
类型的未处理异常
“System.Data.ConstraintException”
发生在System.Data.dll中
其他信息:未能访问
启用约束。一行或多行
包含违反非null的值,
唯一或外键约束
以下是源代码:
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();
}
}
我尝试了以下方法:
我将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
并且我删除了标题(即第一行),那么它应该可以工作。。。奇怪的是,它不起作用。无论如何,现在我再也没有例外了
这里出现了新问题:我将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
并且我删除了标题(即第一行),那么它应该可以工作。。。如果HDR=No
消除异常的唯一方法是通过调用ds.EnforceConstraints=false移除约束代码>
无论如何,现在我再也没有例外了。如果有人能解释为什么会发生这种情况,那么请告诉我。第一件事:在传输结构(如数据集)上放置键和约束是个坏主意
使用事务并让目标db抛出(如果需要)
第二:您是否检查了ds以确保csv已加载?VS内置了一个数据集调试可视化工具-只需在加载ds后设置一个断点,并将鼠标悬停在变量名称上,单击小向下箭头并选择适当的可视化工具
第三:我不认为您正在生成insert命令。在调用update之前,请检查InsertCommand.CommandText
var cmdText = sqliteAdapter.InsertCommand.CommandText;
我想你会发现它是空的
这是最终被调用的SQLiteDataAdapter的源。请注意,未使用命令生成器。您需要在SQLiteDataAdapter上显式设置InserCommand属性,也许可以使用SQLiteCommandBuilder
public SQLiteDataAdapter(string commandText, SQLiteConnection connection)
{
this.SelectCommand = new SQLiteCommand(commandText, connection);
}
嗨,天空,谢谢你的回答。。。当你说我在数据集上放置键和约束时,我不确定我是否理解你的意思?数据集是根据图片中显示的表格自动生成的。所以CSV被加载了,现在我从CSV文件中加载了83行,但是当我尝试更新数据库时,它没有更新任何行(即sqliteAdapter.update(…)返回0)。我已经解决了这个问题的问题,但是我会给你点分,因为你是唯一一个回答这个问题的人:)。。。此外,我对您关于关键和约束的评论很感兴趣。仅供参考:我写了另一个关于这个特定问题的问题@lirik-更新了答案,很明显我之前错过了一个可能性。另外-另一个问题应该结束,它是相同的。我把相同的部分转发给了另一个问题。那么,你刚才说的约束和关键是什么?可能与?约翰有关?我把它分成了一个单独的问题,因为我不想把这个问题弄得太混乱。
public SQLiteDataAdapter(string commandText, SQLiteConnection connection)
{
this.SelectCommand = new SQLiteCommand(commandText, connection);
}