{"record":{"id":"6b093e095c0b326e","repo":"tursodatabase/turso","slug":"value-must-be-set","errorCode":null,"errorMessage":"Value must be set.","messagePattern":"Value must be set\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"bindings/dotnet/src/Turso.Data.Sqlite/SqliteCommand.cs","lineNumber":529,"sourceCode":"\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;\n            }\n            else if (!IsPrefixed(parameterName))","sourceCodeStart":511,"sourceCodeEnd":547,"githubUrl":"https://github.com/tursodatabase/turso/blob/6c7252267988c76e632af00a671e4b9788dfae13/bindings/dotnet/src/Turso.Data.Sqlite/SqliteCommand.cs#L511-L547","documentation":"This InvalidOperationException is thrown by ValidateManagedParameterValues when a SqliteParameter in the collection has a name but its Value was never assigned (parameter.HasValue is false). Managed execution cannot translate an unset parameter into a Turso wire value.","triggerScenarios":"Creating a SqliteParameter with a ParameterName but no Value (e.g. new SqliteParameter(\"@x\", DbType.Int32) without setting .Value) and executing BuildBatch, PrepareManagedAsync, or ExecuteManagedAsync.","commonSituations":"Declaring typed parameters up front intending to fill them later but forgetting to set one; conditionally skipping a parameter assignment in a code branch.","solutions":["Set the Value property on every parameter before execution","Use Parameters.AddWithValue(\"@name\", value) when creating parameters","For NULL values, explicitly assign Value = DBNull.Value"],"exampleFix":"// before\nvar p = cmd.CreateParameter();\np.ParameterName = \"@id\";\ncmd.Parameters.Add(p);\n\n// after\np.Value = 42; // or DBNull.Value for SQL NULL\ncmd.Parameters.Add(p);","handlingStrategy":"validation","validationCode":"if (cmd.Parameters.Cast<SqliteParameter>().Any(p => !p.HasValue))\n    throw new InvalidOperationException(\"Bind every parameter before execution.\");","typeGuard":"bool AllBound(SqliteCommand cmd) => cmd.Parameters.Cast<SqliteParameter>().All(p => p.HasValue);","tryCatchPattern":"try { cmd.ExecuteNonQuery(); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"Value must be set\"))\n{\n    // fill values from defaults and retry\n}","preventionTips":["Assign values in the same code block that adds parameters","Add a pre-execution assert that all parameters have values"],"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"}