[英]PostgreSQL - ERROR: column “id” is of type uuid but expression is of type integer
我正在嘗試通過 ODBC 驅動Driver={PostgreSQL ANSI(x64)}
使用 C# .NET 將一些數據寫入 PostgreSQL 數據庫。 此驅動程序是否有任何已知的數據類型匹配問題?
我正在嘗試發送 GUID 和 DateTime 字段。 數據庫列被輸入為一個uuid
和一個timestamp without timezone
的timestamp 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 驅動器是否不匹配?
更新
感謝下面的評論,這似乎有效。 我將參數命名為“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
識別為參數,而是將其視為整數。
我在那里遇到了這個錯誤:
錯誤:“數據”列的類型為 uuid,但表達式的類型為整數 提示:您需要重寫或轉換表達式。 職位:36
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.