{"record":{"id":"43790b1bdb780cd6","repo":"tursodatabase/turso","slug":"parametername-must-be-set","errorCode":null,"errorMessage":"ParameterName must be set.","messagePattern":"ParameterName must be set\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"bindings/dotnet/src/Turso.Data.Sqlite/SqliteCommand.cs","lineNumber":527,"sourceCode":"        if (statement.FirstKeyword != \"ROLLBACK\")\n            return false;\n\n        var sql = statement.Sql.TrimStart();\n        if (!sql.StartsWith(\"ROLLBACK\", StringComparison.OrdinalIgnoreCase))\n            return false;\n        sql = sql[\"ROLLBACK\".Length..].TrimStart();\n        if (sql.StartsWith(\"TRANSACTION\", StringComparison.OrdinalIgnoreCase))\n            sql = sql[\"TRANSACTION\".Length..].TrimStart();\n        return sql.StartsWith(\"TO\", StringComparison.OrdinalIgnoreCase);\n    }\n\n    internal void ValidateManagedParameterValues()\n    {\n        for (var index = 0; index < Parameters.Count; index++)\n        {\n            var parameter = Parameters[index];\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    }\n\n    internal void AddManagedParameters(\n        global::Turso.TursoCommand command,\n        ManagedSqliteStatement statement)\n    {\n        var mapped = new Dictionary<string, SqliteParameter>(StringComparer.Ordinal);\n        for (var index = 0; index < Parameters.Count; index++)\n        {\n            var parameter = Parameters[index];\n            var parameterName = parameter.ParameterName;\n            string? matchedName = null;\n            if (statement.ParameterNames.Contains(parameterName, StringComparer.Ordinal))\n            {\n                matchedName = parameterName;","sourceCodeStart":509,"sourceCodeEnd":545,"githubUrl":"https://github.com/tursodatabase/turso/blob/6c7252267988c76e632af00a671e4b9788dfae13/bindings/dotnet/src/Turso.Data.Sqlite/SqliteCommand.cs#L509-L545","documentation":"This InvalidOperationException is thrown by ValidateManagedParameterValues when a SqliteParameter in the command's Parameters collection has an empty or null ParameterName. Managed Turso commands address parameters by name, so every parameter must have an explicit name before execution.","triggerScenarios":"Adding SqliteParameter objects with only a Value (positional style, e.g. new SqliteParameter(value) or AddWithValue variants that leave the name empty) and then executing BuildBatch, PrepareManagedAsync, or ExecuteManagedAsync on a managed (direct remote / embedded replica) connection.","commonSituations":"Porting embedded SQLite code that used '?' positional parameters and unnamed parameter objects to managed Turso remote connections; copying parameters from another command where names were never assigned.","solutions":["Set ParameterName explicitly on each SqliteParameter before executing the command","Use Named parameters in CommandText (e.g. @name) and add parameters with matching names via cmd.Parameters.AddWithValue(\"@name\", value)","Only use unnamed positional parameters on local (non-managed) connections"],"exampleFix":"// before\ncmd.Parameters.Add(new SqliteParameter(42));\n\n// after\ncmd.Parameters.Add(new SqliteParameter(\"@id\", 42));","handlingStrategy":"validation","validationCode":"foreach (SqliteParameter p in cmd.Parameters)\n    if (!p.HasValue)\n        throw new InvalidOperationException($\"Parameter '{p.ParameterName}' has no value.\");","typeGuard":"bool HasValue(SqliteParameter p) => p.HasValue;","tryCatchPattern":"try { cmd.ExecuteNonQuery(); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"Value must be set\"))\n{\n    // set missing Value or DBNull.Value and retry\n}","preventionTips":["Prefer AddWithValue over split name/value assignment","Explicitly assign DBNull.Value instead of skipping assignments"],"tags":["dotnet","parameters","validation"],"backgroundTag":"missing-required-argument","analyzedSha":"6c7252267988c76e632af00a671e4b9788dfae13","analyzedAt":"2026-09-06T07:15:26.990Z","contentChangedAt":"2026-09-06T07:15:26.990Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}