PostgreSQL - 错误:列“ID”类型为uuid,但表达式类型为整数

PostgreSQL - 错误:列“ID”类型为uuid,但表达式类型为整数

问题描述:

我试图使用C#.NET将一些数据写入PostgreSQL数据库,通过ODBC驱动程序Driver={PostgreSQL ANSI(x64)}。此驱动程序是否有任何已知的数据类型匹配问题?PostgreSQL - 错误:列“ID”类型为uuid,但表达式类型为整数

我想发送一个GUID和DateTime字段。数据库列键入为uuidtimestamp without timezone。当我尝试发送任一个时,我收到错误。当我送GUID到uuid字段中,我回到这个错误: ERROR: column "id" is of type uuid but expression is of type integer

对于日期时间,我得到如下:ERROR: column "createdate" is of type timestamp without time zone but expression is of type integer;

下面是一些短代码,说明了这个问题。这种失败:

 var p = new OdbcParameter 
     { 
      ParameterName = "@1", 
      DbType = DbType.Guid, // I also tried OdbcType = OdbcType.UniqueIdentifier 
      Value = Guid.NewGuid() 
     }; 
     var sql = "INSERT INTO mytable (id) VALUES (@1)"; 
     using(var conn = new OdbcConnection(_connectionString)) 
     { 
      conn.Open(); 
      using (var command = new OdbcCommand(sql)) 
      { 
       command.CommandType = CommandType.Text; 
       command.Parameters.Add(p); 
       command.Connection = conn; 
       command.ExecuteNonQuery(); 
      } 
     } 

作为一个全面的检查,我与SQL注入尝试过了,它的工作原理:

 var sql = "INSERT INTO mytable (id) VALUES ('" + Guid.NewGuid().ToString("N") + "')"; 
     using (var conn = new OdbcConnection(_connectionString)) 
     { 
      conn.Open(); 
      using (var command = new OdbcCommand(sql)) 
      { 
       command.CommandType = CommandType.Text; 
       command.Connection = conn; 
       command.ExecuteNonQuery(); 
      } 
     } 

如果我涉及的日期时间字段,我得到了相同的结果,不同的错误信息。

ODBC驱动器不匹配的东西?

UPDATE

由于下面的评论,这似乎工作。我将参数命名为“x”并用于? (问号)在INSERT语句中。看起来参数是位置的。

var p = new OdbcParameter 
    { 
     ParameterName = "x", 
     DbType = DbType.Guid, 
     Value = Guid.NewGuid() 
    }; 
    var sql = "INSERT INTO mytable (id) VALUES (?)"; 
    using(var conn = new OdbcConnection(_connectionString)) 
    { 
     conn.Open(); 
     using (var command = new OdbcCommand(sql)) 
     { 
      command.CommandType = CommandType.Text; 
      command.Parameters.Add(p); 
      command.Connection = conn; 
      command.ExecuteNonQuery(); 
     } 
    } 

我不认为@1是DB参数的正确名称。改变它并尝试。 我试用了sqlfiddle与PostgreSQL9.3 ...它不认为@1作为参数,认为它是一个整数。

我有这样的错误:

ERROR: column "data" is of type uuid but expression is of type integer Hint: You will need to rewrite or cast the expression. Position: 36

+0

上,我应该尝试什么有什么建议?我刚刚尝试过'@ x'和':myparam'。对于@x,它表示x不是列名,对于:myparam,它不喜欢冒号。 – 010110110101

+0

你可以试试$ x或$ 1吗?我只是在Google上搜索......似乎有点混乱:P – SamGhatak

+1

确定问号?在INSERT语句中工作,像在x中的随机单词在Parameter对象中工作。然而,由于它无论如何似乎都是位置,名称并不重要。 – 010110110101