stevenlam505 Ответов: 1

Все значения, взятые из моей базы данных sqlite, которые добавляются в мои списки, являются просто "sqlitedatareader"


Я пытаюсь создать скрипт, который берет всю информацию из базы данных SQLite и сохраняет ее в списках, которые хранятся внутри словарей. Я могу добавлять в свои списки, хранящиеся внутри словарей, однако все мои сохраненные значения просто отображаются как " System.Data.SQLite.SQLiteDataReader" вместо фактических значений внутри строк.

Переменные:
tableNames = список имен всех таблиц в базе данных
allTables = словарь всех таблиц, в которых я буду хранить данные в виде списков
table = строка, представляющая имя конкретной таблицы


Ссылка на картинку кода и результаты[^]

Любая помощь или указатели будут очень признательны!

Что я уже пробовал:

public static List<string> getSQLiteData(string liteConString, IList<string> tableNames)
        {
            SQLiteConnection liteCon = new SQLiteConnection(liteConString);
            liteCon.Open();

            /// Creates a dictionary where the "Key" is the name of the table
            /// and the "Values" are lists that represent the values in each table
            IDictionary<string, List<string>> allTables = new Dictionary<string, List<string>>();
            foreach (string table in tableNames)
            {
                string selectQuery = "SELECT * FROM " + table;
                allTables.Add(table, new List<string>());

                SQLiteCommand cmd = new SQLiteCommand(selectQuery, liteCon);
                SQLiteDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    allTables[table].Add(reader.ToString());
                }
                reader.Close();
            }

            return null;
        }

Я не совсем уверен, что не так с этим кусочком кода и почему он не захватывает фактическую информацию. Я очень новичок в C# и SQL, поэтому, пожалуйста, простите любые вопиющие ошибки.

EDIT: теперь я попробовал SQLiteDataAdapter вместо SQLiteDataReader и хранить результаты в таблицах данных вместо списков. Однако теперь я сталкиваюсь с ошибкой, когда DataTable не имеет фактических значений таблиц SQLite, а скорее имеет значения своих "свойств". Это и есть код:

IDictionary<string, DataTable> allTables = new Dictionary<string, DataTable>();
foreach (string table in tableNames)
{
    string selectQuery = "SELECT * FROM " + table;
    allTables.Add(table, new DataTable());

    SQLiteCommand cmd = new SQLiteCommand(selectQuery, liteCon);
    SQLiteDataAdapter sqliteDAP = new SQLiteDataAdapter(cmd);
    sqliteDAP.Fill(allTables[table]);
}

Ссылка на результаты этого кода[^]

stevenlam505

Вот еще одна картина того, как на самом деле выглядит таблица: https://imgur.com/a/BkMoLG4

1 Ответов

Рейтинг:
1

OriginalGriff

Когда вы звоните ToString в любом случае система смотрит на экземпляр, который вы вызываете, и возвращается через цепочку наследования, чтобы найти "ближайшую" реализацию. Если вашего класса, реализующего ToString затем будет использоваться метод taht - но если он этого не делает, то проверяется класс, из которого вы непосредственно производны, и так далее. Если он не может найти явную реализацию к тому времени, когда он достигнет object класс (и помните, что все происходит от object в .NET), то используется реализация по умолчанию, которая возвращает полное имя исходного типа.

Так что когда вы это сделаете:

allTables[table].Add(reader.ToString());

система проверяет, если SQLiteDataReader инвентарь ToString - а это не так. Так что он пытается DbDataReader который SQLiteDataReader является производным от. Никакой радости там нет, так что обратно она идет - и быстро кончается на object, и использует реализацию по умолчанию, которая всегда возвращает "System.Data.SQLite.SQLiteDataReader"

А почему бы и нет SQLiteDataReader осуществлять ToString? Потому что он понятия не имеет, какие данные вы делаете и не хотите получать, или как вы этого хотите: он даже не знает, что содержат столбцы, кроме самых простых типов данных SQL, которые в основном не очень полезны!

Если вы хотите добавить список строк в словарную статью из DataReader, вам придется создать коллекцию и заполнить ее самостоятельно:
allTables[table].Add(reader["myColumn1"].ToString());
allTables[table].Add(reader["myColumn2"].ToString());
Но даже тогда это, вероятно, не будет делать то, что вы на самом деле хотите, так как каждый столбец из каждой строки будет входить в одну и ту же словарную статью.

Я думаю, что вы хотите более тщательно подумать о том, что именно вы пытаетесь сделать с этим кодом (и это игнорирует то, что вы все равно отбрасываете всю информацию в конце метода).

И кстати: это считается плохой идеей для использования SELECT * FROM ... - вы всегда должны перечислять названия столбцов, которые вас интересуют, а не просто говорить "все они".


stevenlam505

То, что я пытаюсь сделать в своем коде, - это взять всю информацию из целой базы данных и сохранить каждую отдельную таблицу в своей собственной переменной. Теперь я пытаюсь использовать SQLiteDataAdapter вместо DataReader и использовать DataTables вместо списков, но теперь я сталкиваюсь с ошибкой, когда каждый DataTable представляет не данные из таблицы, а скорее свойства таблицы. Я обновил исходный пост с дополнительной информацией.