{"record":{"id":"b759a7bde79f8019","repo":"DapperLib/Dapper","slug":"a-single-character-was-expected","errorCode":null,"errorMessage":"A single-character was expected","messagePattern":"A single-character was expected","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"Dapper/SqlMapper.cs","lineNumber":2080,"sourceCode":"                            values[iter] = obj is DBNull ? null! : obj;\r\n                        }\r\n                    }\r\n                    return new DapperRow(table, values);\r\n                };\r\n        }\r\n        /// <summary>\r\n        /// Internal use only.\r\n        /// </summary>\r\n        /// <param name=\"value\">The object to convert to a character.</param>\r\n        [Browsable(false)]\r\n        [EditorBrowsable(EditorBrowsableState.Never)]\r\n        [Obsolete(ObsoleteInternalUsageOnly, false)]\r\n        public static char ReadChar(object value)\r\n        {\r\n            if (value is null || value is DBNull) throw new ArgumentNullException(nameof(value));\r\n            if (value is string s && s.Length == 1) return s[0];\r\n            if (value is char c) return c;\r\n            throw new ArgumentException(\"A single-character was expected\", nameof(value));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Internal use only.\r\n        /// </summary>\r\n        /// <param name=\"value\">The object to convert to a character.</param>\r\n        [Browsable(false)]\r\n        [EditorBrowsable(EditorBrowsableState.Never)]\r\n        [Obsolete(ObsoleteInternalUsageOnly, false)]\r\n        public static char? ReadNullableChar(object value)\r\n        {\r\n            if (value is null || value is DBNull) return null;\r\n            if (value is string s && s.Length == 1) return s[0];\r\n            if (value is char c) return c;\r\n            throw new ArgumentException(\"A single-character was expected\", nameof(value));\r\n        }\r\n\r\n        /// <summary>\r","sourceCodeStart":2062,"sourceCodeEnd":2098,"githubUrl":"https://github.com/DapperLib/Dapper/blob/72a54c475f75e18cb93cba0809d00a5e6e49efd9/Dapper/SqlMapper.cs#L2062-L2098","documentation":"Thrown by `SqlMapper.ReadChar(object value)` when the value is neither null/DBNull nor a single-character string nor a `char`. ReadChar accepts only those three shapes; anything else (a multi-char string, a number, a byte, etc.) cannot be unambiguously converted to one character, so it throws ArgumentException.","triggerScenarios":"A column mapped to `char` returns a string longer than one character, or a numeric/other type. Dapper routes the cell value through ReadChar (char parser at SqlMapper.cs:3100) and the value fails both the `string s && s.Length == 1` and `char c` checks. Direct calls like `SqlMapper.ReadChar(\"ab\")` or `SqlMapper.ReadChar(65)` also trigger it.","commonSituations":"A varchar code field that occasionally holds multiple characters being mapped to `char`; a schema change widening a column; storing numeric codes in a column mapped to char.","solutions":["Map the column to `string` and validate/truncate in code rather than forcing a char.","Fix the source data so the column only ever contains a single character.","Use a custom ITypeHandler to define the conversion (e.g. take the first character).","Coalesce/substring in SQL: `substring(code, 1, 1)`."],"exampleFix":"// before\npublic class Row { public char Code { get; set; } } // 'AB' from DB throws\n// after\npublic class Row { public string Code { get; set; } }","handlingStrategy":"type-guard","validationCode":"// Verify single-char shape before relying on char mapping.\nstatic bool IsSingleChar(object? v) => v is char || (v is string s && s.Length == 1);","typeGuard":"static char ToChar(object? v) => v switch { null => throw new ArgumentNullException(nameof(v)), DBNull => throw new ArgumentNullException(nameof(v)), char c => c, string s when s.Length == 1 => s[0], _ => throw new ArgumentException(\"not a single char\") };","tryCatchPattern":null,"preventionTips":["Map multi-character string columns to string, not char.","Constrain/validate source data for char-typed columns.","Use a custom type handler for non-standard conversions."],"tags":["dapper","char","type-conversion","materialization"],"backgroundTag":null,"analyzedSha":"72a54c475f75e18cb93cba0809d00a5e6e49efd9","analyzedAt":"2026-08-13T14:18:18.115Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}