我正在尝试使用 NPGSQL 向 PostGreSQL V15 数据库发送一个(非常)长的查询,代码如下:
string Connection_string = "Host=--:5432;Username=postgres;Password=--;Database=-_-;";
DataSource = NpgsqlDataSource.Create(Connection_string);
string query = "INSERT INTO \"dsf_thdy_process\" values ('Commentaire','long_text',' long_text ',' long_text ',[…],' long_text ')"; // very long query with lot of texts to insert in lot of columns
using (var connection = DataSource.OpenConnection())
{
using var command =DataSource.CreateCommand(query);
command.ExecuteNonQuery();
}`
我遇到异常 » Npgsql.PostgresException: '54000: 该行太长:长度 11392,最大长度 8160' «
如果我减少查询的长度,那就行了。
我尝试在连接字符串中添加“Write Buffer Size =16000”,如https://www.npgsql.org/doc/performance.html中所述,但没有效果。
在lost Cause中,我也尝试在查询中添加一些行返回,但仍然没有效果。
有没有办法增加 CreateCommand 接受的长度? (或者通过 npgsql 发送长查询的另一种方式)
谢谢
正如其他人提到的,永远不要连接要发送的字符串,您对 SQL 注入是完全开放的。最好参数化查询。以下是您将执行的操作的示例。
var pgCmd = new NpgsqlCommand(""); // not including actual command here.
pgCmd.CommandText =
@"insert into someTable
( col1,
col2,
col3,...
)
values
( :pCol1,
:pCol2,
:pCol3,...
)
Postgres 使用“:”冒号作为参数指示符。我还在实际参数前加上“p”前缀,只是为了指示参数值,而不仅仅是插入列名。有助于防止我在阅读时出现歧义。
现在您已经有了命令,请添加参数...
pgCmd.Parameters.Add( new NpgsqlParameter( "pCol1", someIntegerValue ));
pgCmd.Parameters.Add( new NpgsqlParameter( "pCol2", someStringValue ));
pgCmd.Parameters.Add( new NpgsqlParameter( "pCol3", someDateValue ));
然后您可以针对您拥有的任何连接执行该命令。
现在,实际上最好显式区分参数的类型,但请查看重载函数实例来帮助解决这一问题。根据您想要提供的内容,我看到 10 个重载。我实际上包装了一个函数来添加字符串参数、日期、整数等,以便创建参数、正确的类型、参数名称和适当的值。
HTH