Чрезвычайно простой запрос SQLite не возвращает ожидаемого - PullRequest
3 голосов
/ 19 декабря 2010

Ниже я предоставляю свою схему базы данных, данные базы данных, которые в настоящее время вставлены (это только одна запись), и код, который я выполняю. Это очень простая настройка, но вместо возврата одной записи в базе данных она ничего не возвращает. У кого-нибудь есть идеи, почему? Я нахожусь в конце моего остроумия здесь ...

Таблица: Субподрядчик

Столбцы: перечислены ниже в формате (тип имени).

ID guid, 
BusinessName varchar(50), 
Address varchar(200), 
City varchar(50), 
State varchar(50), 
ZipCode varchar(50), 
Contact varchar(50), 
Phone varchar(50), 
Fax varchar(50), 
Email varchar(200), 
GLOPolicy bit, 
GLOLimit bigint, 
GLOExpiration datetime, 
ALPolicy bit, 
ALLimit bigint, 
ALExpiration datetime, 
WCPolicy bit, 
WCLimit bigint, 
WCExpiration datetime, 
ULPolicy bit, 
ULLimit bigint, 
ULExpiration datetime, 
Notes varchar(15000)

=====

У меня есть одна запись в моей базе данных следующим образом.

ID "7b143c19-ad66-46ad-b587-db0bee98cf1e"
BusinessName "1"
Address "1"
City "1"
State "1"
ZipCode "1"
Contact NULL
Phone NULL
Fax NULL 
Email NULL
GLOPolicy False (0) 
GLOLimit NULL 
GLOExpiration NULL
ALPolicy False (0)
ALLimit NULL
ALExpiration NULL
WCPolicy False (0)
WCLimit NULL
WCExpiration NULL
ULPolicy False (0) 
ULLimit NULL
ULExpiration NULL
Notes NULL

===== * Я пытаюсь выполнить следующий запрос, и он ничего не возвращает, когда он, очевидно, должен вернуть единственную запись, показанную выше. *

String ID = "7b143c19-ad66-46ad-b587-db0bee98cf1e";
DataTable dt = sqliteQuery.selectFromDatabase("*", "WHERE ID = '" + ID + "'");

И код для вышеуказанного метода ...

    public DataTable selectFromDatabase(String column, String filter)
    {
        string SQL = "SELECT " + column + " FROM SUBCONTRACTOR " + filter;
        SQLiteCommand cmd = new SQLiteCommand(SQL);
        cmd.Connection = connection;
        SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
        DataSet ds = new DataSet();
        try
        {
            da.Fill(ds);
            DataTable dt = ds.Tables[0];
            return dt;
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
            return null;
        }
        finally
        {
            cmd.Dispose();
            connection.Close();
        }
    }

1 Ответ

4 голосов
/ 19 декабря 2010

Похоже, SqLite изначально не поддерживает тип GUID.Он поддерживается оболочками и плагинами, но я думаю, что вы испытываете некоторое сопротивление между использованием типа.Вам, вероятно, лучше поменять его на тип TEXT.Ваш предикат будет работать.

РЕДАКТИРОВАТЬ

Чтобы создать новое значение GUID для вставки в строку в виде ключа, просто выполните:

Guid.NewGuid().ToString();

Кроме того, я обнаружил следующую информацию :

GUID - это не (!) Собственный тип данных SQLite, а дополнение, предоставляемое оболочкой Роберта.В строке подключения вы можете указать «BinaryGUID = Да | Нет», по умолчанию «Да».Когда «BinaryGUID = Yes», ​​GUID сохраняется, занимая 16 байт памяти.Теперь это зависит от того, распознает ли «Эксперт SQLite» GUID типа данных.Если это так, вы должны посмотреть в его документации, как он обрабатывается.Если нет, то он, вероятно, рассматривается как текст (вероятно, с недопустимыми символьными данными).Эта проблема будет возникать снова при смене редактора или оболочки SQLite.

Когда «BinaryGUID = No», GUID сохраняется в виде текста, занимающего 32-38 байт (я не знаю, являются ли символы минус ифигурные скобки {} сохранены, вы должны проверить).Когда хранение не является большой проблемой, я бы рекомендовал использовать эту форму.После этого у вас не должно возникнуть проблем с используемой оболочкой или редактором БД, что сэкономит много времени и усилий.

Похоже, что проблема связана с самим типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...