阅读关于类似问题的SO的答案,并尝试了一些但没有快乐。使用PostGresql我想在表格中添加一条记录,并将值记录在' id'该记录的一栏。
尝试了currval,并且返回...在Id = int.Parse(sqlcmd.ExecuteScalar().ToString());
崩溃任何关于我做错的想法?
try
{
StringBuilder command = new StringBuilder();
command.Append("resultId BIGINT");
command.Append("INSERT INTO image_table (\"id\", \"table_name\", \"file_name\", \"image_data\", \"creation_date\") ");
command.Append("VALUES ('" + ID + "', '" + tableName + "', '" + fileName + "', @Image, (SELECT LOCALTIMESTAMP))");
command.Append("RETURNING id INTO resultId;");
//command.Append("SELECT currval('id');");
//command.Append("RETURNING id;");
//command.Append("SELECT @@IDENTITY");
using (NpgsqlCommand sqlcmd = CreateTextCommand(command.ToString(), connectionDataString))
{
sqlcmd.Parameters.AddWithValue("@Image", imageAsBytes);
Id = int.Parse(sqlcmd.ExecuteScalar().ToString());
}
}
catch (Exception ex)
{
throw (ex);
}
finally
{
CloseConnection();
}
return Id;
}
请参阅从以下位置获取最后一个插入ID: http://www.postgresqltutorial.com/postgresql-insert/
这不是我正在做的事情吗?
更新我使用
获得了它K command.Append("INSERT INTO image_table (\"id\", \"table_name\", \"file_name\", \"image_data\", \"creation_date\") ");
command.Append("VALUES ('" + ID + "', '" + tableName + "', '" + fileName + "', @Image, (SELECT LOCALTIMESTAMP))");
command.Append("RETURNING id;");
using (NpgsqlCommand sqlcmd = CreateTextCommand(command.ToString(), connectionDataString))
{
sqlcmd.Parameters.AddWithValue("@Image", imageAsBytes);
Id = int.Parse(sqlcmd.ExecuteScalar().ToString());
}
答案 0 :(得分:0)
在Postgres中,我通常将其称为:
WITH inserts as (
INSERT INTO image_table (feature_id, table_name, file_name, image_data, creation_date)
VALUES (. . .)
RETURNING *
)
SELECT id
FROM inserts;
然后,您可以像在任何SELECT
查询中一样获取值。
答案 1 :(得分:0)
您似乎已经找到了解决方案,但为了澄清,似乎有一个问题:
command.Append("resultId BIGINT");
command.Append("INSERT INTO image_table ... ");
这是一个直接问题,因为使用Append,它实际上将两个字符串连接起来:
resultId BIGINTINSERT INTO image_table ...
^^
注意" BIGINT"之间缺少空格。和" INSERT。"如果您将来使用AppendLine
代替Append
,则有助于防止意外的字符串混搭。
对于它的价值,您使用了绑定变量作为图像,这是完全合适的,但是对于所有值的绑定变量总是更可取的通过而不是文字。
绑定变量:
以下是您转换为使用所有绑定变量的代码:
NpgsqlConnection conn = new NpgsqlConnection(connectionDataString);
conn.Open();
StringBuilder command = new StringBuilder();
command.Append("INSERT INTO image_table ");
command.Append("\"id\",\"table_name\",\"file_name\",\"image_data\",\"creation_date\") ");
command.Append("VALUES (:ID, :TABLENAME, :FILENAME, :IMAGE, current_timestamp) ");
command.Append("RETURNING id");
NpgsqlCommand cmd = new NpgsqlCommand(command.ToString(), conn);
cmd.Parameters.AddWithValue("ID", ID);
cmd.Parameters.AddWithValue("TABLENAME", tableName);
cmd.Parameters.AddWithValue("FILENAME", fileName);
cmd.Parameters.AddWithValue("IMAGE", imageAsBytes);
int Id = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();