Хранение C # datetime в postgresql TimeStamp - PullRequest
6 голосов
/ 29 декабря 2011

Я работаю над приложением, которое хранит данные в электронной таблице в базе данных Postgresql. Я знаком с C # и .Net, но не очень хорошо с Postgresql. У меня проблемы с сохранением значения DateTime в столбце TimeStamp; Я получаю сообщение об ошибке: Не удалось преобразовать значение параметра из DateTime в Byte []. Любой совет будет оценен.

string query = "INSERT INTO organizer(organizer_name, contact_name, phone, alt_phone, created_date, last_update) " +
                "VALUES('@name', '@contactname', '@phone', '@altphone', '@created', '@updated')";

            OdbcCommand cmd = new OdbcCommand(query, con);
            cmd.Parameters.Add("@name", OdbcType.VarChar);
            cmd.Parameters["@name"].Value = org.Name;

            cmd.Parameters.Add("@contactname", OdbcType.VarChar);
            cmd.Parameters["@contactname"].Value = org.ContactName;

            cmd.Parameters.Add("@phone", OdbcType.VarChar);
            cmd.Parameters["@phone"].Value = org.Phone;

            cmd.Parameters.Add("@altphone", OdbcType.VarChar);
            cmd.Parameters["@altphone"].Value = org.AltPhone;

            cmd.Parameters.Add("@created", OdbcType.Timestamp).Value = DateTime.Now;

            cmd.Parameters.Add("@updated", OdbcType.Timestamp).Value = DateTime.Now;

            con.Open();
            cmd.ExecuteNonQuery();

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011

У меня нет базы данных PostgreSQL, удобной для тестирования, но я полагаю, что вы видите это, потому что OdbcType.Timestamp на самом деле является байтовым массивом, а не временем и датой. От MSDN :

Метка времени: поток двоичных данных (SQL_BINARY). Это соответствует массиву типа Byte.

Вероятно, это связано с тем, что тип данных timestamp в SQL Server равен

тип данных, который предоставляет автоматически генерируемые уникальные двоичные числа в базе данных. временная метка, как правило, используется в качестве механизма для строк таблицы штампов версий.

Я бы попробовал использовать OdbcType.DateTime, который, похоже, соответствует концепции PostgreSQL timestamp.

EDIT:

Здесь - полезный пост, в котором обобщены сопоставления между PostgreSQL и .NET.

1 голос
/ 30 декабря 2011

У вас есть несколько решений здесь ... Я собираюсь предположить, что в таблице органайзера есть поля create_date и last_update как метки времени, верно?Самый глупый ответ - поменять их на поля varchar.хех.

2 лучших ответа ... Я предполагаю, что это ошибка форматирования, когда DateTime.Now не возвращается в формате, который хочет pgsql:

Так как вы просто даете емутекущая временная метка

  • вы можете определить в своей таблице значения по умолчанию для этих столбцов в now (), а затем не передавать значения в этот столбец, при вставке таблица просто заполнит ее значением по умолчанию now().

  • вместо определения переменной для DateTime.Now, а затем передачи переменной, просто отправьте postgres now (), и он будет заполнен в формате, который кажется правильным.

И второй потенциал - это отформатировать дату в то, что ожидает PG как часть оператора вставки ... Мне нужно знать, что дает DateTime.Now для значения, чтобы отформатировать его в чемпг хочет увидеть.Это может быть немного манипуляций со строками ...

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