在MySQL数据库使用DbMaintenance.AddColumn添加列时, 底层生成sql语句逻辑有问题 返回

SqlSugar 沟通中
2 152

https://github.com/DotNetNext/SqlSugar/blob/c3f732da9581adbf15f84b97847a8448c5b423e5/Src/Asp.Net/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs#L858-L865

此处代码中先将columnInfo.DataType缓存至dataType字段

但后续执行GetSize(columnInfo)中,在MySQL的重写逻辑中

https://github.com/DotNetNext/SqlSugar/blob/c3f732da9581adbf15f84b97847a8448c5b423e5/Src/Asp.Net/SqlSugar.MySqlConnector/MySql/DbMaintenance/MySqlDbMaintenance.cs#L485-L509

若字段的Length大于4000则会更新columnInfo.DataType属性为"longtext"并返回空字符串

但后续在执行 string.Format(this.AddColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity) 的时候传入是此前缓存的dataType, columnInfo.DataType的更新实际上并未使用, 导致最终生成的sql字符串中类型文本是没有长度的 "varchar" ,引起数据库执行报错
其它地方的类似实现都是先执行GetSize再缓存DataType

热忱回答2

  • 没看懂说的什么,说功能,不要讲源码。

    0 回复
  • 简单来说: 

    MySQL连接下
    columnInfo.DbType="varchar";

    columnInfo.Length > 4000;

    执行 DbMaintenance.AddColumn(columnInfo) 会报错

    因为会生成类似下面这样的SQL语句, 因为varchar没有长度信息, 执行就报错了

    alter table mytable add column newcolumn varchar default null

    上面一大串就是告诉你问题出在源码哪里

    0 回复