获取上次输入的记录帖子的 ID 值
本文关键字:ID 记录 输入 获取 | 更新日期: 2023-09-27 18:34:36
阅读SO上关于类似Q的答案,并尝试了一些,但没有快乐。使用 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());
}
在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
查询中一样获取该值。
您似乎已经找到了解决方案,但要澄清一下,一个问题似乎是这样的:
command.Append("resultId BIGINT");
command.Append("INSERT INTO image_table ... ");
这是一个直接的问题,因为使用 Append,它实际上将两个字符串连接起来:
resultId BIGINTINSERT INTO image_table ...
^^
请注意,"BIGINT"和"INSERT"之间缺少空格。 如果您使用AppendLine
而不是Append
用于将来的工作,它可以帮助防止意外的字符串捣碎。
对于它的价值,您对图像使用了绑定变量,这是完全合适的,但始终最好对传递的所有值使用绑定变量而不是文本。
绑定变量:
- 使用 C# 和 RDBMS 之间的数据类型管理所有棘手的问题
- 如果您的字符串包含有趣的字符(即导致 SQL 无法编译的单引号
- 无需在 SQL 中"引用"非数值
- 保护代码免受 SQL 注入的影响
- 对数据库更友好,因为它编译 SQL 一次,并且可能会使用不同的值一遍又一遍地执行它
下面是转换为使用所有绑定变量的代码:
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();