tursodatabase/turso · error · InvalidOperationException

{propertyName} must be set.

Error message

{propertyName} must be set.

What it means

During BindParameters, every parameter in the collection must carry a non-empty ParameterName; one without a name throws InvalidOperationException because the provider matches names against the SQL's parameter tokens (FindParameterIndex) to find each bind index. Unnamed/positional parameters are not supported by this binding path.

Source

Thrown at bindings/dotnet/src/Turso.Data.Sqlite/SqliteCommand.cs:654

            return statement;
        }
        catch
        {
            statement.Dispose();
            throw;
        }
    }

    private void BindParameters(TursoStatementHandle statement)
    {
        var parameterCount = TursoBindings.GetParameterCount(statement);
        var boundParameters = new bool[parameterCount + 1];

        for (var i = 0; i < Parameters.Count; i++)
        {
            var parameter = Parameters[i];
            if (string.IsNullOrEmpty(parameter.ParameterName))
                throw new InvalidOperationException(Properties.Resources.RequiresSet(nameof(parameter.ParameterName)));
            if (!parameter.HasValue)
                throw new InvalidOperationException(Properties.Resources.RequiresSet(nameof(parameter.Value)));

            var parameterIndex = FindParameterIndex(statement, parameter.ParameterName, parameterCount);
            if (parameterIndex == 0)
                continue;

            TursoBindings.BindParameter(statement, parameterIndex, parameter.ToTursoValue());
            boundParameters[parameterIndex] = true;
        }

        for (var i = 1; i <= parameterCount; i++)
        {
            if (!boundParameters[i])
            {
                var parameterName = TursoBindings.GetParameterName(statement, i);
                throw new InvalidOperationException(
                    parameterName is null

View on GitHub (pinned to 6c72522679)

Solutions

  1. Set ParameterName on every parameter (matching the token spelling used in the SQL, e.g. $id).
  2. Prefer cmd.Parameters.AddWithValue("$name", value), which names and binds in one step.
  3. Audit helper methods that call CreateParameter() to require a name argument.

Example fix

// before
var p = cmd.CreateParameter();
p.Value = 42;
cmd.Parameters.Add(p); // no ParameterName -> throws

// after
cmd.Parameters.AddWithValue("$id", 42);
Defensive patterns

Strategy: validation

Validate before calling

foreach (DbParameter p in cmd.Parameters)
    if (string.IsNullOrEmpty(p.ParameterName))
        throw new InvalidOperationException("Every parameter needs a ParameterName.");

Prevention

When it happens

Trigger: Creating a parameter via cmd.CreateParameter(), setting only Value, adding it, and executing; parameter objects copied with cleared names; ordinal-style code assuming positional binding works.

Common situations: Refactors that rename SQL tokens while stale parameter objects linger; shared parameter factories that skip naming; code ported from providers that permit unnamed parameters.

Related errors


AI-assisted analysis of tursodatabase/turso@6c72522679 (2026-08-20). Data as JSON: /api/errors/a2892b1477f2cc1a. Report an issue: GitHub.