修复DB2 V11.5版本变量参数化异常问题

This commit is contained in:
Kenton 2025-03-25 16:56:02 +08:00
parent db3dd58302
commit 686c3d249f
5 changed files with 284 additions and 92 deletions

View File

@ -25,6 +25,8 @@ namespace DB2CoreTest.CURD
} }
public static void Insertable() public static void Insertable()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -48,8 +50,15 @@ namespace DB2CoreTest.CURD
}).ExecuteReturnIdentity(); }).ExecuteReturnIdentity();
} }
catch (Exception ex)
{
Console.WriteLine($"Insertable发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
public static void Queryable() public static void Queryable()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -59,9 +68,41 @@ namespace DB2CoreTest.CURD
//查询用户登录 //查询用户登录
var userLogin = db.Queryable<UserLogins>().ToList(); var userLogin = db.Queryable<UserLogins>().ToList();
var user = userInfo.FirstOrDefault();
}
catch (Exception ex)
{
Console.WriteLine($"Queryable发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
public static void QueryableSelect()
{
try
{
// 获取新的数据库实例
var db = DbHelper.GetNewDb();
//查询用户
var userInfo = db.Queryable<UserInfo>().First();
//常量赋值
var alias = "zhangsan";
var isActived = false;
var userInfoConst = db.Queryable<UserInfo>().Select(p => new Student { Name = p.UserName, Alias = alias, IsActived = isActived }).ToList();
//对象赋值
var userInfoObject = db.Queryable<UserInfo>().Select(p => new Student { Name = p.UserName, Alias = userInfo.UserName, IsActived = userInfo.IsActived }).ToList();
}
catch (Exception ex)
{
Console.WriteLine($"QueryableSelect发生异常异常信息{GetFullErrorMessage(ex)}");
}
} }
public static void JoinQuery() public static void JoinQuery()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -72,8 +113,15 @@ namespace DB2CoreTest.CURD
ul.LoginTime, ul.LoginTime,
}).ToList(); }).ToList();
} }
catch (Exception ex)
{
Console.WriteLine($"JoinQuery发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
public static void PageQuery() public static void PageQuery()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -87,8 +135,15 @@ namespace DB2CoreTest.CURD
ul.LoginTime, ul.LoginTime,
}).ToPageList(2, 2); }).ToPageList(2, 2);
} }
catch (Exception ex)
{
Console.WriteLine($"PageQuery发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
public static void OrderBy() public static void OrderBy()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -102,8 +157,15 @@ namespace DB2CoreTest.CURD
ul.LoginTime, ul.LoginTime,
}).OrderBy(ui => ui.UserName).ToList(); }).OrderBy(ui => ui.UserName).ToList();
} }
catch (Exception ex)
{
Console.WriteLine($"OrderBy发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
public static void GroupBy() public static void GroupBy()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -123,8 +185,15 @@ namespace DB2CoreTest.CURD
LoginTime = SqlFunc.AggregateMax(ul.LoginTime), LoginTime = SqlFunc.AggregateMax(ul.LoginTime),
}).OrderBy(ui => ui.UserName).ToList(); }).OrderBy(ui => ui.UserName).ToList();
} }
catch (Exception ex)
{
Console.WriteLine($"GroupBy发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
public static void Updateable() public static void Updateable()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -132,8 +201,15 @@ namespace DB2CoreTest.CURD
//更新用户 //更新用户
var ret = db.Updateable<UserInfo>(p => p.UserName == "test").Where(p => p.UserName == "admin").ExecuteCommand(); var ret = db.Updateable<UserInfo>(p => p.UserName == "test").Where(p => p.UserName == "admin").ExecuteCommand();
} }
catch (Exception ex)
{
Console.WriteLine($"Updateable发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
public static void Deleteable() public static void Deleteable()
{
try
{ {
// 获取新的数据库实例 // 获取新的数据库实例
var db = DbHelper.GetNewDb(); var db = DbHelper.GetNewDb();
@ -148,6 +224,31 @@ namespace DB2CoreTest.CURD
//删除用户登录 //删除用户登录
var deleteUserLoginRet = db.Deleteable(userLoginList).ExecuteCommand(); var deleteUserLoginRet = db.Deleteable(userLoginList).ExecuteCommand();
} }
catch (Exception ex)
{
Console.WriteLine($"Deleteable发生异常异常信息{GetFullErrorMessage(ex)}");
}
}
/// <summary>
/// 获取完整的异常信息,包括堆栈信息
/// </summary>
/// <param name="ex">异常对象</param>
/// <returns>返回完整异常信息</returns>
private static string GetFullErrorMessage(Exception ex)
{
var message = new StringBuilder();
message.AppendLine($"Message:{ex.Message}");
message.AppendLine($"Type: {ex.GetType()}");
message.AppendLine("StackTrace:");
message.AppendLine(ex.StackTrace);
if (ex.InnerException != null)
{
message.AppendLine("InnerException:");
message.AppendLine(GetFullErrorMessage(ex.InnerException));
}
return message.ToString();
}
} }
/// <summary> /// <summary>
@ -191,6 +292,12 @@ namespace DB2CoreTest.CURD
/// </summary> /// </summary>
[SugarColumn(IsNullable = true, ColumnDescription = "用户注册日期")] [SugarColumn(IsNullable = true, ColumnDescription = "用户注册日期")]
public DateTime? RegistrationDate { get; set; } public DateTime? RegistrationDate { get; set; }
/// <summary>
/// 是否启用
/// </summary>
[SugarColumn(ColumnDescription = "是否启用")]
public bool IsActived { get; set; }
} }
/// <summary> /// <summary>
@ -217,4 +324,20 @@ namespace DB2CoreTest.CURD
[SugarColumn(IsNullable = true)] [SugarColumn(IsNullable = true)]
public DateTime LoginTime { get; set; } public DateTime LoginTime { get; set; }
} }
public class Student
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 别名
/// </summary>
public string Alias { get; set; }
/// <summary>
/// 启用
/// </summary>
public bool IsActived { get; set; }
}
} }

View File

@ -8,12 +8,15 @@ public class Program
//CodeFirst.Init(); //CodeFirst.Init();
CodeFirst.Insertable(); CodeFirst.Insertable();
CodeFirst.Queryable(); CodeFirst.Queryable();
CodeFirst.QueryableSelect();
CodeFirst.JoinQuery(); CodeFirst.JoinQuery();
CodeFirst.PageQuery(); CodeFirst.PageQuery();
CodeFirst.OrderBy(); CodeFirst.OrderBy();
CodeFirst.GroupBy(); CodeFirst.GroupBy();
CodeFirst.Updateable(); CodeFirst.Updateable();
CodeFirst.Deleteable(); CodeFirst.Deleteable();
Console.ReadLine();
} }
} }

View File

@ -9,17 +9,17 @@ namespace SqlSugar.DB2
public override string GetDbTypeName(string csharpTypeName) public override string GetDbTypeName(string csharpTypeName)
{ {
if (csharpTypeName == UtilConstants.ByteArrayType.Name) if (csharpTypeName == UtilConstants.ByteArrayType.Name)
return "bytea"; return "varbinary";
if (csharpTypeName.ToLower() == "int32") if (csharpTypeName.ToLower().IsIn("int","int32"))
csharpTypeName = "int"; csharpTypeName = "int";
if (csharpTypeName.ToLower() == "int16") else if (csharpTypeName.ToLower() == "int16")
csharpTypeName = "short"; csharpTypeName = "short";
if (csharpTypeName.ToLower() == "int64") else if (csharpTypeName.ToLower() == "int64")
csharpTypeName = "long"; csharpTypeName = "long";
if (csharpTypeName.ToLower().IsIn("boolean", "bool")) else if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
csharpTypeName = "bool"; csharpTypeName = "bool";
if (csharpTypeName == "DateTimeOffset") else if (csharpTypeName.ToLower().IsIn("dateTime","datetimeoffset"))
csharpTypeName = "DateTime"; csharpTypeName = "dateTime";
var mappings = this.MappingTypes.Where(it => it.Value.ToString().Equals(csharpTypeName, StringComparison.CurrentCultureIgnoreCase)).ToList(); var mappings = this.MappingTypes.Where(it => it.Value.ToString().Equals(csharpTypeName, StringComparison.CurrentCultureIgnoreCase)).ToList();
if (mappings != null && mappings.Count > 0) if (mappings != null && mappings.Count > 0)
return mappings.First().Key; return mappings.First().Key;
@ -30,22 +30,26 @@ namespace SqlSugar.DB2
{ {
dbTypeName = dbTypeName.ToLower(); dbTypeName = dbTypeName.ToLower();
var propertyTypes = MappingTypes.Where(it => it.Value.ToString().ToLower() == dbTypeName || it.Key.ToLower() == dbTypeName); var propertyTypes = MappingTypes.Where(it => it.Value.ToString().ToLower() == dbTypeName || it.Key.ToLower() == dbTypeName);
if (propertyTypes == null) if (propertyTypes == null || !propertyTypes.Any())
{ {
return "other"; return "string";
} }
else if (dbTypeName == "xml" || dbTypeName == "string" || dbTypeName == "jsonb" || dbTypeName == "json") else if (dbTypeName == "xml" || dbTypeName == "string" || dbTypeName == "jsonb" || dbTypeName == "json")
{ {
return "string"; return "string";
} }
else if (dbTypeName == "bpchar")//数据库char datatype 查询出来的时候是 bpchar else if (dbTypeName == "character")
{ {
return "char"; return "char";
} }
if (dbTypeName == "byte[]") else if (dbTypeName == "byte[]")
{ {
return "byte[]"; return "byte[]";
} }
else if (dbTypeName == "boolean")
{
return "char";
}
else if (propertyTypes == null || propertyTypes.Count() == 0) else if (propertyTypes == null || propertyTypes.Count() == 0)
{ {
if (dbTypeName.StartsWith("_")) if (dbTypeName.StartsWith("_"))
@ -82,6 +86,8 @@ namespace SqlSugar.DB2
} }
public static List<KeyValuePair<string, CSharpDataType>> MappingTypesConst = new List<KeyValuePair<string, CSharpDataType>>(){ public static List<KeyValuePair<string, CSharpDataType>> MappingTypesConst = new List<KeyValuePair<string, CSharpDataType>>(){
new KeyValuePair<string, CSharpDataType>("boolean",CSharpDataType.@bool),
new KeyValuePair<string, CSharpDataType>("varbinary",CSharpDataType.@byteArray), new KeyValuePair<string, CSharpDataType>("varbinary",CSharpDataType.@byteArray),
new KeyValuePair<string, CSharpDataType>("binary",CSharpDataType.@byteArray), new KeyValuePair<string, CSharpDataType>("binary",CSharpDataType.@byteArray),
new KeyValuePair<string, CSharpDataType>("blob",CSharpDataType.@byteArray), new KeyValuePair<string, CSharpDataType>("blob",CSharpDataType.@byteArray),
@ -89,6 +95,7 @@ namespace SqlSugar.DB2
new KeyValuePair<string, CSharpDataType>("varchar",CSharpDataType.@string), new KeyValuePair<string, CSharpDataType>("varchar",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("char",CSharpDataType.@string), new KeyValuePair<string, CSharpDataType>("char",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("clob",CSharpDataType.@string), new KeyValuePair<string, CSharpDataType>("clob",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("vargraphic",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("timestamp",CSharpDataType.@DateTime), new KeyValuePair<string, CSharpDataType>("timestamp",CSharpDataType.@DateTime),
new KeyValuePair<string, CSharpDataType>("date",CSharpDataType.@DateTime), new KeyValuePair<string, CSharpDataType>("date",CSharpDataType.@DateTime),
@ -113,5 +120,28 @@ namespace SqlSugar.DB2
return new List<string>() { "int32", "datetime", "decimal", "double", "byte" }; return new List<string>() { "int32", "datetime", "decimal", "double", "byte" };
} }
} }
public static List<KeyValuePair<string, System.Data.DbType>> MappingDbTypesConst = new List<KeyValuePair<string, System.Data.DbType>>(){
new KeyValuePair<string, System.Data.DbType>("boolean",System.Data.DbType.Boolean),
new KeyValuePair<string, System.Data.DbType>("varbinary",System.Data.DbType.Byte),
new KeyValuePair<string, System.Data.DbType>("varchar",System.Data.DbType.String),
new KeyValuePair<string, System.Data.DbType>("date",System.Data.DbType.Date),
new KeyValuePair<string, System.Data.DbType>("time",System.Data.DbType.Time),
new KeyValuePair<string, System.Data.DbType>("timestamp",System.Data.DbType.DateTime),
new KeyValuePair<string, System.Data.DbType>("timestamp",System.Data.DbType.DateTime2),
new KeyValuePair<string, System.Data.DbType>("timestamp",System.Data.DbType.DateTimeOffset),
new KeyValuePair<string, System.Data.DbType>("integer",System.Data.DbType.Int32),
new KeyValuePair<string, System.Data.DbType>("smallint",System.Data.DbType.Int16),
new KeyValuePair<string, System.Data.DbType>("bigint",System.Data.DbType.Int64),
new KeyValuePair<string, System.Data.DbType>("float",System.Data.DbType.Single),
new KeyValuePair<string, System.Data.DbType>("double",System.Data.DbType.Double),
new KeyValuePair<string, System.Data.DbType>("numeric",System.Data.DbType.VarNumeric),
};
} }
} }

View File

@ -1,4 +1,5 @@
using System.Linq; using System.Drawing;
using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -6,6 +7,11 @@ namespace SqlSugar.DB2
{ {
public partial class DB2QueryBuilder : QueryBuilder public partial class DB2QueryBuilder : QueryBuilder
{ {
/// <summary>
/// 静态常量标志
/// </summary>
private string[] constanFlag = new string[] { "@const", "@constan" };
#region Sql Template #region Sql Template
public override string PageTempalte public override string PageTempalte
{ {
@ -133,11 +139,41 @@ namespace SqlSugar.DB2
{ {
result = SubToListMethod(result); result = SubToListMethod(result);
} }
result = ConstanParameterized(result);
return result; return result;
//return result.Replace("\"", "").ToUpper(); //return result.Replace("\"", "").ToUpper();
} }
} }
/// <summary>
/// 常量参数化
/// </summary>
/// <returns></returns>
private string ConstanParameterized(string selectSql)
{
var selectParams = selectSql.Split(",").Select(p =>
{
if (!constanFlag.Any(t => p.ToLower().Contains(t))) return p;
var parameter = this.Parameters.FirstOrDefault(t => p.Contains(t.ParameterName));
if (parameter == null) return p;
var dbType = DB2DbBind.MappingDbTypesConst.FirstOrDefault(t => parameter.DbType == t.Value);
if (default(KeyValuePair<string, System.Data.DbType>).Equals(dbType)) return p;
var parameterized = string.Empty;
if (dbType.Value == System.Data.DbType.String)
{
var size = string.IsNullOrEmpty(parameter.Value?.ToString()) ? 1 : System.Text.Encoding.Default.GetBytes(parameter.Value?.ToString()).Length;;
parameterized = $"{dbType.Key.ToUpper()}({size})";
}
else
{
parameterized = $"{dbType.Key.ToUpper()}";
}
return p.Replace(parameter.ParameterName, $" CAST({parameter.ParameterName} AS {parameterized}) ");
});
return string.Join(",", selectParams);
}
#endregion #endregion
} }
} }

View File

@ -17,7 +17,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Net.IBM.Data.Db2" Version="8.0.0.300" /> <PackageReference Include="Net.IBM.Data.Db2" Version="8.0.0.310" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>