#region using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Text; using CSFramework.DB.Common; using CSFramework.DB.Models; #endregion namespace CSFramework.DB { public class DatabaseMSSQL : IDatabase { private string _ConnectionString; public DatabaseMSSQL(string connectionString) { _ConnectionString = connectionString; } public string BuildConnectionString(string server, int port, string dbName, string uid, string pwd, int timeout = 15) { const string DEF_SQL_CONNECTION = @"Data Source={0};Initial Catalog={1};User ID={2};Password ={3};Persist Security Info=True;Connect Timeout={4};"; var connstr = ""; if (port == DefaultPort) connstr = string.Format(DEF_SQL_CONNECTION, server, dbName, uid, pwd, timeout); else connstr = string.Format(DEF_SQL_CONNECTION, server + "," + port, dbName, uid, pwd, timeout); return connstr; } public void Close(DbConnection connection) { if (connection != null) { connection.Close(); connection.Dispose(); } } public int CommandTimeout { get { var defaultTimeOut = 30; return DatabaseFactory.CommandTimeOut > 0 ? DatabaseFactory.CommandTimeOut : defaultTimeOut; } } public string ConnectionString { get => _ConnectionString; set => _ConnectionString = value; } public int ConnectionTimeout { get { var defaultTimeOut = 15; return DatabaseFactory.ConnectionTimeOut > 0 ? DatabaseFactory.ConnectionTimeOut : defaultTimeOut; } } public CommandHelper CreateCommand(string commandText) { return new CommandHelper(this, commandText, CommandType.Text); } public DbCommand CreateCommand(string commandText, CommandType commandType) { return new SqlCommand(commandText) { CommandText = commandText, CommandType = commandType, CommandTimeout = CommandTimeout }; } public DbCommandBuilder CreateCommandBuilder() { return new SqlCommandBuilder(); } public DbConnection CreateConnection() { return CreateConnection(_ConnectionString); } public DbConnection CreateConnection(string connectionString) { DbConnection DBConn = new SqlConnection(connectionString); DBConn.Open(); //打开连接 return DBConn; } public DbDataAdapter CreateDataAdapter() { return new SqlDataAdapter(); } public DbParameter CreateParameter(string parameterName, DbType parameterType, int size, string sourceColumn, object parameterValue) { parameterName = ParseParamName(parameterName); return new SqlParameter { ParameterName = parameterName, DbType = parameterType, Size = size, SourceColumn = sourceColumn, Value = parameterValue, IsNullable = true }; } public DbParameter CreateParameter(string parameterName, object parameterValue) { parameterName = ParseParamName(parameterName); return new SqlParameter { ParameterName = parameterName, Value = parameterValue, IsNullable = true }; } public CommandHelper CreateSqlProc(string spName) { return new CommandHelper(this, spName, CommandType.StoredProcedure); } /// /// 创建时间戳参数 /// /// 参数名 /// 字段名 /// public DbParameter CreateTimestampParameter(string parameterName, string fieldName) { var p = new SqlParameter(); p.ParameterName = parameterName; p.SqlDbType = SqlDbType.Timestamp; p.Size = 8; p.SourceColumn = fieldName; return p; } public DatabaseType DatabaseType => DatabaseType.SqlServer; public Type DateTimeType => typeof(SqlDateTime); public int DefaultPort => 1433; public int ExecuteCommand(DbCommand cmd) { DbConnection connection = null; try { if (cmd.Connection == null && cmd.Transaction == null) cmd.Connection = connection = CreateConnection(_ConnectionString); return cmd.ExecuteNonQuery(); } finally { if (connection != null) Close(connection); } } public DbDataReader ExecuteReader(string SQL) { DbCommand cmd = null; DbDataReader o = null; DbConnection conn = null; try { cmd = new SqlCommand(); cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL); cmd.CommandType = CommandType.Text; cmd.Connection = conn = CreateConnection(_ConnectionString); o = cmd.ExecuteReader(); } catch (Exception ex) { throw ex; } finally { if (cmd != null) cmd.Dispose(); Close(conn); } return o; } public DbDataReader ExecuteReader(DbCommand cmd) { DbConnection connection = null; try { if (cmd.Connection == null) cmd.Connection = connection = CreateConnection(); return cmd.ExecuteReader(); } finally { Close(connection); } } public T ExecuteReader(DbCommand cmd) where T : new() { DbConnection connection = null; try { if (cmd.Connection == null) cmd.Connection = connection = CreateConnection(); var obj = default(T); using (var dataReader = cmd.ExecuteReader()) { if (dataReader.Read()) obj = DbTools.Convert2Object(dataReader); } return obj; } finally { Close(connection); } } public T ExecuteReader(string SQL) where T : new() { DbConnection connection = null; DbCommand command = null; DbDataReader dataReader = null; try { using (connection = CreateConnection()) { using (command = CreateCommand(SQL, CommandType.Text)) { command.Connection = connection; var obj = default(T); using (dataReader = command.ExecuteReader()) { if (dataReader.Read()) obj = DbTools.Convert2Object(dataReader); } return obj; } } } finally { if (connection != null) connection.Dispose(); if (command != null) command.Dispose(); if (dataReader != null) dataReader.Dispose(); } } public List ExecuteReader(string SQL, Func action) where T : new() { DbConnection connection = null; DbCommand command = null; DbDataReader dataReader = null; try { using (connection = CreateConnection()) { using (command = CreateCommand(SQL, CommandType.Text)) { command.Connection = connection; var list = new List(); using (dataReader = command.ExecuteReader()) { while (dataReader.Read()) list.Add(action.Invoke(dataReader)); } return list; } } } finally { if (connection != null) connection.Dispose(); if (command != null) command.Dispose(); if (dataReader != null) dataReader.Dispose(); } } public List ExecuteReader(DbCommand cmd, Func action) where T : new() { DbConnection connection = null; try { if (cmd.Connection == null) cmd.Connection = connection = CreateConnection(); var list = new List(); using (var dataReader = cmd.ExecuteReader()) { while (dataReader.Read()) list.Add(action.Invoke(dataReader)); } return list; } finally { Close(connection); } } public List ExecuteReaderList(string SQL) where T : new() { DbConnection connection = null; DbCommand command = null; DbDataReader dataReader = null; try { using (connection = CreateConnection()) { using (command = CreateCommand(SQL, CommandType.Text)) { command.Connection = connection; var list = new List(); using (dataReader = command.ExecuteReader()) { while (dataReader.Read()) list.Add(DbTools.Convert2Object(dataReader)); } return list; } } } finally { if (connection != null) connection.Dispose(); if (command != null) command.Dispose(); if (dataReader != null) dataReader.Dispose(); } } public List ExecuteReaderList(DbCommand cmd) where T : new() { DbConnection connection = null; try { if (cmd.Connection == null) cmd.Connection = connection = CreateConnection(); var list = new List(); using (var dataReader = cmd.ExecuteReader()) { while (dataReader.Read()) list.Add(DbTools.Convert2Object(dataReader)); } return list; } finally { Close(connection); } } public object ExecuteScalar(string SQL) { DbConnection connection = null; DbCommand cmd = null; try { cmd = CreateCommand(SQL, CommandType.Text); cmd.Connection = connection = CreateConnection(); return cmd.ExecuteScalar(); } catch (Exception ex) { throw ex; } finally { if (cmd != null) cmd.Dispose(); Close(connection); } } public object ExecuteScalar(DbCommand cmd) { DbConnection connection = null; try { if (cmd.Connection == null) cmd.Connection = connection = CreateConnection(); return cmd.ExecuteScalar(); } finally { Close(connection); } } public int ExecuteSQL(string SQL) { DbConnection connection = null; try { connection = CreateConnection(); return ExecuteSQL(SQL, connection); } finally { Close(connection); } } /// /// 在事务内提交数据 /// /// 事务 /// SQL语句 /// public int ExecuteTrans(DbTransaction trans, string SQL) { DbCommand cmd = null; var i = -1; try { cmd = new SqlCommand(); cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL); cmd.CommandType = CommandType.Text; cmd.Connection = trans.Connection; cmd.Transaction = trans; i = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (cmd != null) cmd.Dispose(); } return i; } public int ExecuteTrans(DbTransaction trans, DbCommand cmd) { var i = -1; try { cmd.Connection = trans.Connection; cmd.Transaction = trans; i = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (cmd != null) cmd.Dispose(); } return i; } public DataRow GetDataRow(string SQL) { var dt = GetDataSet(SQL).Tables[0]; return dt.Rows.Count > 0 ? dt.Rows[0] : null; } public DataSet GetDataSet(DbCommand cmd) { DbDataAdapter adapter = null; DbConnection connection = null; try { if (cmd.Connection == null) cmd.Connection = connection = CreateConnection(_ConnectionString); var ds = new DataSet(); adapter = new SqlDataAdapter(); adapter.SelectCommand = cmd; adapter.Fill(ds); return ds; } catch (Exception ex) { throw ex; } finally { if (adapter != null) adapter.Dispose(); if (cmd != null) cmd.Dispose(); Close(connection); } } public DataSet GetDataSet(string SQL) { DbConnection connection = null; try { connection = CreateConnection(_ConnectionString); return GetDataSet(SQL, connection); } finally { Close(connection); } } /// /// 执行带参数的 Sql 语句或存储过程,并返回 DataSet 对象。 /// /// 要执行的 Sql 语句或存储过程名等。 /// CommandType 参数类型,即该命令是 sql 语句,还是存储过程名等。 /// 参数集合。 /// DataSet 对象。 public virtual DataSet GetDataSet(string SQL, CommandType type, IDataParameter[] paramlist) { DbCommand cmd = null; DbDataAdapter adapter = null; DbConnection connection = null; try { cmd = CreateCommand(SQL, type); cmd.Connection = connection = CreateConnection(); if (paramlist != null) cmd.Parameters.AddRange(paramlist); var ds = new DataSet(); adapter = CreateDataAdapter(); adapter.SelectCommand = cmd; adapter.Fill(ds); return ds; } catch (Exception ex) { throw ex; } finally { if (adapter != null) adapter.Dispose(); if (cmd != null) cmd.Dispose(); Close(connection); } } /// /// 获取当前表最新(最大)的自增字段值 /// /// 表名 /// public int GetMaxID(string tableName) { //mssql写法 var sql = $"select ident_current('{tableName}');"; var o = ExecuteScalar(sql); return o == DBNull.Value || o == null ? 0 : Convert.ToInt32(o); } /// /// 服务器时间 /// public DateTime GetServerTime() { var o = ExecuteScalar("SELECT GETDATE() AS SERVER_DATE"); return Convert.ToDateTime(o); } public List GetStringList(string SQL) { DbConnection connection = null; DbCommand command = null; DbDataReader dataReader = null; try { using (connection = CreateConnection()) { using (command = CreateCommand(SQL, CommandType.Text)) { command.Connection = connection; var list = new List(); using (dataReader = command.ExecuteReader()) { while (dataReader.Read()) list.Add(dataReader.GetValue(0) .ToString()); //取第1列 } return list; } } } finally { if (connection != null) connection.Dispose(); if (command != null) command.Dispose(); if (dataReader != null) dataReader.Dispose(); } } public List GetStringList(DbCommand cmd) { DbConnection connection = null; try { if (cmd.Connection == null) cmd.Connection = connection = CreateConnection(); var list = new List(); using (var dataReader = cmd.ExecuteReader()) { while (dataReader.Read()) list.Add(dataReader.GetValue(0).ToString()); //取第1列 } return list; } finally { Close(connection); } } public DataTable GetTable(string SQL, string tableName = "") { var dt = GetDataSet(SQL).Tables[0]; if (tableName != "") dt.TableName = tableName; return dt; } public DataTable GetTable(DbCommand cmd, string tableName = "") { var dt = GetDataSet(cmd).Tables[0]; if (tableName != "") dt.TableName = tableName; return dt; } public DataTable GetTop(int top, string tableName, string fields = "", List where = null, string orderBy = "") { var cmd = CreateCommand(""); fields = string.IsNullOrWhiteSpace(fields) ? "*" : fields; orderBy = string.IsNullOrEmpty(orderBy) ? "" : " ORDER BY " + orderBy; var whereSQL = ""; if (where != null && where.Count > 0) { string pName; foreach (var p in where) { pName = p.ParameterName; if (pName.IndexOf(ParamSymboName) >= 0) //参数名称带有符号,如:@Code whereSQL = whereSQL + $" AND {pName.Replace(ParamSymboName, "")}={p.ParameterName}"; else whereSQL = whereSQL + $" AND {p.ParameterName}={ParamSymboName + p.ParameterName}"; cmd.Command.Parameters.Add(p); } } whereSQL = string.IsNullOrEmpty(whereSQL) ? "" : " WHERE 1=1 " + whereSQL; var SQL = $"SELECT TOP {top} {fields} FROM {tableName} {whereSQL} {orderBy};"; cmd.Command.CommandText = CodeSafeHelper.GetSafeSQL(SQL); return GetTable(cmd.Command, tableName); } public DataTable meta_GetDatabase() { var sql = "SELECT Name AS DBName,filename AS FilePath,crdate AS CreationTime,Version FROM Master..SysDatabases"; return GetTable(sql, "SysDatabases"); } public List meta_GetDatabaseList() { var sql = "SELECT Name AS DBName,filename AS FilePath,crdate AS CreationTime,Version FROM Master..SysDatabases"; return ExecuteReaderList(sql); } public List meta_GetStoreProcList( string dbName = "") { var sql = "SELECT type,name FROM sys.sql_modules inner join sysobjects on sys.sql_modules.object_id = sysobjects.id and type in ('p','fn') and category=0"; CodeSafeHelper.IsCheckSQM = false; var result = new List(); var sp = CreateCommand(sql); var dt = GetTable(sp.Command); foreach (DataRow R in dt.Rows) { if (R["type"].ToString().Trim().ToUpper() == "P") result.Add(new MetaStoreProcedure { Type = MetaStoreProcedureType.StoreProcedure, Name = R["name"].ToString() }); if (R["type"].ToString().Trim().ToUpper() == "FN") result.Add(new MetaStoreProcedure { Type = MetaStoreProcedureType.Function, Name = R["name"].ToString() }); } return result; } public DataTable meta_GetTableNames(string dbName = "") { return GetTable(meta_GetTablesNamesSQL()); } public List meta_GetTableNamesList(string dbName = "") { return ExecuteReaderList(meta_GetTablesNamesSQL()); } public DataTable meta_GetTableStru(string tableName) { var b = CodeSafeHelper.IsCheckSQM; try { CodeSafeHelper.IsCheckSQM = false; var sp = CreateCommand(meta_GetTableStruSQL()); sp.AddParam("TableName", tableName); return GetTable(sp.Command, tableName); } finally { CodeSafeHelper.IsCheckSQM = b; } } public List meta_GetTableStruList(string tableName) { var b = CodeSafeHelper.IsCheckSQM; try { CodeSafeHelper.IsCheckSQM = false; var sp = CreateCommand(meta_GetTableStruSQL()); sp.AddParam("TableName", tableName); return ExecuteReaderList(sp.Command); } finally { CodeSafeHelper.IsCheckSQM = b; } } /// /// 参数符号.如: WHERE Code=@Code /// public string ParamSymboName { get; set; } = "@"; /// /// 返回包含参数符号的参数名称,比如:@Code, :Code, ?p_Code /// /// /// public string ParseParamName(string paramName) { if (string.IsNullOrEmpty(ParamSymboName) || string.IsNullOrEmpty(paramName)) return paramName; if (paramName.IndexOf(ParamSymboName) == 0) //首字母包含 return paramName; return ParamSymboName + paramName; //添加参数符号 } public DbType ToDbType(string sourceType) { return DBDataTypes.GetDbTypeByMsSqlType(sourceType); } public Type ToNetType(string sourceType) { return DBDataTypes.GetNetTypeByMsSql(sourceType); } public DbTransaction TransBegin() { return CreateConnection().BeginTransaction(); } public void TransCommit(DbTransaction trans, bool closeConnection = false) { trans.Commit(); if (closeConnection) Close(trans.Connection); } public void TransRollback(DbTransaction trans, bool closeConnection = false) { trans.Rollback(); if (closeConnection) Close(trans.Connection); } public bool UpdateDataSet(DataTable ds, string tableName, string KEY) { //先删除原表数据 var sql = ""; var ErrorMsg = ""; foreach (DataRow dr in ds.Rows) { sql = string.Format(@"delete from {0} where {1} in ('{2}')", tableName, KEY, dr[KEY]); break; } var a = ExecuteSQL(sql); var colMapping = new SqlBulkCopyColumnMapping[ds.Columns.Count]; for (var i = 0; i < ds.Columns.Count; i++) colMapping[i] = new SqlBulkCopyColumnMapping(ds.Columns[i].ColumnName, ds.Columns[i].ColumnName); DataTableToSQLServer(ds, _ConnectionString, tableName, colMapping, ref ErrorMsg); return true; } public bool InstDataSet(DataTable ds, string tableName) { //先删除原表数据 var ErrorMsg = ""; var colMapping = new SqlBulkCopyColumnMapping[ds.Columns.Count]; for (var i = 0; i < ds.Columns.Count; i++) colMapping[i] = new SqlBulkCopyColumnMapping(ds.Columns[i].ColumnName, ds.Columns[i].ColumnName); DataTableToSQLServer(ds, _ConnectionString, tableName, colMapping, ref ErrorMsg); return true; } public int ExecuteSQLT(string conn, string sql, object FingerDataTwo, object Report) { DbConnection connection = null; try { var ConnectString = conn; //string sql = "update SYS_Reports set Data = @FingerDataTwo WHERE ReportTitle= @UserId"; var con = new SqlConnection(ConnectString); var cmd = new SqlCommand(sql, con); cmd.Parameters.Add("@FingerDataTwo", SqlDbType.VarBinary) .Value = FingerDataTwo; cmd.Parameters.Add("@UserId", SqlDbType.VarChar).Value = Report; con.Open(); var i = cmd.ExecuteNonQuery(); con.Close(); return 1; } finally { Close(connection); } } //2022-05-01 liu public bool AddTable(DataTable dt, string tableName) { using (var sqlCon = new SqlConnection(_ConnectionString)) { try { sqlCon.Open(); using (var bulkCopy = new SqlBulkCopy(sqlCon)) { bulkCopy.DestinationTableName = tableName; for (var i = 0; i < dt.Columns.Count; i++) bulkCopy.ColumnMappings.Add(dt.Columns[i].Caption, dt.Columns[i].Caption); bulkCopy.WriteToServer(dt); return true; } } catch (Exception ex) { throw ex; } finally { sqlCon.Close(); } } } #region 封装批量插入数据SQL Server数据的方法 /// /// 封装批量插入数据SQL Server数据的方法 /// /// 源数据表 /// 数据库连接字符串 /// 目标表名 /// 字段映射 public bool DataTableToSQLServer(DataTable dt, string connectString, string tableName, SqlBulkCopyColumnMapping[] colMapping, ref string msg) { using (var destinationConnection = new SqlConnection(connectString)) { destinationConnection.Open(); using (var bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.FireTriggers, null)) { try { bulkCopy.DestinationTableName = tableName; //要插入的表的表名 bulkCopy.BatchSize = dt.Rows.Count; foreach (var item in colMapping) bulkCopy.ColumnMappings.Add(item); bulkCopy.WriteToServer(dt); return true; } catch (Exception ex) { msg = "[" + tableName + "]" + ex.Message; return false; } } } } #endregion public bool DeleteDataSet(DataTable ds, string tableName, string KEY) { var sql = ""; var ErrorMsg = ""; foreach (DataRow dr in ds.Rows) { sql = string.Format(@"delete from {0} where {1} in ('{2}')", tableName, KEY, dr[KEY]); break; } try { var a = ExecuteSQL(sql); if (a > 0) return true; } catch (Exception) { return false; } return false; } public int ExecuteSQL(string SQL, DbConnection conn) { DbCommand cmd = null; var i = -1; try { cmd = new SqlCommand(); cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL); cmd.CommandType = CommandType.Text; cmd.Connection = conn; i = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (cmd != null) cmd.Dispose(); } return i; } public DataSet GetDataSet(string SQL, DbConnection conn) { DbCommand cmd = null; DbDataAdapter adapter = null; try { cmd = new SqlCommand(); cmd.CommandText = CodeSafeHelper.GetSafeSQL(SQL); cmd.CommandType = CommandType.Text; cmd.Connection = conn; var ds = new DataSet(); adapter = new SqlDataAdapter(); adapter.SelectCommand = cmd; adapter.Fill(ds); return ds; } catch (Exception ex) { throw ex; } finally { if (adapter != null) adapter.Dispose(); if (cmd != null) cmd.Dispose(); } } private DbCommand meta_GetTablesNamesSQL() { var cmd = CreateCommand( "select id,type,name from sysobjects where type in(@U,@V) order by name"); cmd.AddParam("@U", "U"); cmd.AddParam("@V", "V"); return cmd.Command; } private string meta_GetTableStruSQL() { var sql = new StringBuilder(); sql.AppendLine("SELECT "); sql.AppendLine(" TableName=d.name, "); sql.AppendLine(" FieldOrder=a.colorder,"); sql.AppendLine(" FieldName=a.name,"); sql.AppendLine( " IsIdentity=CASE WHEN COLUMNPROPERTY(a.id,a.name, 'IsIdentity')=1 THEN 'Y' ELSE 'N' END,"); sql.AppendLine( " PK=CASE WHEN EXISTS(SELECT 1 FROM sysobjects WHERE xtype= 'PK' AND parent_obj=a.id AND name IN ("); sql.AppendLine( " SELECT name FROM sysindexes WHERE indid IN("); sql.AppendLine( " SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) THEN 'Y' ELSE 'N' END,"); sql.AppendLine( " FK=CASE WHEN EXISTS(SELECT 1 FROM sysobjects WHERE xtype= 'F' AND parent_obj=a.id AND name IN ("); sql.AppendLine( " SELECT name FROM sysindexes WHERE indid IN("); sql.AppendLine( " SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) THEN 'Y' ELSE 'N' END,"); sql.AppendLine(" IDX=CASE WHEN EXISTS( "); sql.AppendLine( " SELECT TOP 1 dd.name FROM sysindexes aa JOIN sysindexkeys bb ON aa.id = bb.id AND aa.indid = bb.indid"); sql.AppendLine(" JOIN sysobjects cc ON bb.id = cc.id"); sql.AppendLine( " JOIN syscolumns dd ON bb.id = dd.id AND bb.colid = dd.colid"); sql.AppendLine( " WHERE dd.name=a.name AND dd.id=a.id AND cc.id=d.id AND aa.indid NOT IN ( 0 , 255 ) ) THEN 'Y' ELSE 'N' END,"); sql.AppendLine(" FieldType=b.name,"); sql.AppendLine(" FieldLength=a.length,"); sql.AppendLine(" Prec=COLUMNPROPERTY(a.id,a.name, 'PRECISION '),"); sql.AppendLine( " Scale=isnull(COLUMNPROPERTY(a.id,a.name, 'Scale '),0),"); sql.AppendLine( " AllowNull=CASE WHEN a.isnullable=1 THEN 'Y' ELSE 'N' END,"); sql.AppendLine(" DefaultValue=isnull(e.text, ' '),"); sql.AppendLine( " FieldCaption=CASE WHEN ISNULL(g.[value], '')='' THEN a.name ELSE g.[value] END"); sql.AppendLine(" FROM syscolumns a"); sql.AppendLine( " LEFT JOIN systypes b on a.xusertype=b.xusertype"); sql.AppendLine( " INNER JOIN sysobjects d on a.id=d.id and d.xtype IN ('U','V') and d.name <> 'dtproperties'"); sql.AppendLine( " LEFT JOIN syscomments e on a.cdefault=e.id"); sql.AppendLine( " LEFT JOIN sys.extended_properties g ON a.id=g.major_id and a.colid=g.minor_id "); // --sql2005 改为 sysproperties表 sql.AppendLine( " WHERE d.name= @TableName "); //--如果只查询指定表,加上此条件 return sql.ToString(); } #region protected AdapterRowUpdatingEvent _MyRowUpdatingEvent; public DbDataAdapter CreateDataAdapter( AdapterRowUpdatingEvent eventHandler) { _MyRowUpdatingEvent = eventHandler; var adp = new SqlDataAdapter(); adp.RowUpdating += Adp_RowUpdating; return adp; } private void Adp_RowUpdating(object sender, SqlRowUpdatingEventArgs e) { if (_MyRowUpdatingEvent != null) _MyRowUpdatingEvent(sender, e); } #endregion } }