代码之家  ›  专栏  ›  技术社区  ›  Kiril

sqlitedataadapter填充异常

  •  0
  • Kiril  · 技术社区  · 14 年前

    我试图使用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
    

    我试过以下方法:

    1. 删除csv文件中的第一行,这样就不会把它与实际数据混淆。
    2. 将真/假实时标志更改为1/0。
    3. 我尝试了1和2(即删除第一行并更改标志)。

    这些都没有帮助…

    一个限制是tagid应该是唯一的。下面是设计视图中的表:

    Tags Table

    有谁能帮我弄清楚这里有什么问题吗?

    更新:
    我更改了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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Sky Sanders    14 年前

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

    使用事务,如果需要,让目标数据库抛出。

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

    第三:我不认为您正在生成insert命令。在调用update之前,检查insertcommand.commandText..

    var cmdText = sqliteAdapter.InsertCommand.CommandText;
    

    我想你会发现它是空的。

    这是最终被调用的sqlitedataadapter ctor的源。请注意,没有使用命令生成器。您需要显式地在sqlitedataadapter上设置insercommand属性,也许可以使用sqlitecommandbuilder?

    public SQLiteDataAdapter(string commandText, SQLiteConnection connection)
    {
        this.SelectCommand = new SQLiteCommand(commandText, connection);
    }
    
        2
  •  0
  •   Kiril    14 年前

    我更改了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=否 我移除了标题(即第一行),然后它应该可以工作…只有当 HDR = NO 如果我通过调用 ds.EnforceConstraints = false;

    无论如何,现在我不再有例外了。如果有人能解释为什么会发生这种事,那么请告诉我。