{"record":{"id":"d81844958fa700eb","repo":"tursodatabase/turso","slug":"cannot-convert-remote-null-value-to-string","errorCode":null,"errorMessage":"Cannot convert remote null value to String.","messagePattern":"Cannot convert remote null value to String\\.","errorType":"exception","errorClass":"InvalidCastException","httpStatus":null,"severity":"error","filePath":"bindings/dotnet/src/Turso.Data/TursoRemoteDataReader.cs","lineNumber":179,"sourceCode":"\n    public override int GetOrdinal(string name)\n    {\n        for (var i = 0; i < FieldCount; i++)\n        {\n            if (GetName(i) == name)\n                return i;\n        }\n\n        throw new IndexOutOfRangeException($\"column {name} not found\");\n    }\n\n    public override string GetString(int ordinal)\n    {\n        var value = CurrentValue(ordinal).ToClrValue();\n        return value switch\n        {\n            string text => text,\n            DBNull => throw new InvalidCastException(\"Cannot convert remote null value to String.\"),\n            IFormattable formattable => formattable.ToString(null, CultureInfo.InvariantCulture),\n            _ => value.ToString() ?? string.Empty,\n        };\n    }\n\n    public override object GetValue(int ordinal)\n    {\n        return CurrentValue(ordinal).ToClrValue();\n    }\n\n    public override int GetValues(object[] values)\n    {\n        ArgumentNullException.ThrowIfNull(values);\n\n        var count = Math.Min(values.Length, FieldCount);\n        for (var i = 0; i < count; i++)\n            values[i] = GetValue(i);\n","sourceCodeStart":161,"sourceCodeEnd":197,"githubUrl":"https://github.com/tursodatabase/turso/blob/6c7252267988c76e632af00a671e4b9788dfae13/bindings/dotnet/src/Turso.Data/TursoRemoteDataReader.cs#L161-L197","documentation":"TursoRemoteDataReader.GetString converts every non-null value to a string (via IFormattable with invariant culture) but maps DBNull to an explicit InvalidCastException, mirroring strict ADO.NET getter semantics where a null cannot become a string reference. Only null cells take this path; integers, doubles, and blobs are stringified instead.","triggerScenarios":"Calling GetString(ordinal) when the current row's cell is SQL NULL: a nullable TEXT column with no value, the right side of a LEFT JOIN that did not match, or an aggregate like MAX over an empty set.","commonSituations":"Optional fields (middle name, description) that are null for some rows; LEFT JOIN detail rows; columns defaulted to NULL; code ported from a driver that returned null or empty string for NULL.","solutions":["Check reader.IsDBNull(ordinal) before calling GetString and decide on a fallback (empty string, null variable, or sentinel).","Use GetValue(ordinal) and convert with Convert.ToString(...) or an `as string` pattern when the column may be null.","Fix the query with COALESCE(col, '') when an empty string is an acceptable representation.","For typed materialization, map the column to a nullable CLR type (string? handles DBNull via GetValue + cast)."],"exampleFix":"// before\nstring title = reader.GetString(1); // NULL cell -> InvalidCastException\n\n// after\nstring title = reader.IsDBNull(1) ? string.Empty : reader.GetString(1);","handlingStrategy":"type-guard","validationCode":"// GetString is only safe on non-null cells\nif (!reader.IsDBNull(ordinal))\n    var text = reader.GetString(ordinal);","typeGuard":"static string GetStringOrNull(DbDataReader r, int i) => r.IsDBNull(i) ? null : r.GetString(i);","tryCatchPattern":"try { s = reader.GetString(i); }\ncatch (InvalidCastException) when (reader.IsDBNull(i)) { s = null; }","preventionTips":["Check IsDBNull for every nullable column before a typed getter.","Use COALESCE in SQL when an empty string is acceptable.","Centralize null-to-default policy in one materialization helper instead of per call site."],"tags":["dotnet","ado-net","null-handling","string-conversion"],"backgroundTag":"null-value-cast","analyzedSha":"6c7252267988c76e632af00a671e4b9788dfae13","analyzedAt":"2026-08-20T07:02:18.389Z","contentChangedAt":"2026-08-20T07:02:18.389Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}