Mercurial > pub > bltoolkit
diff Source/Data/DataProvider/GenericDataProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Data/DataProvider/GenericDataProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Transactions; +using BLToolkit.Data.DataProvider.Interpreters; +using BLToolkit.Data.Sql.SqlProvider; + +namespace BLToolkit.Data.DataProvider +{ + /// <summary> + /// Creates an instance of a db provider for a specified provider name. + /// </summary> + public sealed class GenericDataProvider : DataProviderBase + { + private readonly string _providerName; + private readonly DbProviderFactory _factory; + private readonly DataProviderInterpreterBase _dataProviderInterpreter; + + public GenericDataProvider(string providerName) + { + _providerName = providerName; + using (new TransactionScope()) + { + _factory = DbProviderFactories.GetFactory(providerName); + } + + switch (Name) + { + case ProviderFullName.Oracle: + case ProviderFullName.OracleNet: + _dataProviderInterpreter = new OracleDataProviderInterpreter(); + break; + case ProviderFullName.SQLite: + _dataProviderInterpreter = new SqliteDataProviderInterpreter(); + break; + default: + throw new Exception(string.Format("The sql provider {0} isnt supported in the DataProviderInterpreterBase", Name)); + } + } + + #region Overrides of DataProviderBase + + public override Type ConnectionType + { + get + { + var dbConnection = _factory.CreateConnection(); + if (dbConnection != null) + return dbConnection.GetType(); + return null; + } + } + + public override string Name + { + get { return _providerName; } + } + + public override IDbConnection CreateConnectionObject() + { + return _factory.CreateConnection(); + } + + public override DbDataAdapter CreateDataAdapterObject() + { + return _factory.CreateDataAdapter(); + } + + /// <summary> + /// Populates the specified IDbCommand object's Parameters collection with + /// parameter information for the stored procedure specified in the IDbCommand. + /// </summary> + public override bool DeriveParameters(IDbCommand command) + { + return false; + } + + public override ISqlProvider CreateSqlProvider() + { + switch (Name) + { + case ProviderFullName.OracleNet: + return new OracleSqlProvider(); + case ProviderFullName.SQLite: + return new SQLiteSqlProvider(); + case ProviderFullName.Oracle: + return new OracleSqlProvider(); + default: + throw new Exception(string.Format("The sql provider {0} isnt supported in the GenericDataProvider", Name)); + } + } + + public override void SetParameterValue(IDbDataParameter parameter, object value) + { + _dataProviderInterpreter.SetParameterValue(parameter, value); + } + + public override string GetSequenceQuery(string sequenceName) + { + return _dataProviderInterpreter.GetSequenceQuery(sequenceName); + } + + public override string NextSequenceQuery(string sequenceName) + { + return _dataProviderInterpreter.NextSequenceQuery(sequenceName); + } + + public override string GetReturningInto(string columnName) + { + return _dataProviderInterpreter.GetReturningInto(columnName); + } + + public override object Convert(object value, ConvertType convertType) + { + if (Name == ProviderFullName.Oracle) + { + switch (convertType) + { + case ConvertType.NameToQueryParameter: + var qname = (string) value; + + // + // Avoid "ORA-00972: identifier is too long" error + // Cause error : You tried to reference a table, cluster, view, index, synonym, tablespace, or username with a value that was longer than 30 characters. + // Resolution : Names for tables, clusters, views, indexes, synonyms, tablespaces, and usernames must be 30 characters or less. + // You must shorten the name to no more than 30 characters for these objects. + // + if (qname.Length > 30) + { + qname = qname.Substring(0, 30); + return SqlProvider.Convert(qname, convertType); + } + return SqlProvider.Convert(value, convertType); + } + } + + return base.Convert(value, convertType); + } + + public override int InsertBatchWithIdentity<T>( + DbManager db, + string insertText, + IEnumerable<T> collection, + Mapping.MemberMapper[] members, + int maxBatchSize, + DbManager.ParameterProvider<T> getParameters) + { + if (db.UseQueryText && Name == ProviderFullName.Oracle) + { + List<string> sqlList = _dataProviderInterpreter.GetInsertBatchSqlList(insertText, collection, members, maxBatchSize, true); + return ExecuteSqlList(db, sqlList); + } + return base.InsertBatchWithIdentity(db, insertText, collection, members, maxBatchSize, getParameters); + } + + public override int InsertBatch<T>( + DbManager db, + string insertText, + IEnumerable<T> collection, + Mapping.MemberMapper[] members, + int maxBatchSize, + DbManager.ParameterProvider<T> getParameters) + { + if (Name == ProviderFullName.Oracle) + { + if (db.UseQueryText) + { + List<string> sqlList = _dataProviderInterpreter.GetInsertBatchSqlList(insertText, collection, members, maxBatchSize, false); + return ExecuteSqlList(db, sqlList); + } + throw new NotSupportedException("Set UseQueryText = true on the current generic data provider!"); + } + return base.InsertBatch(db, insertText, collection, members, maxBatchSize, getParameters); + } + + #endregion + } +}