获取上次输入的记录帖子的 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());
                }  

获取上次输入的记录帖子的 ID 值

在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用于将来的工作,它可以帮助防止意外的字符串捣碎。

对于它的价值,您对图像使用了绑定变量,这是完全合适的,但始终最好对传递的所有值使用绑定变量而不是文本。

绑定变量:

  1. 使用 C# 和 RDBMS 之间的数据类型管理所有棘手的问题
  2. 如果您的字符串包含有趣的字符(即导致 SQL 无法编译的单引号
  3. 无需在 SQL 中"引用"非数值
  4. 保护代码免受 SQL 注入的影响
  5. 对数据库更友好,因为它编译 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();