Mercurial > pub > bltoolkit
diff Source/Data/DataProvider/SybaseDataProvider.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/SybaseDataProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Text; + +using BLToolkit.Mapping; + +using Sybase.Data.AseClient; + +namespace BLToolkit.Data.DataProvider +{ + using Sql.SqlProvider; + + public class SybaseDataProvider : DataProviderBase + { + public override IDbConnection CreateConnectionObject() + { + return new AseConnection(); + } + + public override DbDataAdapter CreateDataAdapterObject() + { + return new AseDataAdapter(); + } + + public override bool DeriveParameters(IDbCommand command) + { + AseCommandBuilder.DeriveParameters((AseCommand)command); + return true; + } + + public override object Convert(object value, ConvertType convertType) + { + switch (convertType) + { + case ConvertType.ExceptionToErrorNumber: + if (value is AseException) + { + var ex = (AseException)value; + + foreach (AseError error in ex.Errors) + if (error.IsError) + return error.MessageNumber; + + foreach (AseError error in ex.Errors) + if (error.MessageNumber != 0) + return error.MessageNumber; + + return 0; + } + + break; + + case ConvertType.ExceptionToErrorMessage: + if (value is AseException) + { + try + { + var ex = (AseException)value; + var sb = new StringBuilder(); + + foreach (AseError error in ex.Errors) + if (error.IsError) + sb.AppendFormat("{0} Ln: {1}{2}", + error.Message.TrimEnd('\n', '\r'), error.LineNum, Environment.NewLine); + + foreach (AseError error in ex.Errors) + if (!error.IsError) + sb.AppendFormat("* {0}{1}", error.Message, Environment.NewLine); + + return sb.Length == 0 ? ex.Message : sb.ToString(); + } + catch + { + } + } + + break; + } + + return SqlProvider.Convert(value, convertType); + } + + public override void AttachParameter(IDbCommand command, IDbDataParameter parameter) + { + if (parameter.Value is string && parameter.DbType == DbType.Guid) + parameter.DbType = DbType.AnsiString; + + base.AttachParameter(command, parameter); + + var p = (AseParameter)parameter; + + if (p.AseDbType == AseDbType.Unsupported && p.Value is DBNull) + parameter.DbType = DbType.AnsiString; + } + + public override Type ConnectionType + { + get { return typeof(AseConnection); } + } + + public override string Name + { + get { return DataProvider.ProviderName.Sybase; } + } + + public override ISqlProvider CreateSqlProvider() + { + return new SybaseSqlProvider(); + } + + public override bool InitParameter(IDbDataParameter parameter) + { + if (parameter.Value is Guid) + { + parameter.Value = parameter.Value.ToString(); + parameter.DbType = DbType.StringFixedLength; + parameter.Size = 36; + + return true; + } + + return false; + } + + public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters) + { + base.PrepareCommand(ref commandType, ref commandText, ref commandParameters); + + List<IDbDataParameter> list = null; + + if (commandParameters != null) for (var i = 0; i < commandParameters.Length; i++) + { + var p = commandParameters[i]; + + if (p.Value is Guid) + { + p.Value = p.Value.ToString(); + p.DbType = DbType.StringFixedLength; + p.Size = 36; + } + + if (commandType == CommandType.Text) + { + if (commandText.IndexOf(p.ParameterName) < 0) + { + if (list == null) + { + list = new List<IDbDataParameter>(commandParameters.Length); + + for (var j = 0; j < i; j++) + list.Add(commandParameters[j]); + } + } + else + { + if (list != null) + list.Add(p); + } + } + } + + if (list != null) + commandParameters = list.ToArray(); + } + + public override string EndOfSql { get { return ""; } } + + public override DbType GetDbType(Type systemType) + { + if (systemType == typeof(byte[])) + return DbType.Object; + + return base.GetDbType(systemType); + } + + #region DataReaderEx + + public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader) + { + return dataReader is AseDataReader? + new DataReaderEx((AseDataReader)dataReader): + base.GetDataReader(schema, dataReader); + } + + class DataReaderEx : DataReaderBase<AseDataReader>, IDataReader + { + public DataReaderEx(AseDataReader rd): base(rd) + { + } + + public new object GetValue(int i) + { + var value = DataReader.GetValue(i); + + if (value is DateTime) + { + var dt = (DateTime)value; + + if (dt.Year == 1900 && dt.Month == 1 && dt.Day == 1) + return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond); + } + + return value; + } + + public new DateTime GetDateTime(int i) + { + var dt = DataReader.GetDateTime(i); + + if (dt.Year == 1900 && dt.Month == 1 && dt.Day == 1) + return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond); + + return dt; + } + } + + #endregion + } +}