将C#的datetime存储到PostgreSQL的时间戳中

8

我正在开发一个将电子表格中的数据存储到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
我没有现成的PostgreSQL数据库进行测试,但我认为您看到这个问题是因为OdbcType.Timestamp实际上是一个字节数组,而不是时间和日期。来自MSDN

Timestamp:二进制数据流(SQL_BINARY)。这映射到Byte类型的数组。

这可能是因为在SQL Server中,timestamp数据类型实际上是:

一种数据类型,在数据库中公开自动生成的唯一二进制数。 时间戳通常用作版本标记表行的机制。

我建议尝试使用OdbcType.DateTime,它似乎与PostgreSQLtimestamp背后的概念相对应。
编辑:
这里有一篇有用的文章,总结了PostgreSQL和.NET之间的映射关系。点击此处阅读。

解决了那个错误,但是又产生了另一个错误 - 错误:类型时间戳的输入语法无效:“@created”;执行查询时出错。 - JediusX

1

在这里你有几个解决方案...我假设组织者表具有created_date和last_update字段作为时间戳字段,对吗?最傻的答案是将它们更改为varchar字段。呵。

有两个更好的答案...我假设这是一个格式错误,DateTime.Now不返回pgsql想要的格式:

既然你只是给出当前的时间戳

  • 你可以定义你的表默认这些列为now(),然后不传递值到这个列,在插入时,表会自动填充默认的now()值。

  • 不要定义变量DateTime.Now然后再传递变量,而是直接发送postgres now(),它会以正确的格式填充它。

第二个潜在的方法是将日期格式化为PG期望的插入语句的一部分...我需要知道DateTime.Now给出的值以将其格式化为pg想要看到的形式。这可能需要进行一些字符串操作...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接