Beispiel #1
0
        /// <summary>
        /// 获取Ado.Net Connection/Transaction Pair from the given connectionString
        /// </summary>
        /// <param name="connString">连接字符串</param>
        /// <returns>A Connection/Transaction Pair</returns>
        public ConnectionTxPair GetConnectionTxPair(string connString)
        {
            DbProvider.ConnectionString = connString;
            ConnectionTxPair connectionTxPair = ConnectionUtils.GetConnectionTxPair(DbProvider);

            return(connectionTxPair);
        }
Beispiel #2
0
        /// <summary>
        /// 针对<see cref="System.Data.IDbConnection"/>执行<see cref="System.Data.IDbCommand.CommandText"/>,并生成
        /// <see cref="System.Data.IDataReader"/>
        /// </summary>
        /// <param name="connString">A ConnectionString.</param>
        /// <param name="commandType">the CommandType.</param>
        /// <param name="commandText">A execute Sql.</param>
        /// <param name="timeoutInSeconds">the dbcommand timeout.</param>
        /// <param name="parameterValues">the sql parameters.</param>
        /// <returns>a datareader.</returns>
        public IDataReader ExecuteReader(string connString, CommandType commandType, string commandText,
                                         int timeoutInSeconds, IDbParameters parameterValues)
        {
            AssertUtils.StringNotNullOrEmpty(connString, "connString");

            ConnectionTxPair connectionTxPair = GetConnectionTxPair(connString);

            try
            {
                IDbCommand dbCommand = DbProvider.CreateCommand();

                PrepareCommand(dbCommand, connectionTxPair.Connection, connectionTxPair.Transaction, commandType, commandText,
                               parameterValues);

                ApplyTransactionTimeout(dbCommand, timeoutInSeconds);

                IDataReader executeReader = dbCommand.ExecuteReader();

                ParameterUtils.CopyParameters(parameterValues, dbCommand);

                return(executeReader);
            }
            catch (Exception)
            {
                ConnectionUtils.DisposeConnection(connectionTxPair.Connection, DbProvider);
                connectionTxPair.Connection = null;
                throw;
            }
            finally
            {
                //ConnectionUtils.DisposeConnection(connectionTxPair.Connection, DbProvider);
            }
        }
Beispiel #3
0
        /// <summary>
        /// 执行SQL,并返回影响的行数
        /// </summary>
        /// <param name="connString">A ConnectionString.</param>
        /// <param name="commandType">the Sql CommandType.</param>
        /// <param name="commandText">the execute Sql.</param>
        /// <param name="timeOutInSeconds">the dbcommand timeout.</param>
        /// <param name="parameters">the sql parameters.</param>
        /// <returns>返回受影响的行数.</returns>
        public int ExecuteNonQuery(string connString, CommandType commandType, string commandText, int timeOutInSeconds,
                                   IDbParameters parameters)
        {
            AssertUtils.StringNotNullOrEmpty(connString, "connString");

            ConnectionTxPair connectionTxPair = GetConnectionTxPair(connString);

            try
            {
                using (IDbCommand dbCommand = DbProvider.CreateCommand())
                {
                    PrepareCommand(dbCommand, connectionTxPair.Connection, connectionTxPair.Transaction, CommandType.Text, commandText,
                                   parameters);

                    ApplyTransactionTimeout(dbCommand, timeOutInSeconds);

                    int rowCount = dbCommand.ExecuteNonQuery();

                    ParameterUtils.CopyParameters(parameters, dbCommand);

                    return(rowCount);
                }
            }
            catch (Exception ex)
            {
                ConnectionUtils.DisposeConnection(connectionTxPair.Connection, DbProvider);
                connectionTxPair.Connection = null;
                throw ex;
            }
            finally
            {
                ConnectionUtils.DisposeConnection(connectionTxPair.Connection, DbProvider);
            }
        }
Beispiel #4
0
        public System.Data.Common.DbDataReader QueryDataReader(string cmdText)
        {
            ConnectionTxPair connectionTxPairToUse = GetConnectionTxPair(DbProvider);
            IDbCommand       command = null;

            System.Data.Common.DbDataReader reader = null;
            try
            {
                command             = DbProvider.CreateCommand();
                command.Connection  = connectionTxPairToUse.Connection;
                command.Transaction = connectionTxPairToUse.Transaction;

                ApplyCommandSettings(command);

                DbCommand commandToUse = command as DbCommand;
                if (commandToUse != null)
                {
                    command.CommandText = cmdText;
                    reader = base.CreateDataReaderWrapper(command.ExecuteReader()) as System.Data.Common.DbDataReader;
                    return(reader);
                }
                else
                {
                    throw new InvalidDataAccessApiUsageException("IDbCommand 通过DbProvider创建的command不能转换为DbCommand");
                }
            }
            catch (Exception e)
            {
                DisposeCommand(command);
                command = null;
                DisposeConnection(connectionTxPairToUse.Connection, DbProvider);
                connectionTxPairToUse.Connection = null;

                throw;
            }
            finally
            {
                DisposeCommand(command);
                DisposeConnection(connectionTxPairToUse.Connection, DbProvider);
                Spring.Data.Support.AdoUtils.CloseReader(reader);
            }
        }
Beispiel #5
0
        /// <summary>
        /// 执行SQL, 返回Dataset
        /// </summary>
        /// <param name="connString">the ConnectionString</param>
        /// <param name="commandType">the sql CommandType.</param>
        /// <param name="commandText">the execute sql</param>
        /// <param name="timeoutInSeconds">the dbcommand timeout.</param>
        /// <param name="parameterValues">the sql parameters</param>
        /// <returns>return a Dataset</returns>
        /// <exception cref="ArgumentNullException">如果参数connString为null或空,则抛出此异常</exception>
        public DataSet ExecuteDataset(string connString, CommandType commandType, string commandText,
                                      int timeoutInSeconds, IDbParameters parameterValues)
        {
            AssertUtils.StringNotNullOrEmpty(connString, "connString");

            ConnectionTxPair connectionTxPair = GetConnectionTxPair(connString);

            try
            {
                using (IDbCommand dbCommand = DbProvider.CreateCommand())
                {
                    PrepareCommand(dbCommand, connectionTxPair.Connection, connectionTxPair.Transaction, commandType, commandText,
                                   parameterValues);

                    ApplyTransactionTimeout(dbCommand, timeoutInSeconds);

                    IDbDataAdapter dbDataAdapter = DbProvider.CreateDataAdapter();

                    dbDataAdapter.SelectCommand = dbCommand;
                    var ds = new DataSet();
                    dbDataAdapter.Fill(ds);

                    ParameterUtils.CopyParameters(parameterValues, dbCommand);

                    return(ds);
                }
            }
            catch (Exception)
            {
                ConnectionUtils.DisposeConnection(connectionTxPair.Connection, DbProvider);
                connectionTxPair.Connection = null;
                throw;
            }
            finally
            {
                ConnectionUtils.DisposeConnection(connectionTxPair.Connection, DbProvider);
            }
        }
        protected virtual Dictionary <string, DataTable> BuildDatabase(IDictionary <string, Table> tables,
                                                                       SpringBaseDao baseDao, out bool createdDatabase)
        {
            createdDatabase = false;
            ConnectionTxPair connectionTxPairToUse = null;

            try
            {
                connectionTxPairToUse = ConnectionUtils.GetConnectionTxPair(baseDao.DbProvider);
                ConnectionUtils.DisposeConnection(connectionTxPairToUse.Connection, baseDao.DbProvider);
                connectionTxPairToUse = null;
                return(GetCurrentDatabaseTableSchemas(tables, baseDao));
            }
            catch (CannotGetAdoConnectionException)
            {
                // Database probably does not exist, so attempt to create it below
            }
            finally
            {
                if (connectionTxPairToUse != null)
                {
                    ConnectionUtils.DisposeConnection(connectionTxPairToUse.Connection, baseDao.DbProvider);
                    connectionTxPairToUse = null;
                }
            }
            string saveConnectionString = baseDao.DbProvider.ConnectionString;
            string databaseName;
            string newConnectionString =
                SpringBaseDao.RemoveDatabaseFromConnectionString(baseDao.DbProvider, out databaseName);

            if (string.IsNullOrEmpty(databaseName))
            {
                throw new ArgumentException(string.Format("Could not locate database name in connection string: \"{0}\"",
                                                          baseDao.DbProvider.ConnectionString));
            }
            baseDao.DbProvider.ConnectionString = newConnectionString;
            try
            {
                connectionTxPairToUse = ConnectionUtils.GetConnectionTxPair(baseDao.DbProvider);
                string sql = string.Format("CREATE DATABASE {0}", databaseName);
                baseDao.AdoTemplate.ExecuteNonQuery(CommandType.Text, sql);
                createdDatabase = true;
            }
            finally
            {
                if (connectionTxPairToUse != null)
                {
                    ConnectionUtils.DisposeConnection(connectionTxPairToUse.Connection, baseDao.DbProvider);
                    connectionTxPairToUse = null;
                }
                baseDao.DbProvider.ConnectionString = saveConnectionString;
            }
            // Wait for database to be fully created
            long timeoutTicks = DateTime.Now.Ticks + TimeSpan.FromSeconds(CREATE_DATABASE_WAIT_SECONDS).Ticks;

            do
            {
                try
                {
                    return(GetCurrentDatabaseTableSchemas(tables, baseDao));
                }
                catch (DataAccessException)
                {
                }
                Thread.Sleep(300);
            }while (timeoutTicks > DateTime.Now.Ticks);
            throw new CannotGetAdoConnectionException();
        }
        /// <summary>
        /// Gets the non managed TX connection.
        /// </summary>
        /// <returns></returns>
        protected override ConnectionAndTransactionHolder GetNonManagedTXConnection()
        {
            ConnectionTxPair pair = ConnectionUtils.DoGetConnection(dbProvider);

            return(new ConnectionAndTransactionHolder(pair.Connection, pair.Transaction));
        }