带有 ADO.NET 的 PostgreSQL 参数化插入

PostgreSQL Parameterized Insert with ADO.NET

我正在将 NpgSQL 与 PostgreSQL 和 ADO.NET 一起使用。请原谅这个问题的简单性,因为我这周才开始使用 PostgreSQL 和 NpgSQL。

像这样的东西很好用:

[Test]
public void InsertNoParameters()
{
    NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password");
    conn.Open();

    IDbCommand command = conn.CreateCommand();
    string sql = "INSERT INTO Customers (FirstName,LastName) VALUES ('Test','Tube')";
    command.CommandText = sql;
    command.ExecuteNonQuery();
    conn.Close();
}

当我输入参数时,我收到错误消息: Npgsql.NpgsqlException:错误:42703:列“_firstname”不存在

[Test]
public void InsertWithParameters()
{
NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password");
conn.Open();

IDbCommand command = conn.CreateCommand();
string sql = "INSERT INTO Customers (FirstName,LastName) VALUES (_FirstName,_LastName)";
command.CommandText = sql;

var parameter = command.CreateParameter();
parameter.ParameterName = "_FirstName";
parameter.Value = "Test";
command.Parameters.Add(parameter);

parameter = command.CreateParameter();
parameter.ParameterName = "_LastName";
parameter.Value = "Tube";
command.Parameters.Add(parameter);

command.ExecuteNonQuery();
conn.Close();
}

评论中的回答正确:

  1. Npgsql 不支持 _ 作为参数占位符表示法。您应该使用 @ 或 :(所以 @FirstName 或 :FirstName,而不是 _FirstName)。
  2. PostgreSQL 会自动将您的 table 和列名小写,除非它们被双引号括起来。对所有内容使用小写名称(更简单)或在 SQL 查询中引用标识符。

因此您的代码应该大致如下所示:

IDbCommand command = conn.CreateCommand();
string sql = "INSERT INTO Customers (first_name, last_name) VALUES (@FirstName,@LastName)";
command.CommandText = sql;

var parameter = command.CreateParameter();
parameter.ParameterName = "FirstName";
parameter.Value = "Test";
command.Parameters.Add(parameter);