public void TooManyParameters()
{
using (var conn = OpenConnection())
{
using (var cmd = new NpgsqlCommand { Connection = conn })
{
var sb = new StringBuilder("SELECT ");
for (var i = 0; i < 65536; i++)
{
var paramName = "p" + i;
cmd.Parameters.Add(new NpgsqlParameter(paramName, 8));
if (i > 0)
sb.Append(", ");
sb.Append('@');
sb.Append(paramName);
}
cmd.CommandText = sb.ToString();
Assert.That(() => cmd.ExecuteNonQuery(), Throws.Exception
.InstanceOf<Exception>()
.With.Message.EqualTo("A statement cannot have more than 65535 parameters")
);
}
// An individual statement cannot have more than 65535 parameters, but a command can
// (across multiple statements).
// Create a command with 1000 statements which have 70 params each
using (var cmd = new NpgsqlCommand { Connection = conn })
{
var paramIndex = 0;
var sb = new StringBuilder();
for (var statementIndex = 0; statementIndex < 1000; statementIndex++)
{
if (statementIndex > 0)
sb.Append("; ");
sb.Append("SELECT ");
var startIndex = paramIndex;
var endIndex = paramIndex + 70;
for (; paramIndex < endIndex; paramIndex++)
{
var paramName = "p" + paramIndex;
cmd.Parameters.Add(new NpgsqlParameter(paramName, 8));
if (paramIndex > startIndex)
sb.Append(", ");
sb.Append('@');
sb.Append(paramName);
}
}
cmd.CommandText = sb.ToString();
cmd.ExecuteNonQuery();
}
}
}