获取上次输入的记录postgres的{id}值

时间:2016-02-15 15:03:01

标签: c# postgresql

阅读关于类似问题的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());
                }  

2 个答案:

答案 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,则有助于防止意外的字符串混搭。

对于它的价值,您使用了绑定变量作为图像,这是完全合适的,但是对于所有值的绑定变量总是更可取的通过而不是文字。

绑定变量:

  1. 使用C#和您的RDBMS
  2. 之间的数据类型管理所有恶意
  3. 如果您的字符串包含有趣的字符(即单引号会导致SQL无法编译),则消除并发症
  4. 无需引用' SQL中的非数字值
  5. 保护您的代码免受SQL注入
  6. 对数据库更友善,因为它一次编译SQL并且可能使用不同的值反复执行它
  7. 以下是您转换为使用所有绑定变量的代码:

    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();