Files
lserp_cs_6.0/插件库/Lskj.Core/SqlHelper.cs
T
2026-07-02 10:11:39 +00:00

1089 lines
49 KiB
C#

using Dm;
using Kdbndp;
using KdbndpTypes;
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Lskj.Core
{
/// <summary>
/// 数据库连接类型
/// </summary>
public enum ConnectionType
{
SqlServer = 0,
KdbnServer = 1,
DmServer = 2
}
public static class SqlHelper
{
/// <summary>
/// 连接类型
/// </summary>
private static ConnectionType connectionType = ConnectionType.SqlServer;
public static ConnectionType ConnectionType
{
get { return connectionType; }
set { connectionType = value; }
}
/// <summary>
/// 数据连接工厂
/// </summary>
public static DbProviderFactory dbFactory;
/// <summary>
/// 数据连接
/// </summary>
public static DbConnection _connection;
/// <summary>
/// 请求超时时间
/// </summary>
public static int CommandTimeout;
/// <summary>
/// 上一次失败的sql
/// </summary>
public static string LastFailureSql;
/// <summary>
/// <para>说明:是否已经连接数据库</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2024-3-5 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <returns></returns>
public static bool IsConnect()
{
bool isConnect = _connection.State == ConnectionState.Open;
return isConnect;
}
#region ExecuteAdapter
/// <summary>
/// <para>说明:获取适配器</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>SqlDataAdapter.</returns>
public static DbDataAdapter ExecuteAdapter(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
{
DbDataAdapter adapter = dbFactory.CreateDataAdapter();
DbCommand cmd = dbFactory.CreateCommand();
try
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
adapter.SelectCommand = cmd;
}
catch
{
throw;
}
return adapter;
}
/// <summary>
/// <para>说明:获取适配器</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <returns>SqlDataAdapter.</returns>
public static DbDataAdapter ExecuteAdapter(CommandType cmdType, string cmdText)
{
DbDataAdapter adapter = dbFactory.CreateDataAdapter();
DbCommand cmd = dbFactory.CreateCommand();
try
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, null);
adapter.SelectCommand = cmd;
}
catch
{
throw;
}
return adapter;
}
#endregion
#region ExecuteDataTable
/// <summary>
/// <para>说明:执行sql返回DataTable</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdText">The command text.</param>
/// <returns>DataTable.</returns>
public static DataTable ExecuteDataTable(string cmdText)
{
return ExecuteDataSet(cmdText).Tables[0];
}
/// <summary>
/// <para>说明:执行sql返回DataTable</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdText">The command text.</param>
/// <returns>DataTable.</returns>
public static DataTable ExecuteDataTable(string cmdText, params DbParameter[] commandParameters)
{
return ExecuteDataSet(CommandType.Text, cmdText, "temp", commandParameters).Tables[0];
}
/// <summary>
/// <para>说明:执行sql返回指定字段值</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="fieldName">Name of the field.</param>
/// <param name="cmdText">The command text.</param>
/// <returns>System.Object.</returns>
public static object ExecuteObject(string fieldName, string cmdText)
{
object result = null;
try
{
result = ExecuteDataSet(cmdText).Tables[0].Rows[0][fieldName];
}
catch (Exception)
{
}
return result;
}
/// <summary>
/// <para>说明:执行sql返回指定字段值</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="fieldName">Name of the field.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>System.Object.</returns>
public static object ExecuteObject(string fieldName, string cmdText, params DbParameter[] commandParameters)
{
object result = null;
try
{
result = ExecuteDataSet(CommandType.Text, cmdText, "temp", commandParameters).Tables[0].Rows[0][fieldName];
}
catch (Exception)
{
}
return result;
}
/// <summary>
/// <para>说明:执行sql返回指定字段值</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="fieldName">Name of the field.</param>
/// <param name="cmdText">The command text.</param>
/// <returns>System.Object.</returns>
public static string ExecuteString(string fieldName, string cmdText)
{
object obj = ExecuteObject(fieldName, cmdText);
return obj == null ? "" : obj.ToString();
}
/// <summary>
/// <para>说明:执行sql返回指定字段值</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="fieldName">Name of the field.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>System.String.</returns>
public static string ExecuteString(string fieldName, string cmdText, params DbParameter[] commandParameters)
{
object obj = ExecuteObject(fieldName, cmdText, commandParameters);
return obj == null ? "" : obj.ToString();
}
#endregion
#region ExecuteDataSet
/// <summary>
/// <para>说明:查询结果集</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-07-24 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="tabName">Name of the tab.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>DataSet.</returns>
public static DataSet ExecuteDataSet(int cmdType, string cmdText, string tabName, params DbParameter[] commandParameters)
{
CommandType _cmdType = CommandType.Text;
switch (cmdType)
{
case 4:
_cmdType = CommandType.StoredProcedure;
break;
case 512:
_cmdType = CommandType.TableDirect;
break;
}
return ExecuteDataSet(_cmdType, cmdText, tabName, commandParameters);
}
/// <summary>
/// <para>说明:查询结果集</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-07-24 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="cmdType">语句类型存储过程或者sql语句</param>
/// <param name="cmdText">执行内容</param>
/// <param name="tabName">表名</param>
/// <param name="commandParameters">参数</param>
/// <returns>DataSet.</returns>
public static DataSet ExecuteDataSet(CommandType cmdType, string cmdText, string tabName, params DbParameter[] commandParameters)
{
LastFailureSql = string.Empty;
DataSet set2;
DbCommand cmd = dbFactory.CreateCommand();
try
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);//sql参数处理
DbDataAdapter adapter = dbFactory.CreateDataAdapter();
adapter.SelectCommand = cmd;//创建对象,与sql命令对象绑定
DataSet dataSet = new DataSet();
adapter.Fill(dataSet, tabName);//填充数据。第二个参数是数据集中内存表的名字,可以与数据库中的不同
if (dataSet.Tables.Count > 0 && commandParameters != null && connectionType == ConnectionType.DmServer)
{
DataTable resultTable = dataSet.Tables[dataSet.Tables.Count - 1];
object returnValue = resultTable.Columns.Contains("returnValue") ? resultTable.Rows[0]["returnValue"] : "";
for (int i = 0; i < commandParameters.Length; i++)
{
DbParameter sqlParameter = commandParameters[i];
if (sqlParameter.Direction == ParameterDirection.ReturnValue)
{
sqlParameter.Value = returnValue;
}
if (sqlParameter.Direction == ParameterDirection.Output || sqlParameter.Direction == ParameterDirection.InputOutput)
{
sqlParameter.Value = resultTable.Rows[0][$"outputValue{i}"];
}
}
if (returnValue + "" == "-1") LastFailureSql = cmd.CommandText;
}
//adapter.FillSchema(dataSet, SchemaType.Mapped, tabName);
set2 = dataSet;
}
catch (Exception e)
{
if (e.Message.StartsWith("在从服务器接收结果时发生传输级错误") ||
e.Message.StartsWith("在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误") ||
e.Message.StartsWith("在向服务器发送请求时发生传输级错误"))
{
throw new Exception("无法连接服务器,请检查网络连接.");
}
else
{
throw new Exception(e.Message + " SQL=[ " + cmdText + " ]", e);
//throw;
}
}
finally
{
cmd.Dispose();
}
return set2;
}
/// <summary>
/// <para>说明:查询结果集</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">语句类型存储过程或者sql语句</param>
/// <param name="cmdText">执行内容</param>
/// <param name="tabName">表名</param>
/// <returns>DataSet.</returns>
public static DataSet ExecuteDataSet(CommandType cmdType, string cmdText, string tabName)
{
return ExecuteDataSet(cmdType, cmdText, tabName, null);
}
/// <summary>
/// <para>说明:查询结果集</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdText">执行内容</param>
/// <returns>DataSet.</returns>
public static DataSet ExecuteDataSet(string cmdText)
{
return ExecuteDataSet(CommandType.Text, cmdText, "temp");
}
/// <summary>
/// <para>说明:查询结果集</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="procedureName">Name of the procedure.</param>
/// <param name="tabName">表名</param>
/// <param name="parameterNames">The parameter names.</param>
/// <param name="parameterValues">The parameter values.</param>
/// <returns>DataSet.</returns>
public static DataSet ExecuteDataSet(string procedureName, string tabName, string[] parameterNames, DbParameter[] parameterValues)
{
LastFailureSql = string.Empty;
DataSet set2;
try
{
DbCommand cmd = dbFactory.CreateCommand();
cmd.CommandText = procedureName;
cmd.CommandType = CommandType.StoredProcedure;
if (parameterNames != null && parameterValues != null)
{
for (int i = 0; i < parameterNames.Length && i < parameterValues.Length; i++)
{
DbParameter dbParameter = dbFactory.CreateParameter();
dbParameter.ParameterName = parameterNames[i];
dbParameter.Value = parameterValues[i];
cmd.Parameters.Add(dbParameter);
}
}
DbDataAdapter adapter = dbFactory.CreateDataAdapter();
adapter.SelectCommand = cmd;
DataSet dataSet = new DataSet();
adapter.Fill(dataSet, tabName);
if (dataSet.Tables.Count > 0 && parameterValues != null && connectionType == ConnectionType.DmServer)
{
DataTable resultTable = dataSet.Tables[dataSet.Tables.Count - 1];
object returnValue = resultTable.Columns.Contains("returnValue") ? resultTable.Rows[0]["returnValue"] : "";
for (int i = 0; i < parameterValues.Length; i++)
{
DbParameter sqlParameter = parameterValues[i];
if (sqlParameter.Direction == ParameterDirection.ReturnValue)
{
sqlParameter.Value = returnValue;
}
if (sqlParameter.Direction == ParameterDirection.Output || sqlParameter.Direction == ParameterDirection.InputOutput)
{
sqlParameter.Value = resultTable.Rows[0][$"outputValue{i}"];
}
}
if (returnValue + "" == "-1") LastFailureSql = cmd.CommandText;
}
set2 = dataSet;
}
catch
{
throw;
}
return set2;
}
#endregion
#region ExecuteNonQuery
/// <summary>
/// <para>说明:执行sql语句或者存储过程</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>System.Int32.</returns>
public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
{
LastFailureSql = string.Empty;
DbCommand cmd = dbFactory.CreateCommand();
int num = 0;
try
{
if (connectionType == ConnectionType.KdbnServer || connectionType == ConnectionType.DmServer)
{
if (cmdType == CommandType.StoredProcedure)
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
DbDataAdapter adapter = dbFactory.CreateDataAdapter();
adapter.SelectCommand = cmd;
DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
if (dataSet.Tables.Count > 0 && commandParameters != null && connectionType == ConnectionType.DmServer)
{
DataTable resultTable = dataSet.Tables[dataSet.Tables.Count - 1];
int.TryParse(resultTable.Rows[0]["execcount"] + "", out num);
object returnValue = resultTable.Columns.Contains("returnValue") ? resultTable.Rows[0]["returnValue"] : "";
for (int i = 0; i < commandParameters.Length; i++)
{
DbParameter sqlParameter = commandParameters[i];
if (sqlParameter.Direction == ParameterDirection.ReturnValue)
{
sqlParameter.Value = returnValue;
}
if (sqlParameter.Direction == ParameterDirection.Output || sqlParameter.Direction == ParameterDirection.InputOutput)
{
sqlParameter.Value = resultTable.Rows[0][$"outputValue{i}"];
}
}
if (returnValue + "" == "-1") LastFailureSql = cmd.CommandText;
}
}
else
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
num = cmd.ExecuteNonQuery();
}
}
else if (connectionType == ConnectionType.SqlServer)
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
num = cmd.ExecuteNonQuery();
}
cmd.Parameters.Clear();
}
catch (Exception e)
{
if (e.Message.StartsWith("在从服务器接收结果时发生传输级错误") ||
e.Message.StartsWith("在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误") ||
e.Message.StartsWith("在向服务器发送请求时发生传输级错误"))
{
throw new Exception("无法连接服务器,请检查网络连接.");
}
else
{
throw new Exception(e.Message + " SQL=[ " + cmdText + " ]", e);
//throw;
}
}
finally
{
cmd.Dispose();
}
return num;
}
/// <summary>
/// <para>说明:执行sql语句或者存储过程,带事务</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="Trans"></param>
/// <param name="commandParameters"></param>
/// <returns></returns>
public static int ExecuteNonQuery(CommandType cmdType, string cmdText, DbTransaction Trans, int a, params DbParameter[] commandParameters)
{
LastFailureSql = string.Empty;
DbCommand cmd = dbFactory.CreateCommand();
int num = 0;
try
{
if (_connection is KdbndpConnection || connectionType == ConnectionType.DmServer)
{
if (cmdType == CommandType.StoredProcedure)
{
PrepareCommand(cmd, _connection, Trans, cmdType, cmdText, commandParameters);
DbDataAdapter adapter = dbFactory.CreateDataAdapter();
adapter.SelectCommand = cmd;
DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
if (dataSet.Tables.Count > 0 && commandParameters != null && connectionType == ConnectionType.DmServer)
{
DataTable resultTable = dataSet.Tables[dataSet.Tables.Count - 1];
int.TryParse(resultTable.Rows[0]["execcount"] + "", out num);
object returnValue = resultTable.Columns.Contains("returnValue") ? resultTable.Rows[0]["returnValue"] : "";
for (int i = 0; i < commandParameters.Length; i++)
{
DbParameter sqlParameter = commandParameters[i];
if (sqlParameter.Direction == ParameterDirection.ReturnValue)
{
sqlParameter.Value = returnValue;
}
if (sqlParameter.Direction == ParameterDirection.Output || sqlParameter.Direction == ParameterDirection.InputOutput)
{
sqlParameter.Value = resultTable.Rows[0][$"outputValue{i}"];
}
}
if (returnValue + "" == "-1") LastFailureSql = cmd.CommandText;
}
}
else
{
PrepareCommand(cmd, _connection, Trans, cmdType, cmdText, commandParameters);
num = cmd.ExecuteNonQuery();
}
}
else if (_connection is SqlConnection)
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
num = cmd.ExecuteNonQuery();
}
cmd.Parameters.Clear();
}
catch (Exception e)
{
if (e.Message.StartsWith("在从服务器接收结果时发生传输级错误") ||
e.Message.StartsWith("在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误") ||
e.Message.StartsWith("在向服务器发送请求时发生传输级错误"))
{
throw new Exception("无法连接服务器,请检查网络连接.");
}
else
{
throw new Exception(e.Message + " SQL=[ " + cmdText + " ]", e);
//throw;
}
}
finally
{
cmd.Dispose();
}
return num;
}
/// <summary>
/// <para>说明:执行sql语句或者存储过程</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <returns>System.Int32.</returns>
public static int ExecuteNonQuery(CommandType cmdType, string cmdText)
{
return ExecuteNonQuery(CommandType.Text, cmdText, null);
}
/// <summary>
/// <para>说明:执行sql语句或者存储过程</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdText">The command text.</param>
/// <returns>System.Int32.</returns>
public static int ExecuteNonQuery(string cmdText)
{
return ExecuteNonQuery(CommandType.Text, cmdText);
}
#endregion
#region ExecuteReader
/// <summary>
/// <para>说明:执行sql语句或者存储过程并返回结果集(只读、只进)</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>SqlDataReader.</returns>
public static DbDataReader ExecuteReader(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
{
DbDataReader reader2;
DbCommand cmd = dbFactory.CreateCommand();
try
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
DbDataReader reader = cmd.ExecuteReader();
cmd.Parameters.Clear();
reader2 = reader;
}
catch
{
throw;
}
return reader2;
}
#endregion
#region ExecuteCommand
/// <summary>
/// <para>说明:执行sql语句或者存储过程并返回SqlCommand(只读、只进)</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-07-24 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>SqlDataReader.</returns>
public static DbCommand ExecuteCommand(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
{
DbCommand cmd = dbFactory.CreateCommand();
try
{
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
return cmd;
}
#endregion
#region ExecuteScalar
/// <summary>
/// <para>说明:执行sql语句或者存储过程并返回结果集第一行第一列</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="Connectionection">The connectionection.</param>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>System.Object.</returns>
public static object ExecuteScalar(DbConnection Connectionection, CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
{
DbCommand cmd = dbFactory.CreateCommand();
PrepareCommand(cmd, Connectionection, null, cmdType, cmdText, commandParameters);
object obj2 = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return obj2;
}
/// <summary>
/// <para>说明:执行sql语句或者存储过程并返回结果集第一行第一列</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="commandParameters">The command parameters.</param>
/// <returns>System.Object.</returns>
public static object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
{
try
{
DbCommand cmd = dbFactory.CreateCommand();
PrepareCommand(cmd, _connection, null, cmdType, cmdText, commandParameters);
object obj2 = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return obj2;
}
catch (Exception e)
{
if (e.Message.StartsWith("在从服务器接收结果时发生传输级错误") ||
e.Message.StartsWith("在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误") ||
e.Message.StartsWith("在向服务器发送请求时发生传输级错误"))
{
throw new Exception("无法连接服务器,请检查网络连接.");
}
else
{
throw new Exception(e.Message + " SQL=[ " + cmdText + " ]", e);
//throw;
}
}
}
/// <summary>
/// <para>说明:执行sql语句或者存储过程并返回结果集第一行第一列</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <returns>System.Object.</returns>
public static object ExecuteScalar(CommandType cmdType, string cmdText)
{
DbCommand cmd = dbFactory.CreateCommand();
PrepareCommand(cmd, _connection, null, cmdType, cmdText, null);
object obj2 = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return obj2;
}
/// <summary>
/// <para>说明:执行sql语句或者存储过程并返回结果集第一行第一列</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdText">The command text.</param>
/// <returns>System.Object.</returns>
public static object ExecuteScalar(string cmdText)
{
DbCommand cmd = dbFactory.CreateCommand();
PrepareCommand(cmd, _connection, null, CommandType.Text, cmdText, null);
object obj2 = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return obj2;
}
/// <summary>
/// <para>说明:执行sql语句或者存储过程并返回结果集第一行第一列,带事务</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmdText"></param>
/// <param name="Trans"></param>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static object ExecuteScalar(string cmdText, DbTransaction Trans)
{
DbCommand cmd = dbFactory.CreateCommand();
PrepareCommand(cmd, _connection, Trans, CommandType.Text, cmdText, null);
object obj2 = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return obj2;
}
#endregion
#region PrepareCommand
/// <summary>
/// <para>说明:sql参数处理</para>
/// <para>创建者:朗速科技有限公司</para>
/// <para>创建日期:2023-12-28 </para>
/// <para>功能关联:公版方法</para>
/// </summary>
/// <param name="cmd">The command.</param>
/// <param name="Connection">The connection.</param>
/// <param name="trans">The trans.</param>
/// <param name="cmdType">Type of the command.</param>
/// <param name="cmdText">The command text.</param>
/// <param name="cmdParms">The command parms.</param>
public static void PrepareCommand(DbCommand cmd, DbConnection Connection, DbTransaction trans, CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
try
{
if (connectionType == ConnectionType.KdbnServer || connectionType == ConnectionType.DmServer)
{
if (connectionType == ConnectionType.KdbnServer)
{
if (Connection.State == ConnectionState.Open)
{
Connection.Close();
}
Connection.Open();
}
else if (connectionType == ConnectionType.DmServer)
{
if (Connection.State != ConnectionState.Open)
{
Connection.Open();
}
}
cmd.Connection = Connection;
cmd.CommandTimeout = CommandTimeout;
cmd.CommandText = cmdText;
if (trans != null)
{
cmd.Transaction = trans;
}
DbParameter[] dbParameters = CastParameterArray(cmdParms);
if (cmdType == CommandType.StoredProcedure)
{
string execSqlParas = "";
string outputParas = "";
StringBuilder stringBuilder = new StringBuilder();
bool hasReturnPara = false;
if (cmdParms != null)
{
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 || parameter.Direction == ParameterDirection.InputOutput)
{
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
{
execSqlParas += $"'{value}',";
}
}
}
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, @"(?<![a-zA-Z0-9_""])model(?![a-zA-Z0-9_""])", "\"model\"", RegexOptions.IgnoreCase);
}
if (cmdParms != null)
{
foreach (DbParameter parameter in dbParameters)
{
cmd.Parameters.Add(parameter);
if (connectionType == ConnectionType.DmServer)
{
cmd.CommandText = Regex.Replace(cmd.CommandText, parameter.ParameterName, $":{parameter.ParameterName.TrimStart('@')}", RegexOptions.IgnoreCase);
}
}
}
}
}
else if (connectionType == ConnectionType.SqlServer)
{
if (Connection.State != ConnectionState.Open)
{
Connection.Open();
}
cmd.Connection = Connection;
cmd.CommandTimeout = CommandTimeout;
cmd.CommandText = cmdText;
if (trans != null)
{
cmd.Transaction = trans;
}
cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (SqlParameter parameter in cmdParms)
{
cmd.Parameters.Add(parameter);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
}
#endregion
/// <summary>
/// 转换为人大金仓参数集合
/// </summary>
/// <param name="commandParameters"></param>
/// <returns></returns>
public static DbParameter[] CastParameterArray(DbParameter[] commandParameters)
{
if (commandParameters == null)
{
return null;
}
DbParameter[] dbParameters = new DbParameter[commandParameters.Length];
for (int i = 0; i < commandParameters.Length; i++)
{
DbParameter parameter = commandParameters[i];
dbParameters[i] = CastDbParameter(parameter);
}
return dbParameters;
}
/// <summary>
/// 转换为人大金仓参数
/// </summary>
/// <param name="sqlParameter"></param>
/// <returns></returns>
public static DbParameter CastDbParameter(DbParameter parameter)
{
DbParameter dbParameter = dbFactory.CreateParameter();
if (parameter is SqlParameter sqlParameter)
{
if (dbParameter is KdbndpParameter kdbndpParameter)
{
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.Text;
break;
case SqlDbType.VarBinary:
dmDbType = DmDbType.VarBinary;
break;
case SqlDbType.VarChar:
dmDbType = DmDbType.VarChar;
break;
case SqlDbType.Date:
dmDbType = DmDbType.Date;
break;
case SqlDbType.Time:
dmDbType = DmDbType.Time;
break;
}
dmParameter.DmSqlType = dmDbType;
}
dbParameter.ParameterName = sqlParameter.ParameterName;
dbParameter.Size = sqlParameter.Size;
dbParameter.Direction = sqlParameter.Direction;
dbParameter.Value = sqlParameter.Value;
}
return dbParameter;
}
}
}