2016-02-29 137 views
2

我試圖使用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(); 
     } 
    } 

回答

0

我不認爲@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

相關問題