Sqlite - Вставка выдает ошибку - Исключительная ошибка приведения - «Недопустимое приведение от DateTime к Int32». - PullRequest
5 голосов
/ 28 февраля 2011
var idParam = new SQLiteParameter("@idParam", SqlDbType.Text) { Value = insertData.ID };
var userIdParam = new SQLiteParameter("@userIdParam", SqlDbType.VarChar) { Value = insertData.Uid };
var applicationNameParam = new SQLiteParameter("@applicationNameParam", SqlDbType.VarChar) { Value = insertData.Application };
var eventNameParam = new SQLiteParameter("@eventNameParam", SqlDbType.VarChar) { Value = insertData.EventName };
var clientTokenParam = new SQLiteParameter("@clientTokenParam", SqlDbType.VarChar) { Value = insertData.ClientToken };
var versionParam = new SQLiteParameter("@versionParam", SqlDbType.VarChar) { Value = insertData.Version };
var dateTimeParam = new SQLiteParameter("@dateTimeParam", SqlDbType.DateTime) { Value = insertData.DateTime };
var dataParam = new SQLiteParameter("@dataParam", SqlDbType.Text) { Value = insertData.Data };

SQLiteCommand command = new SQLiteCommand("INSERT INTO DATAOUT (id, uid, application, eventname, clienttoken, version, datetime, data)" +
    " VALUES ('@idParam','@userIdParam','@applicationNameParam','@eventNameParam','@clientTokenParam','@versionParam',@dateTimeParam,'@dataParam')",Connection);
command.Parameters.Add(idParam);
command.Parameters.Add(userIdParam);
command.Parameters.Add(applicationNameParam);
command.Parameters.Add(eventNameParam);
command.Parameters.Add(clientTokenParam);
command.Parameters.Add(versionParam);
command.Parameters.Add(dateTimeParam);
command.Parameters.Add(dataParam);

command.ExecuteNonQuery();

Я пытаюсь отладить эту ВСТАВКУ, но мне не очень повезло.Почему sqllite пытается привести мое datetime к int ??Схема базы данных ожидает объект datetime.Есть ли способ увидеть текст команды вставки при отправке в БД?

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

public string Uid { get; private set; }
public string Application { get; private set; }
public string EventName { get; private set; }
public string ClientToken { get; private set; }
public string Version { get; private set; }
public DateTime DateTime { get; private set; }
public string Data { get; private set; }

Вотпример вставки:

INSERT INTO DATAOUT (id, uid, приложение, имя события, clienttoken, версия, дата и время, данные) VALUES ('00000000-0000-0000-0000-000000000000', '123abcd ',' My Application ',' ',' Test Client ',' 1.0.0 ',' 1/1/2000 ',' [{"id": "alpha_123", "question": "ronunculations in pre-классические времена или на неаттских диалектах. Для det "," answer ":" nuncitions "}, {" id ":" beta_456 "," question ":" официальные документы, такие как законы an "," answer ":" илиmodif "}, {" id ":" gamma_789 "," question ":" поддерживается или слегка изменен для соответствия греческой фонологии; таким образом,? "," answer ":" iation of Attic "}, {" id ":" delta_098"," question ":" построенное произношение чердака в конце 5-го an "," answer ":" unciation of "}, {" id ":" epsilon_076 "," question ":" разные стилистические варианты, с нисходящим хвостомлибо идти прямо вниз о "," ответ ":" Весь буnch "}, {" id ":" zeta_054 "," question ":" учащенное дыхание, когда начинается слово.Другое диакритическое использование "," answer ":" other dia "}] ')

Последнее значение является строкой JSON. Поле dateTime, по-видимому, является проблемой (7-й параметр). Для примера вышеЯ только что добавил текст «01.01.2011». Код создает вставку с помощью параметров. Параметр datetime имеет действительную дату в отладчике.

Когда я проверяю параметр, «dateTimeParam»Отладчик показывает dbType = Int32. Что с этим?

UPDATE

Удалены кавычки вокруг параметров в операторе вставки. В результате получаются строковые литералы, @paramnameбыть вставленным. Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Я предполагаю, что в запросе нет кавычек около @dateTimeParam, и анализатор запросов предполагает, что это int.

Что меня действительно беспокоит, так это то, что вы вообще окружаете параметры кавычками.

Попробуйте это:

var command = new SQLiteCommand (
   "INSERT INTO DATAOUT (id, uid, application, eventname, clienttoken, version, datetime, data)" +
    " VALUES (@idParam, @userIdParam, @applicationNameParam, @eventNameParam, @clientTokenParam, @versionParam, @dateTimeParam, @dataParam)",
    Connection);

UPDATE

Понятия не имею, что является причиной проблемы. Я пытался имитировать этот код . Это помогает?

var command = new SQLiteCommand (
    "INSERT INTO DATAOUT (id, uid, application, eventname, clienttoken, version, datetime, data)" +
    " VALUES (@idParam,@userIdParam,@applicationNameParam,@eventNameParam,@clientTokenParam,@versionParam,@dateTimeParam,@dataParam)",
    Connection);

command.Parameters.AddWithValue("@idParam", insertData.ID);
command.Parameters.AddWithValue("@userIdParam", insertData.Uid);
command.Parameters.AddWithValue("@applicationNameParam", insertData.Application);
command.Parameters.AddWithValue("@eventNameParam", insertData.EventName);
command.Parameters.AddWithValue("@clientTokenParam", insertData.ClientToken);
command.Parameters.AddWithValue("@versionParam", insertData.Version);
command.Parameters.AddWithValue("@dateTimeParam", insertData.DateTime);
command.Parameters.AddWithValue("@dataParam", insertData.Data);

command.ExecuteNonQuery();
1 голос
/ 19 июля 2013

Моя проблема была вызвана использованием типа данных параметра: System.Data.DbType.DateTime2, и API .NET Sqlite не распознает это перечисление.

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