SQLiteDataAdapter Заполнить исключение - PullRequest
0 голосов
/ 26 апреля 2010

Я пытаюсь использовать анализатор 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. Изменение флага ИСТИНА / ЛОЖЬ в реальном времени на 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, возвращающий 0

Ответы [ 2 ]

1 голос
/ 26 апреля 2010

Первое: IMO, использующий ключи и ограничения в транспортной структуре, такой как ваш набор данных, является плохой идеей.

Используйте транзакцию и дайте целевой БД, если захотите.

Второе: вы проверяли ds, чтобы убедиться, что CSV загружается? В VS встроен визуализатор отладки набора данных - просто установите точку останова после загрузки ds и наведите курсор на имя переменной, щелкните маленькую стрелку вниз и выберите соответствующий визуализатор.

В-третьих: я не думаю, что вы генерируете команду вставки. Непосредственно перед вызовом обновления проверьте InsertCommand.CommandText ..

var cmdText = sqliteAdapter.InsertCommand.CommandText;

Я думаю, вы обнаружите, что он пуст.

Это источник кода SQLiteDataAdapter, который в конечном итоге вызывается. Обратите внимание, что компоновщик команд не используется. Вам необходимо явно установить свойство InserCommand в SQLiteDataAdapter, возможно, с помощью SQLiteCommandBuilder?

public SQLiteDataAdapter(string commandText, SQLiteConnection connection)
{
    this.SelectCommand = new SQLiteCommand(commandText, connection);
}
0 голосов
/ 26 апреля 2010

Я изменил свойство 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;

В любом случае, теперь я больше не получаю исключение. Если кто-нибудь может объяснить, почему это происходит, то, пожалуйста, расскажите.

...