NutzCN Logo
问答 如何得到变化的表的字段数?
发布于 240天前 作者 qq_09dec3d3 255 次浏览 复制 上一个帖子 下一个帖子
标签:

obj = J4E.fromExcel(in, Class.forName(classname),null); OBJ到底有多少个字段如何得到?我需遍历整个数据表的每个字段,得到这份表的每个字段字符个数的最大值,然后修改表的字段最大值,再导表,省得只看见报错,截断字符串,好烦燥的

20 回复

老大们,怎么玩

没太看懂,能写段伪代码解释下吗

简单的说,通过EXCEL表转成数据库,但我需知道这张表有多少个字段

那是dao的问题了吧?

dao.getEntity(klass).getMappingFields

你需要的是 BeanMaker.fromExcel(in, sheetName, true)

BeanMaker就在j4e项目里

问题是,他没有返回真实的字段长度,都是128

你要查数据库表字段的具体长度??

我收到的EXCEL文件,每列都是不定长,可能今天这列说明长,明天那列的说明长,所以需要知道在数据表中的数据的长度,更具新的资料来决定是否需修改字段的长度

但这些列都有固定的表头

我采用的是一次性将EXCEL表用FROMEXCEL导入LIST中,然后读出目前表的每个字段的长度,遍历LIST,获得每列数据的最大长度,与原表对照,大于原表就修改字段长,否就不变,然后在导入数据

除了这个办法还有其他办法么?看着经常报截断字符串就烦

而且这个表有5000多行,最多的有15000,看着头晕

试了一下, mysql的话可以这样写

    @Test
    public void test_get_column_info_from_mysql() {
        Sql sql = Sqls.queryRecord("select * from information_schema.columns where table_schema = @db and table_name =@tname");
        sql.forceExecQuery();
        sql.setParam("db", "nutztest");
        sql.setParam("tname",  dao.getEntity(Pet.class).getTableName());
        dao.execute(sql);
        List<Record> list = sql.getList(Record.class);
        System.out.println(list);
    }

每行记录(就是一个字段)的数据类似于

{
   "table_catalog": "def",
   "table_schema": "nutztest",
   "table_name": "t_pet",
   "column_name": "alias",
   "ordinal_position": 3,
   "column_default": null,
   "is_nullable": "YES",
   "data_type": "varchar",
   "character_maximum_length": 128, // 长度
   "character_octet_length": 384,
   "numeric_precision": null,
   "numeric_scale": null,
   "datetime_precision": null,
   "character_set_name": "utf8",
   "collation_name": "utf8_general_ci",
   "column_type": "varchar(128)",
   "column_key": "",
   "extra": "",
   "privileges": "select,insert,update,references",
   "column_comment": "",
   "generation_expression": ""
}

直接把表改成一个很大的值不就完了,每次都分析字段长度再改长有这个必要?

问题是SQL表所有字段和最大只有8000多

那如果输入不做限制,早晚会超过你说的上限8000 到时候不是连表都没得改了?

我看了 一下目前的表最大为1500,只是个别,加起来可能有5000多了,估计不会超过8000

那就把那几个特别长的列直接加大到最大数值得了,免得每次分析数据再去改表 等你后面数据多了 分析excel,改表每次操作都会特别耗时

添加回复
请先登陆
回到顶部