C# SQLiteDataAdapter填充异常

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

我试图使用OleDb CSV解析器从CSV文件加载一些数据并将其插入SQLite数据库,但我在使用
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();
    }
}
我尝试了以下方法:

  • 删除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
    并且我删除了标题(即第一行),那么它应该可以工作。。。奇怪的是,它不起作用。无论如何,现在我再也没有例外了


    这里出现了新问题:

    我将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);
    }