{"record":{"id":"1194c0cb910ff83f","repo":"tursodatabase/turso","slug":"column-name-not-found-1194c0","errorCode":null,"errorMessage":"column {name} not found","messagePattern":"column (.+?) not found","errorType":"exception","errorClass":"IndexOutOfRangeException","httpStatus":null,"severity":"error","filePath":"bindings/dotnet/src/Turso.Data/TursoDataReader.cs","lineNumber":182,"sourceCode":"        return TursoBindings.GetValue(_statement, ordinal).IntValue;\n    }\n\n    public override string GetName(int ordinal)\n    {\n        return TursoBindings.GetName(_statement, ordinal);\n    }\n\n    public override int GetOrdinal(string name)\n    {\n        var fields = TursoBindings.GetFieldCount(_statement);\n        for (var i = 0; i < fields; i++)\n        {\n            var columnName = TursoBindings.GetName(_statement, i);\n            if (columnName == 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        return TursoBindings.GetValue(_statement, ordinal).StringValue;\n    }\n\n    public override object GetValue(int ordinal)\n    {\n        var value = TursoBindings.GetValue(_statement, ordinal);\n        return value.ValueType switch\n        {\n            TursoValueType.Null or TursoValueType.Empty => DBNull.Value,\n            TursoValueType.Integer => value.IntValue,\n            TursoValueType.Real => value.RealValue,\n            TursoValueType.Text => value.StringValue,\n            TursoValueType.Blob => value.BlobValue,\n            _ => throw new ArgumentOutOfRangeException()","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/tursodatabase/turso/blob/6c7252267988c76e632af00a671e4b9788dfae13/bindings/dotnet/src/Turso.Data/TursoDataReader.cs#L164-L200","documentation":"TursoDataReader.GetOrdinal(name) scans the current statement's result columns via GetName and throws IndexOutOfRangeException when no column matches the given name. The comparison is ordinal ('==' on strings), so it is case-sensitive and whitespace-sensitive, unlike some ADO.NET providers that fall back to case-insensitive matching. It only sees columns actually projected by the executed statement, not all table columns.","triggerScenarios":"Calling GetOrdinal(\"UserName\") when the query returned \"username\"; calling GetOrdinal after a SELECT that aliases or omits the column; calling it when the reader is positioned on a statement whose result set has different columns (multi-statement batches); passing a name with stray whitespace.","commonSituations":"SELECT * queries after a schema migration renamed/dropped a column; column aliases in the SQL differing from what the reader code expects; code shared between database engines with different identifier casing; ordinal lookups after DDL statements that return zero columns.","solutions":["Use the exact column name as returned by the query, including casing (check with reader.GetName(i) for i in 0..FieldCount-1).","Prefer explicit column lists in SELECT instead of '*' so names are stable across schema changes.","Do the case-insensitive fallback yourself: enumerate names once and match with StringComparison.OrdinalIgnoreCase.","Confirm the reader is on the statement you think it is (call NextResult() as needed in batch scenarios)."],"exampleFix":"// before\nvar idx = reader.GetOrdinal(\"UserName\"); // column is actually 'username'\n\n// after\nvar idx = Enumerable.Range(0, reader.FieldCount)\n    .First(i => string.Equals(reader.GetName(i), \"UserName\", StringComparison.OrdinalIgnoreCase));","handlingStrategy":"validation","validationCode":"int? FindColumn(DbDataReader reader, string name)\n{\n    for (var i = 0; i < reader.FieldCount; i++)\n        if (string.Equals(reader.GetName(i), name, StringComparison.OrdinalIgnoreCase))\n            return i;\n    return null;\n}","typeGuard":null,"tryCatchPattern":"try { idx = reader.GetOrdinal(name); } catch (IndexOutOfRangeException) { /* log available columns, rethrow as schema-drift error */ }","preventionTips":["Prefer explicit SELECT column lists over '*' so names are stable.","Cache ordinals once per result shape instead of looking up per row.","Add schema-drift smoke tests that assert expected column names."],"tags":["csharp","dotnet","data-reader","column-lookup","schema-mismatch"],"backgroundTag":"column-not-found","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"}