using System; using System.Data; using System.Collections.Generic; using System.Text; using FirebirdSql.Data.FirebirdClient; namespace ADOHelper { publicclass Firebird { privatestring connStrTemplate ="Server={0};User={1};Password={2};Charser={3};Database={4}"; privatestring connStr; protectedchar ParameterToken { get{ return'@'; } } //连接字符串 publicstring ConnectString { set{ connStr = value; } } //构造函数 public Firebird() { } //构造函数2 public Firebird(string host, string user, string password, string charset, string database) { connStr = String.Format(connStrTemplate, host, user, password, charset, database); } /**////<summary> /// Open FbConnection ///</summary> ///<remarks> /// e.g.: /// FbConnection conn = OpenConnection(); ///</remarks> ///<returns>an FbConnection</returns> public FbConnection OpenConnection() { FbConnection connection =null; try { try { connection =new FbConnection(connStr); connection.Open(); } catch (Exception e) { throw e; } } catch { if (connection !=null) connection.Close(); } return connection; } /**////<summary> /// Execute a FbCommand (that returns no resultset) using an existing SQL Transaction /// using the provided parameters. ///</summary> ///<remarks> /// e.g.: /// int result = ExecuteNonQuery( CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); ///</remarks> ///<param name="commandType">the CommandType (stored procedure, text, etc.)</param> ///<param name="commandText">the stored procedure name or T-SQL command</param> ///<param name="commandParameters">an array of SqlParamters used to execute the command</param> ///<returns>an int representing the number of rows affected by the command</returns> publicint ExecuteNonQuery(CommandType cmdType, string cmdText, params FbParameter[] commandParameters) { FbCommand cmd =new FbCommand(); using (FbConnection conn = OpenConnection()) { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } } /**////<summary> /// Execute a FbCommand (that returns no resultset) using an existing SQL Transaction /// using the provided parameters. ///</summary> ///<remarks> /// e.g.: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); ///</remarks> ///<param name="trans">an existing sql transaction</param> ///<param name="commandType">the CommandType (stored procedure, text, etc.)</param> ///<param name="commandText">the stored procedure name or T-SQL command</param> ///<param name="commandParameters">an array of SqlParamters used to execute the command</param> ///<returns>an int representing the number of rows affected by the command</returns> publicint ExecuteNonQuery(FbTransaction trans, CommandType cmdType, string cmdText, params FbParameter[] commandParameters) { FbCommand cmd =new FbCommand(); using (FbConnection conn = OpenConnection()) { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } } /**////<summary> /// Execute a FbCommand that returns a resultset against the database specified in the connection string /// using the provided parameters. ///</summary> ///<remarks> /// e.g.: /// SqlDataReader r = ExecuteReader( CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); ///</remarks> ///<param name="commandType">the CommandType (stored procedure, text, etc.)</param> ///<param name="commandText">the stored procedure name or T-SQL command</param> ///<param name="commandParameters">an array of SqlParamters used to execute the command</param> ///<returns>A SqlDataReader containing the results</returns> public FbDataReader ExecuteReader(CommandType cmdType, string cmdText, params FbParameter[] commandParameters) { FbCommand cmd =new FbCommand(); FbConnection conn = OpenConnection(); // we use a try/catch here because if the method throws an exception we want to // close the connection throw code, because no datareader will exist, hence the // commandBehaviour.CloseConnection will not work try { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); FbDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } } /**////<summary> /// Execute a FbCommand that returns the first column of the first record against an existing database connection /// using the provided parameters. ///</summary> ///<remarks> /// e.g.: /// Object obj = ExecuteScalar(CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); ///</remarks> ///<param name="commandType">the CommandType (stored procedure, text, etc.)</param> ///<param name="commandText">the stored procedure name or T-SQL command</param> ///<param name="commandParameters">an array of FbParameter used to execute the command</param> ///<returns>An object that should be converted to the expected type using Convert.To{Type}</returns> publicobject ExecuteScalar(CommandType cmdType, string cmdText, params FbParameter[] commandParameters) { FbCommand cmd =new FbCommand(); using (FbConnection conn = OpenConnection()) { PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); object val = cmd.ExecuteScalar(); cmd.Parameters.Clear(); return val; } } /**////<summary> /// Return a DataSet ///</summary> ///<param name="cmd">FbCommand object</param> ///<param name="conn">FbConnection object</param> ///<param name="trans">FbTransaction object</param> ///<param name="cmdType">Cmd type e.g. stored procedure or text</param> ///<param name="cmdText">Command text, e.g. Select * from Products</param> ///<param name="cmdParms">FbParameter to use in the command</param> publicvoid DoLoadDataSet(DataSet dataSet, string[] tableNames, CommandType cmdType, string cmdText, params FbParameter[] commandParameters) { if (tableNames ==null) thrownew ArgumentNullException("tableNames"); if (tableNames.Length ==0) { thrownew ArgumentNullException("tableNames"); } for (int i =0; i < tableNames.Length; i++) { if (string.IsNullOrEmpty(tableNames[i])) thrownew ArgumentException(string.Concat("tableNames[", i, "]")); } using (FbDataAdapter adapter = GetDataAdapter(UpdateBehavior.Standard)) { ((IDbDataAdapter)adapter).SelectCommand = command; try { DateTime startTime = DateTime.Now; string systemCreatedTableNameRoot ="Table"; for (int i =0; i < tableNames.Length; i++) { string systemCreatedTableName = (i ==0) ? systemCreatedTableNameRoot : systemCreatedTableNameRoot + i; adapter.TableMappings.Add(systemCreatedTableName, tableNames[i]); } adapter.Fill(dataSet); instrumentationProvider.FireCommandExecutedEvent(startTime); } catch (Exception e) { instrumentationProvider.FireCommandFailedEvent(command.CommandText, ConnectionStringNoCredentials, e); throw; } } } /**////<summary> /// Prepare a command for execution ///</summary> ///<param name="cmd">FbCommand object</param> ///<param name="conn">FbConnection object</param> ///<param name="trans">FbTransaction object</param> ///<param name="cmdType">Cmd type e.g. stored procedure or text</param> ///<param name="cmdText">Command text, e.g. Select * from Products</param> ///<param name="cmdParms">FbParameter to use in the command</param> privatevoid PrepareCommand(FbCommand cmd, FbConnection conn, FbTransaction trans, CommandType cmdType, string cmdText, FbParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans !=null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms !=null) { foreach (FbParameter parm in cmdParms) cmd.Parameters.Add(parm); } } } }