Как я могу получить данные из запроса Select как тип данных String из базы данных SQLite? - PullRequest
1 голос
/ 20 февраля 2020

Я использую этот запрос:

string query = "SELECT CAST(FullName AS STRING) FROM Register WHERE ID = 1;

DataTable result = SQLiteDataAccess.MakeQuery(query);

из этой таблицы SQLite. Я использую System.Data и Dapper для доступа к базе данных SQLite. Следующий код используется для доступа к базе данных:

public static DataTable MakeQuery(string query)
{
            SQLiteDataReader result;
            DataTable datatable = new DataTable();

        using (SQLiteConnection cnn = new SQLiteConnection(LoadConnectionString()))
        {
            cnn.Open();

            SQLiteCommand command = new SQLiteCommand(query, cnn);
            result = command.ExecuteReader();
            datatable.Load(result);

            cnn.Close();
        }

        return datatable;
    }

Когда я пытаюсь использовать результат, например, с этим кодом:

        foreach (DataRow record in result.Rows)
        {
            names.Add((string)record["FullName"]);
        }

Я получаю ошибку "System.ArgumentException : 'Столбец' FullName 'не принадлежит таблице.' 'Следующий снимок экрана locals показывает, что имя столбца - "CAST (FullName AS STRING)", а не "FullName", а данные тип int64, а не строка.

Кажется, я использую неправильный синтаксис для приведения типов данных. В SQLite он должен быть другим, потому что он работает на SQL Server. Какой правильный запрос в SQLite? Спасибо

Редактировать: Попробовал предложение в комментарии и получил эту ошибку , показывающую, что тип данных по-прежнему Int64.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Я не вижу смысла для cast ing, так как ваши данные, похоже, уже хранятся в строковом типе данных. Так почему бы просто не сделать:

SELECT FullName FROM Register WHERE ID = 1;

Если по какой-то причине вам необходимо выполнить приведение, то вам нужно псевдоним выражения, чтобы впоследствии вы могли получить к нему доступ из Ваш код:

SELECT CAST(FullName AS TEXT) FullName FROM Register WHERE ID = 1;
1 голос
/ 20 февраля 2020

Если вы не определили имя запрашиваемого столбца, ваша база данных должна go с каким-то типом по умолчанию. Обычно это название вашей колонки. Если вы начнете разбрасывать функции, все станет намного сложнее для такой идеи. В конце концов, вы можете включить в функцию два столбца.

К счастью, это очень легко исправить с помощью ключевого слова AS. Измените ваш запрос на:

string query = "SELECT CAST(FullName AS TEXT) as FullName FROM Register WHERE ID = 1;

Примечание. Я решил использовать FullName здесь, как вы, кажется, хотите. Это нормально, если вы не дублируете имена столбцов в вызове.

Я также изменил тип STRING на TEXT, поскольку это фактический тип sqlite3.

...