diff --git a/src/sync_writer.py b/src/sync_writer.py index db5ecba..1a869f2 100644 --- a/src/sync_writer.py +++ b/src/sync_writer.py @@ -104,17 +104,6 @@ def _sanitize_rows(rows, fields, import_col, limits, dt_cols): return out -# 列类型 -> schema.ini 类别映射(文本/日期/数值) -_TYPE_MAP = { - "VARCHAR": "text", "CHAR": "text", "TEXT": "text", "LONGVARCHAR": "text", - "LONGCHAR": "text", "MEMO": "text", - "DATETIME": "date", "DATE": "date", "TIME": "date", - "INTEGER": "int", "SMALLINT": "int", "BIGINT": "int", "TINYINT": "int", - "COUNTER": "int", "AUTOINCREMENT": "int", - "DOUBLE": "float", "SINGLE": "float", "REAL": "float", - "DECIMAL": "float", "NUMERIC": "float", "CURRENCY": "float", "MONEY": "float", - "BIT": "bit", "YESNO": "bit", "BOOLEAN": "bit", -} def _access_cols(cn, table): @@ -128,14 +117,17 @@ def _access_cols(cn, table): def _schema_type(col, meta): - tn, size = meta.get(col, ("", None)) - cat = _TYPE_MAP.get(tn, "text") - if cat == "text": - # ACE 对部分表(尤其 ADOX 建的)报告的列宽可能为 None, - # Text ISAM 不接受 Width 0,故无宽度时兜底 255 - return f"Text Width {size if size else 255}" - return {"date": "DateTime", "int": "Integer", - "float": "Double", "bit": "Bit"}.get(cat, "Text Width 0") + """只输出 Access Text ISAM 永远接受的两种合法值,杜绝 -5402 非法选项。 + + - 日期/时间列 -> DateTime(Text 驱动据此解析日期) + - 其余(文本/数值/布尔等)-> Text Width 255 + (插入时 Access 按目标列真实类型自动强制转换,故无需精确声明) + """ + tn, _ = meta.get(col, ("", None)) + t = (tn or "").upper() + if "DAT" in t or "DATE" in t or "TIME" in t: + return "DateTime" + return "Text Width 255" def _csv_val(v):