From 270a6b46f79259498a6b63c0ce47dc73ddd31fa1 Mon Sep 17 00:00:00 2001 From: tdx Date: Tue, 9 Dec 2025 08:57:53 +0000 Subject: [PATCH] SVN r1074 SVN-Revision: r1074 --- 插件库/Lskj.Core/SqlHelper.cs | 304 +++++++++++++++++++++++----------- 1 file changed, 209 insertions(+), 95 deletions(-) diff --git a/插件库/Lskj.Core/SqlHelper.cs b/插件库/Lskj.Core/SqlHelper.cs index ea11cdf..1c38095 100644 --- a/插件库/Lskj.Core/SqlHelper.cs +++ b/插件库/Lskj.Core/SqlHelper.cs @@ -1,4 +1,5 @@ -using Kdbndp; +using Dm; +using Kdbndp; using KdbndpTypes; using System; using System.Data; @@ -6,6 +7,7 @@ using System.Data.Common; using System.Data.SqlClient; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace Lskj.Core { @@ -366,7 +368,7 @@ namespace Lskj.Core int num = 0; try { - if (_connection is KdbndpConnection) + if (connectionType == ConnectionType.KdbnServer || connectionType == ConnectionType.DmServer) { if (cmdType == CommandType.StoredProcedure) { @@ -379,8 +381,7 @@ namespace Lskj.Core { DataTable resultTable = dataSet.Tables[dataSet.Tables.Count - 1]; int.TryParse(resultTable.Rows[0]["execcount"] + "", out num); - string returnValue = resultTable.Rows[0]["returnValue"] + ""; - string outputValue = resultTable.Rows[0]["outputValue"] + ""; + object returnValue = resultTable.Columns.Contains("returnValue") ? resultTable.Rows[0]["returnValue"] : ""; for (int i = 0; i < commandParameters.Length; i++) { DbParameter sqlParameter = commandParameters[i]; @@ -390,7 +391,7 @@ namespace Lskj.Core } if (sqlParameter.Direction == ParameterDirection.Output) { - sqlParameter.Value = outputValue; + sqlParameter.Value = resultTable.Rows[0][$"outputValue{i}"]; } } } @@ -401,7 +402,7 @@ namespace Lskj.Core num = cmd.ExecuteNonQuery(); } } - else if (_connection is SqlConnection) + else if (connectionType == ConnectionType.SqlServer) { PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters); num = cmd.ExecuteNonQuery(); @@ -445,7 +446,7 @@ namespace Lskj.Core int num = 0; try { - if (_connection is KdbndpConnection) + if (_connection is KdbndpConnection || connectionType == ConnectionType.DmServer) { if (cmdType == CommandType.StoredProcedure) { @@ -458,8 +459,7 @@ namespace Lskj.Core { DataTable resultTable = dataSet.Tables[dataSet.Tables.Count - 1]; int.TryParse(resultTable.Rows[0]["execcount"] + "", out num); - string returnValue = resultTable.Rows[0]["returnValue"] + ""; - string outputValue = resultTable.Rows[0]["outputValue"] + ""; + object returnValue = resultTable.Columns.Contains("returnValue") ? resultTable.Rows[0]["returnValue"] : ""; for (int i = 0; i < commandParameters.Length; i++) { DbParameter sqlParameter = commandParameters[i]; @@ -469,7 +469,7 @@ namespace Lskj.Core } if (sqlParameter.Direction == ParameterDirection.Output) { - sqlParameter.Value = outputValue; + sqlParameter.Value = resultTable.Rows[0][$"outputValue{i}"]; } } } @@ -716,13 +716,23 @@ namespace Lskj.Core { try { - if (connectionType == ConnectionType.KdbnServer) + if (connectionType == ConnectionType.KdbnServer || connectionType == ConnectionType.DmServer) { - if (Connection.State == ConnectionState.Open) + if (connectionType == ConnectionType.KdbnServer) { - Connection.Close(); + if (Connection.State == ConnectionState.Open) + { + Connection.Close(); + } + Connection.Open(); + } + else if (connectionType == ConnectionType.DmServer) + { + if (Connection.State != ConnectionState.Open) + { + Connection.Open(); + } } - Connection.Open(); cmd.Connection = Connection; cmd.CommandTimeout = CommandTimeout; cmd.CommandText = cmdText; @@ -730,22 +740,50 @@ namespace Lskj.Core { cmd.Transaction = trans; } - DbParameter[] kdbndpParameters = CastKdbndpParameterArray(cmdParms); + DbParameter[] dbParameters = CastParameterArray(cmdParms); if (cmdType == CommandType.StoredProcedure) { string execSqlParas = ""; + string outputParas = ""; + StringBuilder stringBuilder = new StringBuilder(); + bool hasReturnPara = false; if (cmdParms != null) { - foreach (KdbndpParameter parameter in kdbndpParameters) + if (connectionType == ConnectionType.DmServer) { + stringBuilder.AppendLine($"declare"); + } + for (int i = 0; i < dbParameters.Length; i++) + { + DbParameter parameter = dbParameters[i]; if (parameter.Direction == ParameterDirection.ReturnValue) { + if (connectionType == ConnectionType.KdbnServer) + { + stringBuilder.AppendLine($"declare @returnValue varchar(4000);"); + } + else if (connectionType == ConnectionType.DmServer) + { + stringBuilder.AppendLine($"returnValue varchar(4000);"); + } + hasReturnPara = true; continue; } string value = (parameter.Value + "").Replace("'", "''"); if (parameter.Direction == ParameterDirection.Output) { - execSqlParas += $"@outputValue output,"; + if (connectionType == ConnectionType.KdbnServer) + { + stringBuilder.AppendLine($"declare @outputValue{i} varchar(4000);"); + outputParas += $"@outputValue{i} outputValue{i},"; + execSqlParas += $"@outputValue{i} output,"; + } + else if (connectionType == ConnectionType.DmServer) + { + stringBuilder.AppendLine($"outputValue{i} varchar(4000);"); + outputParas += $"outputValue{i} outputValue{i},"; + execSqlParas += $"outputValue{i},"; + } } else { @@ -753,27 +791,43 @@ namespace Lskj.Core } } } - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendLine("declare @returnValue varchar(max)"); - stringBuilder.AppendLine("declare @outputValue varchar(max)"); - stringBuilder.AppendLine($"exec @returnValue = {cmdText} {execSqlParas.TrimEnd(',')}"); - stringBuilder.AppendLine("select @@ROWCOUNT execcount,@returnValue returnValue,@outputValue outputValue"); + if (connectionType == ConnectionType.KdbnServer) + { + stringBuilder.AppendLine($"exec @returnValue = {cmdText} {execSqlParas.TrimEnd(',')};"); + stringBuilder.AppendLine($"select @@ROWCOUNT execcount,@returnValue returnValue{(outputParas.Length > 0 ? $",{outputParas.TrimEnd(',')}" : "")};"); + } + else if (connectionType == ConnectionType.DmServer) + { + stringBuilder.AppendLine($"begin"); + stringBuilder.AppendLine($"call {cmdText} ({(hasReturnPara ? "returnValue," : "")}{execSqlParas.TrimEnd(',')});"); + stringBuilder.AppendLine($"select SQL%ROWCOUNT execcount{(hasReturnPara ? ",returnValue returnValue" : "")}{(outputParas.Length > 0 ? $",{outputParas.TrimEnd(',')}" : "")};"); + stringBuilder.AppendLine($"end"); + } cmd.CommandType = CommandType.Text; cmd.CommandText = stringBuilder.ToString(); } else { cmd.CommandText = cmdText; + if (connectionType == ConnectionType.DmServer) + { + cmd.CommandText = Regex.Replace(cmd.CommandText, @"\bdbo\.", "", RegexOptions.IgnoreCase); + cmd.CommandText = Regex.Replace(cmd.CommandText, @"(? /// /// - public static DbParameter[] CastKdbndpParameterArray(DbParameter[] commandParameters) + public static DbParameter[] CastParameterArray(DbParameter[] commandParameters) { if (commandParameters == null) { return null; } - DbParameter[] kdbndpParameters = new DbParameter[commandParameters.Length]; + + DbParameter[] dbParameters = new DbParameter[commandParameters.Length]; for (int i = 0; i < commandParameters.Length; i++) { - DbParameter sqlParameter = commandParameters[i]; - kdbndpParameters[i] = CastKdbndpParameter(sqlParameter); + DbParameter parameter = commandParameters[i]; + dbParameters[i] = CastDbParameter(parameter); } - return kdbndpParameters; + return dbParameters; } /// /// 转换为人大金仓参数 /// /// /// - public static DbParameter CastKdbndpParameter(DbParameter parameter) + public static DbParameter CastDbParameter(DbParameter parameter) { - KdbndpParameter kdbndpParameter = new KdbndpParameter(); - KdbndpDbType kdbndpDbType = KdbndpDbType.Text; + DbParameter dbParameter = dbFactory.CreateParameter(); if (parameter is SqlParameter sqlParameter) { - switch (sqlParameter.SqlDbType) + if (dbParameter is KdbndpParameter kdbndpParameter) { - case SqlDbType.BigInt: - kdbndpDbType = KdbndpDbType.SqlServer_Bigint; - break; - case SqlDbType.Binary: - kdbndpDbType = KdbndpDbType.SqlServer_Binary; - break; - case SqlDbType.Bit: - kdbndpDbType = KdbndpDbType.Bit; - break; - case SqlDbType.Char: - kdbndpDbType = KdbndpDbType.Char; - break; - case SqlDbType.DateTime: - kdbndpDbType = KdbndpDbType.DateTime; - break; - case SqlDbType.Decimal: - kdbndpDbType = KdbndpDbType.SqlServer_Numeric; - break; - case SqlDbType.Float: - kdbndpDbType = KdbndpDbType.SqlServer_Float; - break; - case SqlDbType.Image: - kdbndpDbType = KdbndpDbType.Image; - break; - case SqlDbType.Int: - kdbndpDbType = KdbndpDbType.SqlServer_Int; - break; - case SqlDbType.Money: - kdbndpDbType = KdbndpDbType.SqlServer_Money; - break; - case SqlDbType.NChar: - kdbndpDbType = KdbndpDbType.NChar; - break; - case SqlDbType.NText: - kdbndpDbType = KdbndpDbType.Ntext; - break; - case SqlDbType.NVarChar: - kdbndpDbType = KdbndpDbType.Text; - break; - case SqlDbType.Real: - kdbndpDbType = KdbndpDbType.SqlServer_Real; - break; - case SqlDbType.SmallDateTime: - kdbndpDbType = KdbndpDbType.SmallDateTime; - break; - case SqlDbType.SmallInt: - kdbndpDbType = KdbndpDbType.SqlServer_Smallint; - break; - case SqlDbType.Text: - kdbndpDbType = KdbndpDbType.Text; - break; - case SqlDbType.Timestamp: - kdbndpDbType = KdbndpDbType.Timestamp; - break; - case SqlDbType.TinyInt: - kdbndpDbType = KdbndpDbType.SqlServer_Tinyint; - break; - case SqlDbType.VarBinary: - kdbndpDbType = KdbndpDbType.SqlServer_VarBinary; - break; - case SqlDbType.VarChar: - kdbndp \ No newline at end of file + KdbndpDbType kdbndpDbType = KdbndpDbType.Text; + switch (sqlParameter.SqlDbType) + { + case SqlDbType.BigInt: + kdbndpDbType = KdbndpDbType.SqlServer_Bigint; + break; + case SqlDbType.Binary: + kdbndpDbType = KdbndpDbType.SqlServer_Binary; + break; + case SqlDbType.Bit: + kdbndpDbType = KdbndpDbType.Bit; + break; + case SqlDbType.Char: + kdbndpDbType = KdbndpDbType.Char; + break; + case SqlDbType.DateTime: + kdbndpDbType = KdbndpDbType.DateTime; + break; + case SqlDbType.Decimal: + kdbndpDbType = KdbndpDbType.SqlServer_Numeric; + break; + case SqlDbType.Float: + kdbndpDbType = KdbndpDbType.SqlServer_Float; + break; + case SqlDbType.Image: + kdbndpDbType = KdbndpDbType.Image; + break; + case SqlDbType.Int: + kdbndpDbType = KdbndpDbType.SqlServer_Int; + break; + case SqlDbType.Money: + kdbndpDbType = KdbndpDbType.SqlServer_Money; + break; + case SqlDbType.NChar: + kdbndpDbType = KdbndpDbType.NChar; + break; + case SqlDbType.NText: + kdbndpDbType = KdbndpDbType.Ntext; + break; + case SqlDbType.NVarChar: + kdbndpDbType = KdbndpDbType.Text; + break; + case SqlDbType.Real: + kdbndpDbType = KdbndpDbType.SqlServer_Real; + break; + case SqlDbType.SmallDateTime: + kdbndpDbType = KdbndpDbType.SmallDateTime; + break; + case SqlDbType.SmallInt: + kdbndpDbType = KdbndpDbType.SqlServer_Smallint; + break; + case SqlDbType.Text: + kdbndpDbType = KdbndpDbType.Text; + break; + case SqlDbType.Timestamp: + kdbndpDbType = KdbndpDbType.Timestamp; + break; + case SqlDbType.TinyInt: + kdbndpDbType = KdbndpDbType.SqlServer_Tinyint; + break; + case SqlDbType.VarBinary: + kdbndpDbType = KdbndpDbType.SqlServer_VarBinary; + break; + case SqlDbType.VarChar: + kdbndpDbType = KdbndpDbType.Varchar; + break; + case SqlDbType.Xml: + kdbndpDbType = KdbndpDbType.Xml; + break; + case SqlDbType.Date: + kdbndpDbType = KdbndpDbType.Date; + break; + case SqlDbType.Time: + kdbndpDbType = KdbndpDbType.Time; + break; + case SqlDbType.DateTime2: + kdbndpDbType = KdbndpDbType.DateTime2; + break; + } + kdbndpParameter.KdbndpDbType = kdbndpDbType; + } + else if (dbParameter is DmParameter dmParameter) + { + DmDbType dmDbType = DmDbType.Text; + switch (sqlParameter.SqlDbType) + { + case SqlDbType.BigInt: + dmDbType = DmDbType.Int64; + break; + case SqlDbType.Binary: + dmDbType = DmDbType.Binary; + break; + case SqlDbType.Bit: + dmDbType = DmDbType.Bit; + break; + case SqlDbType.Char: + dmDbType = DmDbType.Char; + break; + case SqlDbType.DateTime: + dmDbType = DmDbType.DateTime; + break; + case SqlDbType.Decimal: + dmDbType = DmDbType.Decimal; + break; + case SqlDbType.Float: + dmDbType = DmDbType.Float; + break; + case SqlDbType.Int: + dmDbType = DmDbType.Int32; + break; + break; + case SqlDbType.NText: + dmDbType = DmDbType.Text; + break; + case SqlDbType.NVarChar: + dmDbType = DmDbType.Text; + break; + case SqlDbType.SmallInt: + dmDbType = DmDbType.Int16; + break; + case SqlDbType.Text: + dmDbType = DmDbType \ No newline at end of file