修复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

@@ -9,17 +9,17 @@ namespace SqlSugar.DB2
public override string GetDbTypeName(string csharpTypeName)
{
if (csharpTypeName == UtilConstants.ByteArrayType.Name)
return "bytea";
if (csharpTypeName.ToLower() == "int32")
return "varbinary";
if (csharpTypeName.ToLower().IsIn("int","int32"))
csharpTypeName = "int";
if (csharpTypeName.ToLower() == "int16")
else if (csharpTypeName.ToLower() == "int16")
csharpTypeName = "short";
if (csharpTypeName.ToLower() == "int64")
else if (csharpTypeName.ToLower() == "int64")
csharpTypeName = "long";
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
else if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
csharpTypeName = "bool";
if (csharpTypeName == "DateTimeOffset")
csharpTypeName = "DateTime";
else if (csharpTypeName.ToLower().IsIn("dateTime","datetimeoffset"))
csharpTypeName = "dateTime";
var mappings = this.MappingTypes.Where(it => it.Value.ToString().Equals(csharpTypeName, StringComparison.CurrentCultureIgnoreCase)).ToList();
if (mappings != null && mappings.Count > 0)
return mappings.First().Key;
@@ -30,22 +30,26 @@ namespace SqlSugar.DB2
{
dbTypeName = dbTypeName.ToLower();
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")
{
return "string";
}
else if (dbTypeName == "bpchar")//数据库char datatype 查询出来的时候是 bpchar
else if (dbTypeName == "character")
{
return "char";
}
if (dbTypeName == "byte[]")
else if (dbTypeName == "byte[]")
{
return "byte[]";
}
else if (dbTypeName == "boolean")
{
return "char";
}
else if (propertyTypes == null || propertyTypes.Count() == 0)
{
if (dbTypeName.StartsWith("_"))
@@ -82,6 +86,8 @@ namespace SqlSugar.DB2
}
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>("binary",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>("char",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>("date",CSharpDataType.@DateTime),
@@ -113,5 +120,28 @@ namespace SqlSugar.DB2
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.RegularExpressions;
@@ -6,6 +7,11 @@ namespace SqlSugar.DB2
{
public partial class DB2QueryBuilder : QueryBuilder
{
/// <summary>
/// 静态常量标志
/// </summary>
private string[] constanFlag = new string[] { "@const", "@constan" };
#region Sql Template
public override string PageTempalte
{
@@ -133,11 +139,41 @@ namespace SqlSugar.DB2
{
result = SubToListMethod(result);
}
result = ConstanParameterized(result);
return result;
//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
}
}