2011-12-29 261 views
5

我正在研究将电子表格中的数据存储到Postgresql数据库的应用程序。我熟悉C#和.Net,但对Postgresql不太好。我在将DateTime值存储到TimeStamp列时遇到问题;我不断收到错误消息:无法将参数值从日期时间转换为字节[]。任何意见,将不胜感激。将C#datetime存储到postgresql TimeStamp

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(); 

回答

1

你在这里有几个解决方案......我将假设组织者表具有created_date和last_update作为时间戳字段,是否正确?最愚蠢的回答是将它们更改为varchar字段。嘿嘿。

2个更好的答案......我猜想这是一个格式错误的DateTime.Now不格式的pgsql返回又想:

因为你只是给它当前的时间戳

  • 您可以定义您的表,将这些列默认设置为now(),然后不将值传递给此列,在插入时,该表只会使用now()的缺省值填充。

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

其次潜力是格式化的日期到什么PG预计为INSERT语句的一部分......我需要知道什么DateTime.Now给出的值进行格式化,以什么皮克希望看到。这可能是一些字符串操作...

2

我没有一个PostgreSQL数据库方便来进行测试,但我相信你看到这一点,因为OdbcType.Timestamp实际上是一个字节数组,而不是一个时间和日期。从MSDN

Timestamp: A stream of binary data (SQL_BINARY). This maps to an Array of type Byte.

这可能是因为timestamp数据类型,在SQL Server,是

a data type that exposes automatically generated, unique binary numbers within a database. timestamp is generally used as a mechanism for version-stamping table rows.

我会尝试使用OdbcType.DateTime,这似乎映射到概念背后PostgreSQL'stimestamp

编辑:

Here是一种有用的交它总结PostgreSQL和.NET之间的映射。

+0

解决该错误,但会产生另一个错误 - 错误:类型时间戳的无效输入语法:“@created”;执行查询时出错。 – JediusX 2011-12-29 19:41:15