文档中的
Simple Preparation
示例(https://www.npgsql.org/doc/prepare.html#simple-preparation)展示了一个在准备命令后设置参数的示例。var cmd = new NpgsqlCommand(...);
cmd.Parameters.Add("param", NpgsqlDbType.Integer);
cmd.Prepare();
// Set parameters
cmd.ExecuteNonQuery();
// And so on
问题
- 参数是如何设置的?
- 如果使用指定了
NpgsqlDbType
的AddWithValue(String, NpgsqlDbType, Object)
方法,是否可以使用AddWithValue
替代Add
-- 文档中说“不支持设置值”? - 如果同一命令中存在多个语句,这将如何工作?
这个答案 (https://stackoverflow.com/a/53268090/10984827) 显示可以在单个字符串中准备多个命令,但不清楚如何创建此 CommandText 字符串。
编辑:我认为我已经接近成功了,但不确定如何创建和执行批量查询字符串。以下是我尝试使用 StringBuilder 构建批量查询的天真方法。这行不通。我该如何正确地做到这一点?
using System;
using System.Collections.Generic;
using System.Text;
using Npgsql;
using NpgsqlTypes;
class Model
{
public int value1 { get; }
public int value2 { get; }
public Model(int value1, int value2)
{
this.value1 = value1;
this.value2 = value2;
}
}
class Program
{
static void Main(string[] args)
{
var dataRows = new List<Model>();
dataRows.Add(new Model(3,2));
dataRows.Add(new Model(27,-10));
dataRows.Add(new Model(11,-11));
var connString = "Host=127.0.0.1;Port=5432;Username=postgres;Database=dbtest1";
// tabletest1
// ----------
// id SERIAL PRIMARY KEY
// , value1 INT NOT NULL
// , value2 INT NOT NULL
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
var cmd = new NpgsqlCommand();
cmd.Connection = conn;
cmd.CommandText = $"INSERT INTO tabletest1 (value1,value2) VALUES (@value1,@value2)";
var parameterValue1 = cmd.Parameters.Add("value1", NpgsqlDbType.Integer);
var parameterValue2 = cmd.Parameters.Add("value2", NpgsqlDbType.Integer);
cmd.Prepare();
var batchCommand = new StringBuilder();
foreach (var d in dataRows)
{
parameterValue1.Value = d.value1;
parameterValue2.Value = d.value2;
batchCommand.Append(cmd.CommandText);
batchCommand.Append(";");
}
Console.WriteLine(batchCommand.ToString());
// conn.ExecuteNonQuery(batchCommand.ToString());
}
}
}
parameterValue1.Value
并调用cmd.ExecuteNonQuery()
。 - Shay Rojansky