{"record":{"id":"7e7dff208c24a5b1","repo":"litedb-org/LiteDB","slug":"0-7e7dff","errorCode":"0","errorMessage":"Collection ${this.Name} requires string as 'filename' or a document field 'filename'","messagePattern":"Collection (.+?) requires string as 'filename' or a document field 'filename'","errorType":"exception","errorClass":"LiteException","httpStatus":null,"severity":"error","filePath":"LiteDB/Engine/SystemCollections/SysFileCsv.cs","lineNumber":21,"sourceCode":"using System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing static LiteDB.Constants;\n\nnamespace LiteDB.Engine\n{\n    internal class SysFileCsv : SystemCollection\n    {\n        private readonly static IFormatProvider _numberFormat = CultureInfo.InvariantCulture.NumberFormat;\n\n        public SysFileCsv() : base(\"$file_csv\")\n        {\n        }\n\n        public override IEnumerable<BsonDocument> Input(BsonValue options)\n        {\n            var filename = GetOption(options, \"filename\")?.AsString ?? throw new LiteException(0, $\"Collection ${this.Name} requires string as 'filename' or a document field 'filename'\");\n            var encoding = GetOption(options, \"encoding\", \"utf-8\").AsString;\n            var delimiter = GetOption(options, \"delimiter\", \",\").AsString[0];\n\n            // read header (or first line as header)\n            var header = new List<string>();\n\n            if (options.IsDocument && options[\"header\"].IsArray)\n            {\n                header.AddRange(options[\"header\"].AsArray.Select(x => x.AsString));\n            }\n\n            using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))\n            {\n                using (var reader = new StreamReader(fs, Encoding.GetEncoding(encoding)))\n                {\n                    // if not header declared, use first line as header fields\n                    if (header.Count == 0)\n                    {","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/litedb-org/LiteDB/blob/f906a5f850678719e39a39a006cb66dcae563cfa/LiteDB/Engine/SystemCollections/SysFileCsv.cs#L3-L39","documentation":"Thrown by SysFileCsv.Input when reading from $file_csv and the 'filename' option is missing or not a string. GetOption(options,\"filename\")?.AsString returns null when absent/non-string, triggering the throw before opening the FileStream.","triggerScenarios":"SELECT * FROM $file_csv() with no filename, or $file_csv({ encoding:'utf-8' }) without a filename field, or passing filename as a non-string value.","commonSituations":"Using $file_csv directly (bypassing the $file router) and forgetting the filename; programmatically building options and omitting it.","solutions":["Pass the filename: $file_csv('data.csv') or { filename: 'data.csv' }.","Prefer $file('data.csv') which routes by extension and is less error-prone.","Validate the filename option exists as a string before running the query."],"exampleFix":"// before\ndb.Execute(\"SELECT * FROM $file_csv()\"); // throws\n\n// after\ndb.Execute(\"SELECT * FROM $file_csv('data.csv')\");","handlingStrategy":"validation","validationCode":"if (string.IsNullOrWhiteSpace(filename)) throw new ArgumentException(\"filename required\");\ndb.Execute($\"SELECT * FROM $file_csv('{filename}')\");","typeGuard":null,"tryCatchPattern":"try { db.Execute($\"SELECT * FROM $file_csv('{filename}')\"); }\ncatch (LiteException ex) when (ex.Message.Contains(\"requires string as 'filename'\")) {\n    // obtain filename and retry\n}","preventionTips":["Prefer $file('x.csv') over $file_csv to reduce option mistakes.","Require filename in your import API contract."],"tags":["system-collections","csv","file-import","validation"],"backgroundTag":null,"analyzedSha":"f906a5f850678719e39a39a006cb66dcae563cfa","analyzedAt":"2026-08-13T21:56:30.148Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}