发现几个问题,修改内容如下,请斟酌。 返回

SqlSugar
19 347

偶见sqlsugar,试用结果不错!目前为止测试了五种数据库,也发现了两个问题:

  • 二进制入库多存在问题,经调整不报错了。

  • postgresql/opengauss创建数据库索引问题。

老者做的相应修改如下:


1sqlite dateaddbytype 开始和结束日期颠倒了

SqliteExpressionContext.cs21行】DateDiff方法参数对应关系错误:

 修正后:24行:   var begin = model.Args[2].MemberName;

         25行:   var end = model.Args[1].MemberName;

 

2list转数据表

ContextMethods : IContextMethods类:

public  DataTable ListToDataTable<T>(List<T> list)函数中

725行:

  if (list != null && list.Count > 0)

 

3、字节数组转数据库类型错误问题:

思路:按照sqlserver思路统一改为image类型,不同数据库再二次调整:

DbBindProvider.Cs 22

            if (csharpTypeName == UtilConstants.ByteArrayType.Name)

                return "image";

binary自动生成的长度为1,且不允许设置length

 

3.1 SqlSugar:

3.1.1  OscarCodeFirst : CodeFirstProvider

55行增加:

            if(result.DataType == "image") {

                result.DataType = "blob";

            }

 

3.1.2  OscarDbBind : DbBindProvider

13行增加:

            if (dbTypeName == "image") {

                return "blob";

            }

OscarDbMaintenance : DbMaintenanceProvider

351行增加:

                if(dataType == "image") {

                    item.DataType = "blob";

                    dataType = "blob";

                }

3.2 opengauss

3.2.1  PostgreSQLDbBind : DbBindProvider

        public override string GetPropertyTypeName(string dbTypeName)增加:

            if (dbTypeName == "bytea") {

                return "byte[]";

            }

3.2.2 PostgreSQLCodeFirst : CodeFirstProvider

protected override DbColumnInfo EntityColumnToDbColumn函数增加:

            if (result.DataType == "image") {

                result.DataType = "bytea";

            }

3.2.3  PostgreSQLDbMaintenance : DbMaintenanceProvider

protected override string GetCreateTableSql 380行增加:

                if (dataType == "image") {

                    item.DataType = "bytea";

                    dataType = "bytea";

                }


4 解决postgresql无法建立索引问题:

 

4.1 暂时解决办法:

SqlSugar CodeFirstProvider

protected virtual void Execute(Type entityType)首次建立索引时排除postgreql数据库:

      if (isAny || this.Context.CurrentConnectionConfig.DbType != DbType.PostgreSQL) {

                CreateIndex(entityInfo);

       }

 

4.2 排除首次创建索引报错

public virtual bool CreateIndex(string tableName, string[] columnNames, string IndexName, bool isUnique = false)函数修改为:

            try {

                this.Context.Ado.ExecuteCommand(sql);

            } catch {

                this.Context.Ado.ExecuteCommand("commit;");//排斥报错二次执行

                this.Context.Ado.ExecuteCommand(sql);

            }

 

4.3 to_regclass报无此函数问题(opengauss):

public virtual bool IsAnyIndex(string indexName) 对应的postgresql修改为:

return " SELECT count(1) WHERE '{0}' IN ( SELECT indexname FROM pg_indexes )";

 

 

 

 

 

 

 


热忱回答19

  • fate sta fate sta VIP0
    2022/11/13

    好的幸苦了

    0 回复
  • fate sta fate sta VIP0
    2022/11/13

    等我抽空一个一个和你对一下

    0 回复
  • fate sta fate sta VIP0
    2022/11/13

    你这个不是标准的PGSQL吧 

    0 回复
  • fate sta fate sta VIP0
    2022/11/13

    疑问1:PGSQL索引方法报错并未重现(你是标准PGSQL吗)

     image.png

    0 回复
  • fate sta fate sta VIP0
    2022/11/14

    疑问2:

    var getAll = db.Queryable<Order>().Select(x => SqlFunc.DateDiff(DateType.Day, DateTime.Now.AddDays(-20), DateTime.Now)).ToList();

    Sqlite datediff也没有问题

    返回了20 

     

    参数(类型,小的时间,大的时间)

    0 回复
  • fate sta fate sta VIP0
    2022/11/14

     

    修复功能

    1。CodeFirst byte[]多库统一用法 已经支持,我的改法后期扩展性更好,没有更新基类方法

    2. DataTable ListToDataTable<T>(List<T> list) 添加了非null判断


    0 回复
  • fate sta fate sta VIP0
    2022/11/14

    github已经更新

    0 回复
  • CodeFirst byte[]多库统一用法改得不错!并感谢即使回复。

    另索引的问题依然存在,付我的修改记录:

    索引问题及修正记录:

     

    l   环境:使用华为OpenEuler随机安装的OpenGauss

    l   源格式:当类定义索引格式为(因需要适应多种数据库,大写索引名不许改变):

        [SugarIndex("IDX_QRTZ_FT_TRIG_INST_NAME", nameof(SCHED_NAME), OrderByType.Asc, nameof(INSTANCE_NAME), OrderByType.Asc)]

    l   现象1及修改记录:

    所在目录:SqlSugar\Abstract\DbMaintenanceProvider\ Methods.cs

    错误现象:to_regclass函数不存在

    修改记录:改用如下不依赖函数的方法后错误消失:

            protected override string IsAnyIndexSql{

                get {

                    return " SELECT count(1) WHERE '{0}' IN ( SELECT indexname FROM pg_indexes )";

                    //return "  Select count(1) from (SELECT to_regclass('{0}') as c ) t where t.c is not null";

                }

    }

    l   现象2及修改记录:

    所在目录:SqlSugar\Realization\PostgreSQL\DbMaintenance\ PostgreSQLDbMaintenance.cs

    错误现象:索引名因大小写造成执行失败;

    修改记录: 修改成如下模式后索引创建成功:

            public virtual bool IsAnyIndex(string indexName)

            {

                var name = (this.Context.CurrentConnectionConfig.MoreSettings.PgSqlIsAutoToLowerCodeFirst)

                   ? indexName.ToLower()

                   : indexName;

                string sql = string.Format(this.IsAnyIndexSql, name, this.Context.Ado.Connection.Database);

                try {

                    return this.Context.Ado.GetInt(sql) > 0;

                } catch { return false; }

     

                //string sql = string.Format(this.IsAnyIndexSql, indexName);

                //string sql = string.Format(this.IsAnyIndexSql, indexName, this.Context.Ado.Connection.Database);

                //return this.Context.Ado.GetInt(sql)>0;

            }


    0 回复
  • fate sta fate sta VIP0
    2022/11/14

    好的,我按你用法看一下是不是PGSQL也支持,如果支持那就换成你 这种写法

    0 回复
  • fate sta fate sta VIP0
    2022/11/14

         protected override string IsAnyIndexSql

            {

                get

                {

                    return "  SELECT count(1) WHERE upper('{0}') IN ( SELECT upper(indexname) FROM pg_indexes )";

                }

            }

    pgsql和OpenGauss都支持的索引 我这么改了发布到github了你看看能不能满足你的要求

    0 回复
  • 新发现的问题,修改后就可支持sugarcolumn的属性了。

    ListToDatatable问题及修正记录:

    l   环境:华为OpenEuler随机安装的OpenGauss

    l   源格式:未对SqlSugar属性给予支持,无法排除具有IsIgnore属性的对象:

    l  位置: SqlSugar/Infrastructure/ContextMethods.cs:

    l  函数:

            public  DataTable ListToDataTable<T>(List<T> list)

            {

                DataTable result = new  DataTable();

                if (list!=null&&list.Count > 0)

                {

                    PropertyInfo[] propertys = list[0].GetType().GetProperties();

                    foreach (PropertyInfo pi in propertys) {

                        var comumnInfo = pi.GetCustomAttribute<SugarColumn>();                   //新增提取属性

                        if (!comumnInfo.IsIgnore) {                                //新增判断

                            Type colType = pi.PropertyType;

                            //当类型为Nullable<>

                            if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>))) {

                                colType = colType.GetGenericArguments()[0];

                            }

                            result.Columns.Add(pi.Name, colType);

                        }                                             //判断结束括号

                    }

                    for (int i = 0; i < list.Count; i++)

                    {

                        ArrayList tempList = new ArrayList();

                        foreach (PropertyInfo pi in propertys)

                        {

                            var comumnInfo = pi.GetCustomAttribute<SugarColumn>();                  //新增提取属性

                            if (!comumnInfo.IsIgnore) {                                 //新增判断

                                object obj = pi.GetValue(list[i], null);

                                tempList.Add(obj);

                            }                                             //判断结束括号

                        }

                        object[] array = tempList.ToArray();

                        result.LoadDataRow(array, true);

                    }

                }

                return result;

     }

       

         


    0 回复
  • fate sta fate sta VIP0
    2022/11/20

    @虚芦老者:这个最好加个重载

    0 回复
  • fate sta fate sta VIP0
    2022/11/20

    Ignore有些人是需要的

    0 回复
  • OSCAR类型byte[]创建错误问题及修正记录:

    l   环境:华为OpenEuler安装的神通v7

    l   现象:C# byte[] 创建数据库时类型转为 varbinary1),应为clob

     

    l  修改1: public class OscarDbBind : DbBindProvider中的静态量:

            public static List<KeyValuePair<string, CSharpDataType>> MappingTypesConst =

    new List<KeyValuePair<string, CSharpDataType>>(){

    。。。。

             varbinary改为clob

        new KeyValuePair<string, CSharpDataType>("clob",CSharpDataType.byteArray),

     

    l   修改2: public class OscarDbMaintenance : DbMaintenanceProvider中的方法:

            protected override string GetCreateTableSql(string tableName, List<DbColumnInfo> columns)

    增加:

                    if(dataType == "varbinary") {

                        dataType = "clob";

                }

     

    修改后正常。


    0 回复
  • fate sta fate sta VIP0
    2022/11/29

    image.png


    你可以学习一下如何pull代码给我,这样会比较简单,你fork后可以直接提交代码给我

    0 回复
  • fate sta fate sta VIP0
    2022/11/29

    @虚芦老者:blob才进二制吧, clob是文本

    0 回复
  • fate sta fate sta VIP0
    2022/11/29

    image.png



    源码更新了,我按PGSQ改了,应该2边类型一样的。

    0 回复
  • 对!


    0 回复
  • 好,学习一下gitee,应是blob。此外DM数据库绑定的date似乎有问题,应添加一个datetime类型。以后如有问题gitee见。

    0 回复