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

偶见sqlsugar,试用结果不错!目前为止测试了五种数据库,也发现了两个问题:
二进制入库多存在问题,经调整不报错了。
postgresql/opengauss创建数据库索引问题。
老者做的相应修改如下:
1、sqlite dateaddbytype 开始和结束日期颠倒了
SqliteExpressionContext.cs【21行】DateDiff方法参数对应关系错误:
修正后:24行: var begin = model.Args[2].MemberName;
25行: var end = model.Args[1].MemberName;
2、list转数据表
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 VIP0
2022/11/13好的幸苦了
0 回复 -
fate sta VIP0
2022/11/13等我抽空一个一个和你对一下
0 回复 -
fate sta VIP0
2022/11/13你这个不是标准的PGSQL吧
0 回复 -
fate sta VIP0
2022/11/13疑问1:PGSQL索引方法报错并未重现(你是标准PGSQL吗)
0 回复 -
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 VIP0
2022/11/14修复功能
1。CodeFirst byte[]多库统一用法 已经支持,我的改法后期扩展性更好,没有更新基类方法
2. DataTable ListToDataTable<T>(List<T> list) 添加了非null判断
0 回复 -
fate sta VIP0
2022/11/14github已经更新
0 回复 -
虚芦老者 VIP0
2022/11/14CodeFirst 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 VIP0
2022/11/14好的,我按你用法看一下是不是PGSQL也支持,如果支持那就换成你 这种写法
0 回复 -
fate sta VIP0
2022/11/14protected override string IsAnyIndexSql
{
get
{
return " SELECT count(1) WHERE upper('{0}') IN ( SELECT upper(indexname) FROM pg_indexes )";
}
}
pgsql和OpenGauss都支持的索引 我这么改了发布到github了你看看能不能满足你的要求
0 回复 -
虚芦老者 VIP0
2022/11/19新发现的问题,修改后就可支持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 VIP0
2022/11/20@虚芦老者:这个最好加个重载
0 回复 -
fate sta VIP0
2022/11/20Ignore有些人是需要的
0 回复 -
虚芦老者 VIP0
2022/11/29OSCAR类型byte[]创建错误问题及修正记录:
l 环境:华为OpenEuler安装的神通v7。
l 现象:C# byte[] 创建数据库时类型转为 varbinary(1),应为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 VIP0
2022/11/29你可以学习一下如何pull代码给我,这样会比较简单,你fork后可以直接提交代码给我
0 回复 -
fate sta VIP0
2022/11/29@虚芦老者:blob才进二制吧, clob是文本
0 回复 -
fate sta VIP0
2022/11/29源码更新了,我按PGSQ改了,应该2边类型一样的。
0 回复 -
虚芦老者 VIP0
2022/11/30对!
0 回复 -
虚芦老者 VIP0
2022/11/30好,学习一下gitee,应是blob。此外DM数据库绑定的date似乎有问题,应添加一个datetime类型。以后如有问题gitee见。
0 回复