【问题标题】:SQLiteDataAdapter Fill exceptionSQLiteDataAdapter 填充异常
【发布时间】: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

我尝试了以下方法:

  1. 删除 CSV 文件中的第一行,以免将其与真实数据混淆。
  2. 将 TRUE/FALSE 实时标志更改为 1/0。
  3. 我已经同时尝试了 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

【问题讨论】:

标签: c# exception ado.net oledb


【解决方案1】:

我将 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 消除异常的唯一方法是如果我通过调用@ 删除约束987654326@

无论如何,现在我不再遇到异常。如果有人能解释为什么会发生这种情况,请告诉。

【讨论】:

    【解决方案2】:

    第一件事:IMO 在数据集等传输结构上放置键和约束是一个坏主意。

    使用事务并让目标数据库根据需要抛出。

    第二:您是否检查了 ds 以确保 csv 正在加载? VS 内置了一个数据集调试可视化工具 - 只需在 ds 加载后设置一个断点并将鼠标悬停在变量名称上,单击小向下箭头并选择适当的可视化工具。

    第三:我不认为您正在生成插入命令。就在您调用更新之前,请检查 InsertCommand.CommandText..

    var cmdText = sqliteAdapter.InsertCommand.CommandText;
    

    我想你会发现它是空的。

    这是最终被调用的 SQLiteDataAdapter ctor 的来源。请注意,没有使用命令生成器。您需要在 SQLiteDataAdapter 上显式设置 InserCommand 属性,或许可以使用 SQLiteCommandBuilder?

    public SQLiteDataAdapter(string commandText, SQLiteConnection connection)
    {
        this.SelectCommand = new SQLiteCommand(commandText, connection);
    }
    

    【讨论】:

    • 嗨,天空,感谢您的回答...当您说我在我的数据集上放置键和约束时,我不确定我是否理解您的意思?数据集是根据图片中显示的表格自动生成的。所以 CSV 正在加载,现在我从 CSV 文件加载 83 行,但是当我尝试更新数据库时,它没有更新任何行(即 sqliteAdapter.Update(...) 返回 0)。
    • 我已经发现了这个问题的问题,但我会给你分数,因为你是唯一一个回答它的人:)......另外,我对你的关于键和约束的评论。仅供参考:我针对该特定问题写了另一个问题stackoverflow.com/questions/2711021/…
    • @lirik - 更新了我之前错过的明显可能性的答案。另外 - 应该关闭另一个问题,它是一样的。
    • 我将相同的部分转发给另一个问题。那么你对约束和键有什么看法?
    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多