/// <summary> /// 创建数据库命令对象 /// </summary> /// <param name="databaseFacade">ADO.NET 数据库对象</param> /// <param name="sql">sql 语句</param> /// <param name="commandType">命令类型</param> /// <returns>(DbConnection dbConnection, DbCommand dbCommand)</returns> private static (DbConnection dbConnection, DbCommand dbCommand) CreateDbCommand(this DatabaseFacade databaseFacade, string sql, CommandType commandType = CommandType.Text) { // 检查是否支持存储过程 DbProvider.CheckStoredProcedureSupported(databaseFacade.ProviderName, commandType); // 判断是否启用 MiniProfiler 组件,如果有,则包装链接 var dbConnection = InjectMiniProfiler ? new ProfiledDbConnection(databaseFacade.GetDbConnection(), MiniProfiler.Current) : databaseFacade.GetDbConnection(); // 创建数据库命令对象 var dbCommand = dbConnection.CreateCommand(); // 设置基本参数 dbCommand.Transaction = databaseFacade.CurrentTransaction?.GetDbTransaction(); dbCommand.CommandType = commandType; dbCommand.CommandText = sql; // 设置超时 var commandTimeout = databaseFacade.GetCommandTimeout(); if (commandTimeout != null) { dbCommand.CommandTimeout = commandTimeout.Value; } // 返回 return(dbConnection, dbCommand); }
/// <summary> /// 创建数据库适配器 /// </summary> /// <param name="databaseFacade">ADO.NET 数据库对象</param> /// <param name="sql">sql 语句</param> /// <param name="commandType">命令类型</param> /// <returns>(DbConnection dbConnection, DbCommand dbCommand, DbDataAdapter dbDataAdapter)</returns> private static (DbConnection dbConnection, DbCommand dbCommand, DbDataAdapter dbDataAdapter) CreateDbDataAdapter(this DatabaseFacade databaseFacade, string sql, CommandType commandType = CommandType.Text) { // 检查是否支持存储过程 DbProvider.CheckStoredProcedureSupported(databaseFacade.ProviderName, commandType); // 获取数据库连接字符串 var dbConnection = databaseFacade.GetDbConnection(); // 解析数据库提供器 var dbProviderFactory = DbProviderFactories.GetFactory(dbConnection); // 判断是否启用 MiniProfiler 组件,如果有,则包装链接和数据库提供器工厂 var profiledDbProviderFactory = InjectMiniProfiler ? new ProfiledDbProviderFactory(dbProviderFactory, true) : dbProviderFactory; // 创建数据库连接对象及数据库命令对象 var(_dbConnection, dbCommand) = databaseFacade.CreateDbCommand(sql, commandType); dbConnection = _dbConnection; // 创建数据适配器并设置查询命令对象 // EFCore 5.0 未提供 Sqlite DataAdapter var dbDataAdapter = DbProvider.IsDatabaseFor(databaseFacade.ProviderName, DbProvider.Sqlite) ? default : profiledDbProviderFactory.CreateDataAdapter(); if (dbDataAdapter != null) { dbDataAdapter.SelectCommand = dbCommand; } // 返回 return(dbConnection, dbCommand, dbDataAdapter); }
/// <summary> /// 创建数据库命令对象 /// </summary> /// <param name="databaseFacade">ADO.NET 数据库对象</param> /// <param name="sql">sql 语句</param> /// <param name="commandType">命令类型</param> /// <returns>(DbConnection dbConnection, DbCommand dbCommand)</returns> private static (DbConnection dbConnection, DbCommand dbCommand) CreateDbCommand(this DatabaseFacade databaseFacade, string sql, CommandType commandType = CommandType.Text) { // 判断是否是关系型数据库 if (!databaseFacade.IsRelational()) { throw new InvalidOperationException("Only relational databases support ADO.NET operations."); } if (string.IsNullOrWhiteSpace(sql)) { throw new ArgumentNullException(nameof(sql)); } // 支持读取配置渲染 var realSql = sql.Render(); // 检查是否支持存储过程 DbProvider.CheckStoredProcedureSupported(databaseFacade.ProviderName, commandType); // 判断是否启用 MiniProfiler 组件,如果有,则包装链接 var dbConnection = databaseFacade.GetDbConnection(); // 创建数据库命令对象 var dbCommand = dbConnection.CreateCommand(); // 设置基本参数 dbCommand.Transaction = databaseFacade.CurrentTransaction?.GetDbTransaction(); dbCommand.CommandType = commandType; dbCommand.CommandText = realSql; // 设置超时 var commandTimeout = databaseFacade.GetCommandTimeout(); if (commandTimeout != null) { dbCommand.CommandTimeout = commandTimeout.Value; } // 返回 return(dbConnection, dbCommand); }