通过 npgsql.createcommand 发送很长的查询

问题描述 投票:0回答:1

我正在尝试使用 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 发送长查询的另一种方式)

谢谢

c# npgsql
1个回答
0
投票

正如其他人提到的,永远不要连接要发送的字符串,您对 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

© www.soinside.com 2019 - 2024. All rights reserved.