{"record":{"id":"a2892b1477f2cc1a","repo":"tursodatabase/turso","slug":"propertyname-must-be-set","errorCode":null,"errorMessage":"{propertyName} must be set.","messagePattern":"(.+?) must be set\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"bindings/dotnet/src/Turso.Data.Sqlite/SqliteCommand.cs","lineNumber":654,"sourceCode":"            return statement;\n        }\n        catch\n        {\n            statement.Dispose();\n            throw;\n        }\n    }\n\n    private void BindParameters(TursoStatementHandle statement)\n    {\n        var parameterCount = TursoBindings.GetParameterCount(statement);\n        var boundParameters = new bool[parameterCount + 1];\n\n        for (var i = 0; i < Parameters.Count; i++)\n        {\n            var parameter = Parameters[i];\n            if (string.IsNullOrEmpty(parameter.ParameterName))\n                throw new InvalidOperationException(Properties.Resources.RequiresSet(nameof(parameter.ParameterName)));\n            if (!parameter.HasValue)\n                throw new InvalidOperationException(Properties.Resources.RequiresSet(nameof(parameter.Value)));\n\n            var parameterIndex = FindParameterIndex(statement, parameter.ParameterName, parameterCount);\n            if (parameterIndex == 0)\n                continue;\n\n            TursoBindings.BindParameter(statement, parameterIndex, parameter.ToTursoValue());\n            boundParameters[parameterIndex] = true;\n        }\n\n        for (var i = 1; i <= parameterCount; i++)\n        {\n            if (!boundParameters[i])\n            {\n                var parameterName = TursoBindings.GetParameterName(statement, i);\n                throw new InvalidOperationException(\n                    parameterName is null","sourceCodeStart":636,"sourceCodeEnd":672,"githubUrl":"https://github.com/tursodatabase/turso/blob/6c7252267988c76e632af00a671e4b9788dfae13/bindings/dotnet/src/Turso.Data.Sqlite/SqliteCommand.cs#L636-L672","documentation":"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.","triggerScenarios":"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.","commonSituations":"Refactors that rename SQL tokens while stale parameter objects linger; shared parameter factories that skip naming; code ported from providers that permit unnamed parameters.","solutions":["Set ParameterName on every parameter (matching the token spelling used in the SQL, e.g. $id).","Prefer cmd.Parameters.AddWithValue(\"$name\", value), which names and binds in one step.","Audit helper methods that call CreateParameter() to require a name argument."],"exampleFix":"// before\nvar p = cmd.CreateParameter();\np.Value = 42;\ncmd.Parameters.Add(p); // no ParameterName -> throws\n\n// after\ncmd.Parameters.AddWithValue(\"$id\", 42);","handlingStrategy":"validation","validationCode":"foreach (DbParameter p in cmd.Parameters)\n    if (string.IsNullOrEmpty(p.ParameterName))\n        throw new InvalidOperationException(\"Every parameter needs a ParameterName.\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer AddWithValue over CreateParameter.","Name parameters exactly as they appear in the SQL text.","Validate parameter collections in debug builds."],"tags":["dotnet","ado-net","parameters","binding"],"backgroundTag":"parameter-binding-validation","analyzedSha":"6c7252267988c76e632af00a671e4b9788dfae13","analyzedAt":"2026-08-20T07:02:18.389Z","contentChangedAt":"2026-08-20T07:02:18.389Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}