diff --git a/build/common.props b/build/common.props index 9b7cfeaa..f8bca093 100644 --- a/build/common.props +++ b/build/common.props @@ -1,7 +1,7 @@ netcoreapp1.0;netcoreapp1.1;netcoreapp2.0;netcoreapp2.1;netcoreapp2.2;net46;netstandard2.0 - 0.19.1 + 0.19.2 0.11.0.0 $(VersionPrefix) dataaction @@ -9,7 +9,7 @@ icon.png https://github.com/DataAction/AdoNetCore.AseClient Apache-2.0 - Refer to GitHub - https://github.com/DataAction/AdoNetCore.AseClient/releases/tag/0.19.1 + Refer to GitHub - https://github.com/DataAction/AdoNetCore.AseClient/releases/tag/0.19.2 https://github.com/DataAction/AdoNetCore.AseClient git diff --git a/src/AdoNetCore.AseClient/AseCommandBuilder.cs b/src/AdoNetCore.AseClient/AseCommandBuilder.cs index 32ef1c02..63490a6d 100644 --- a/src/AdoNetCore.AseClient/AseCommandBuilder.cs +++ b/src/AdoNetCore.AseClient/AseCommandBuilder.cs @@ -224,12 +224,15 @@ private static DataTable GetSchemaTableWithKeyInfo(DbCommand sourceCommand) if (dataTable != null) { // If there is no primary key on the table, then throw MissingPrimaryKeyException. - var isKeyColumn = dataTable.Columns["IsKey"]; + var isKeyColumn = dataTable.Columns[SchemaTableColumn.IsKey]; + var isUniqueColumn = dataTable.Columns[SchemaTableColumn.IsUnique]; + var hasKey = false; foreach (DataRow columnDescriptorRow in dataTable.Rows) { - hasKey |= (bool)columnDescriptorRow[isKeyColumn]; + hasKey |= (bool)columnDescriptorRow[isKeyColumn] || + (bool)columnDescriptorRow[isUniqueColumn]; if (hasKey) { diff --git a/src/AdoNetCore.AseClient/AseConnection.cs b/src/AdoNetCore.AseClient/AseConnection.cs index 23cf83cd..2c5283ee 100644 --- a/src/AdoNetCore.AseClient/AseConnection.cs +++ b/src/AdoNetCore.AseClient/AseConnection.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Data; using System.Data.Common; +using System.Net.Security; using AdoNetCore.AseClient.Interface; using AdoNetCore.AseClient.Internal; @@ -274,7 +275,7 @@ public override void Open() { var parameters = ConnectionParameters.Parse(_connectionString); - _internal = _connectionPoolManager.Reserve(_connectionString, parameters, _eventNotifier); + _internal = _connectionPoolManager.Reserve(_connectionString, parameters, _eventNotifier, UserCertificateValidationCallback); InternalConnectionTimeout = parameters.LoginTimeout; } @@ -543,7 +544,10 @@ public bool NamedParameters #if ENABLE_CLONEABLE_INTERFACE public object Clone() { - return new AseConnection(_connectionString, _connectionPoolManager); + return new AseConnection(_connectionString, _connectionPoolManager) + { + UserCertificateValidationCallback = UserCertificateValidationCallback, + }; } #endif @@ -621,6 +625,12 @@ public AseTransaction Transaction return _transaction; } } + + /// + /// Allow consumer to override the default certificate validation + /// + public RemoteCertificateValidationCallback UserCertificateValidationCallback { get; set; } + } /// diff --git a/src/AdoNetCore.AseClient/AseParameterCollection.cs b/src/AdoNetCore.AseClient/AseParameterCollection.cs index 5027c13c..fdd7ad17 100644 --- a/src/AdoNetCore.AseClient/AseParameterCollection.cs +++ b/src/AdoNetCore.AseClient/AseParameterCollection.cs @@ -263,10 +263,10 @@ public AseParameter Add(string parameterName, AseDbType dbType, int size, Parame /// A new object. public AseParameter Add(AseParameter parameter) { - if (parameter != null) - { - _parameters.Add(parameter); - } + if (parameter == null) throw new ArgumentNullException(nameof(parameter)); + if (Contains(parameter)) throw new ArgumentException($"parameter name '{parameter.ParameterName}' is already in the collection"); + + _parameters.Add(parameter); return parameter; } @@ -379,6 +379,7 @@ public override int Add(object value) { if (value is AseParameter p) { + if (Contains(p)) throw new ArgumentException($"Parameter name: '{p.ParameterName}' is already registered", nameof(value)); return ((IList)_parameters).Add(p); } return -1; @@ -438,15 +439,23 @@ public override int IndexOf(object value) /// Returns -1 when the object does not exist in the . public int IndexOf(AseParameter value) { - if (value != null) + if (value == null) return -1; + for (var i = 0; i < _parameters.Count; i++) { - for (var i = 0; i < _parameters.Count; i++) + if (string.IsNullOrWhiteSpace(value.ParameterName)) { if (value == _parameters[i]) { return i; } } + else + { + if (value == _parameters[i] || value.ParameterName == _parameters[i].ParameterName) + { + return i; + } + } } return -1; @@ -459,6 +468,7 @@ public int IndexOf(AseParameter value) /// The object to add to the collection. public override void Insert(int index, object parameter) { + if (Contains(parameter)) throw new ArgumentException($"parameter name '{parameter}' is already in the collection"); ((IList)_parameters).Insert(index, parameter); } @@ -469,6 +479,7 @@ public override void Insert(int index, object parameter) /// The object to add to the collection. public void Insert(int index, AseParameter parameter) { + if (Contains(parameter)) throw new ArgumentException($"parameter name '{parameter.ParameterName}' is already in the collection"); ((IList)_parameters).Insert(index, parameter); } @@ -521,10 +532,7 @@ public override void RemoveAt(int index) /// The starting index of the array. public override void CopyTo(Array array, int index) { - if (array != null) - { - ((IList)_parameters).CopyTo(array, index); - } + ((IList)_parameters).CopyTo(array, index); } /// diff --git a/src/AdoNetCore.AseClient/Interface/IConnectionPoolManager.cs b/src/AdoNetCore.AseClient/Interface/IConnectionPoolManager.cs index e23df58e..be32fbd5 100644 --- a/src/AdoNetCore.AseClient/Interface/IConnectionPoolManager.cs +++ b/src/AdoNetCore.AseClient/Interface/IConnectionPoolManager.cs @@ -1,8 +1,10 @@ +using System.Net.Security; + namespace AdoNetCore.AseClient.Interface { internal interface IConnectionPoolManager { - IInternalConnection Reserve(string connectionString, IConnectionParameters parameters, IInfoMessageEventNotifier eventNotifier); + IInternalConnection Reserve(string connectionString, IConnectionParameters parameters, IInfoMessageEventNotifier eventNotifier, RemoteCertificateValidationCallback userCertificateValidationCallback = null); void Release(string connectionString, IInternalConnection connection); void ClearPool(string connectionString); void ClearPools(); diff --git a/src/AdoNetCore.AseClient/Internal/ConnectionPoolManager.cs b/src/AdoNetCore.AseClient/Internal/ConnectionPoolManager.cs index 99bc378d..2e9ee5fc 100644 --- a/src/AdoNetCore.AseClient/Internal/ConnectionPoolManager.cs +++ b/src/AdoNetCore.AseClient/Internal/ConnectionPoolManager.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Net.Security; using AdoNetCore.AseClient.Interface; namespace AdoNetCore.AseClient.Internal @@ -14,14 +15,14 @@ internal sealed class ConnectionPoolManager : IConnectionPoolManager, IEnumerabl private static readonly ConcurrentDictionary Pools = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - public IInternalConnection Reserve(string connectionString, IConnectionParameters parameters, IInfoMessageEventNotifier eventNotifier) + public IInternalConnection Reserve(string connectionString, IConnectionParameters parameters, IInfoMessageEventNotifier eventNotifier, RemoteCertificateValidationCallback userCertificateValidationCallback = null) { return Pools.GetOrAdd(connectionString, _ => { #if ENABLE_ARRAY_POOL - var internalConnectionFactory = new InternalConnectionFactory(parameters, BufferPool); + var internalConnectionFactory = new InternalConnectionFactory(parameters, BufferPool, userCertificateValidationCallback); #else - var internalConnectionFactory = new InternalConnectionFactory(parameters); + var internalConnectionFactory = new InternalConnectionFactory(parameters, userCertificateValidationCallback); #endif return new ConnectionPool(parameters, internalConnectionFactory); diff --git a/src/AdoNetCore.AseClient/Internal/FormatItem.cs b/src/AdoNetCore.AseClient/Internal/FormatItem.cs index db8a3dcf..40f994d4 100644 --- a/src/AdoNetCore.AseClient/Internal/FormatItem.cs +++ b/src/AdoNetCore.AseClient/Internal/FormatItem.cs @@ -64,50 +64,60 @@ public string ParameterName /// public SerializationType SerializationType { get; set; } - public static FormatItem CreateForParameter(AseParameter parameter, DbEnvironment env, CommandType commandType) + public static FormatItem CreateForParameter(AseParameter parameter, DbEnvironment env, AseCommand command) { parameter.AseDbType = TypeMap.InferType(parameter); var dbType = parameter.DbType; - var length = TypeMap.GetFormatLength(dbType, parameter, env.Encoding); - var format = new FormatItem + var format = command.FormatItem; + var parameterName = parameter.ParameterName ?? command.Parameters.IndexOf(parameter).ToString(); + if (!(command.FormatItem != null && command.FormatItem.ParameterName == parameterName && + command.FormatItem.AseDbType == parameter.AseDbType)) { - AseDbType = parameter.AseDbType, - ParameterName = parameter.ParameterName, - IsOutput = parameter.IsOutput, - IsNullable = parameter.IsNullable, - Length = length, - DataType = TypeMap.GetTdsDataType(dbType, parameter.SendableValue, length, parameter.ParameterName), - UserType = TypeMap.GetUserType(dbType, parameter.SendableValue, length) - }; + format = new FormatItem + { + AseDbType = parameter.AseDbType, + ParameterName = parameter.ParameterName, + IsOutput = parameter.IsOutput, + IsNullable = parameter.IsNullable, + Length = length, + DataType = TypeMap.GetTdsDataType(dbType, parameter.SendableValue, length, parameter.ParameterName), + UserType = TypeMap.GetUserType(dbType, parameter.SendableValue, length) + }; - //fixup the FormatItem's BlobType for strings and byte arrays - if (format.DataType == TdsDataType.TDS_BLOB) - { - switch (parameter.DbType) + //fixup the FormatItem's BlobType for strings and byte arrays + if (format.DataType == TdsDataType.TDS_BLOB) { - case DbType.AnsiString: - format.BlobType = BlobType.BLOB_LONGCHAR; - break; - case DbType.String: - format.BlobType = BlobType.BLOB_UNICHAR; - // This is far less than ideal but at the time of addressing this issue whereby if the - // BlobType is a BLOB_UNICHAR then the UserType would need to be 36 when it - // is a stored proc otherwise it would need to be zero (0). - // - // In the future, we'd need to overhaul how TDS_BLOB is structured especially - // around BLOB_UNICHAR and the UserType that it should return in a more consistent way - if (commandType != CommandType.StoredProcedure) - format.UserType = 0; + switch (parameter.DbType) + { + case DbType.AnsiString: + format.BlobType = BlobType.BLOB_LONGCHAR; + break; + case DbType.String: + format.BlobType = BlobType.BLOB_UNICHAR; + // This is far less than ideal but at the time of addressing this issue whereby if the + // BlobType is a BLOB_UNICHAR then the UserType would need to be 36 when it + // is a stored proc otherwise it would need to be zero (0). + // + // In the future, we'd need to overhaul how TDS_BLOB is structured especially + // around BLOB_UNICHAR and the UserType that it should return in a more consistent way + if (command.CommandType != CommandType.StoredProcedure) + format.UserType = 0; - break; - case DbType.Binary: - format.BlobType = BlobType.BLOB_LONGBINARY; - break; + break; + case DbType.Binary: + format.BlobType = BlobType.BLOB_LONGBINARY; + break; + } } } + else + { + format.DataType = TypeMap.GetTdsDataType(dbType, parameter.SendableValue, length, parameter.ParameterName); + format.UserType = TypeMap.GetUserType(dbType, parameter.SendableValue, length); + } //fixup the FormatItem's length,scale,precision for decimals if (format.IsDecimalType) diff --git a/src/AdoNetCore.AseClient/Internal/InternalConnection.cs b/src/AdoNetCore.AseClient/Internal/InternalConnection.cs index 49688a43..50194694 100644 --- a/src/AdoNetCore.AseClient/Internal/InternalConnection.cs +++ b/src/AdoNetCore.AseClient/Internal/InternalConnection.cs @@ -669,11 +669,7 @@ private IToken[] BuildParameterTokens(AseCommand command) foreach (var parameter in command.Parameters.SendableParameters) { - var parameterName = parameter.ParameterName ?? command.Parameters.IndexOf(parameter).ToString(); - if (!(command.FormatItem != null && command.FormatItem.ParameterName == parameterName && command.FormatItem.AseDbType == parameter.AseDbType)) - { - command.FormatItem = FormatItem.CreateForParameter(parameter, _environment, command.CommandType); - } + command.FormatItem = FormatItem.CreateForParameter(parameter, _environment, command); formatItems.Add(command.FormatItem); parameterItems.Add(new ParametersToken.Parameter diff --git a/src/AdoNetCore.AseClient/Internal/InternalConnectionFactory.cs b/src/AdoNetCore.AseClient/Internal/InternalConnectionFactory.cs index cb4f66a5..2c4bf8db 100644 --- a/src/AdoNetCore.AseClient/Internal/InternalConnectionFactory.cs +++ b/src/AdoNetCore.AseClient/Internal/InternalConnectionFactory.cs @@ -19,18 +19,23 @@ namespace AdoNetCore.AseClient.Internal internal class InternalConnectionFactory : IInternalConnectionFactory { private readonly IConnectionParameters _parameters; + private readonly RemoteCertificateValidationCallback _userCertificateValidationCallback; + + #if ENABLE_ARRAY_POOL private readonly System.Buffers.ArrayPool _arrayPool; #endif private IPEndPoint _endpoint; #if ENABLE_ARRAY_POOL - public InternalConnectionFactory(IConnectionParameters parameters, System.Buffers.ArrayPool arrayPool) + public InternalConnectionFactory(IConnectionParameters parameters, System.Buffers.ArrayPool arrayPool, RemoteCertificateValidationCallback userCertificateValidationCallback) #else - public InternalConnectionFactory(IConnectionParameters parameters) + public InternalConnectionFactory(IConnectionParameters parameters, RemoteCertificateValidationCallback userCertificateValidationCallback) #endif { _parameters = parameters; + _userCertificateValidationCallback = userCertificateValidationCallback ?? UserCertificateValidationCallback; + #if ENABLE_ARRAY_POOL _arrayPool = arrayPool; #endif @@ -109,7 +114,7 @@ private InternalConnection CreateConnection(Socket socket, CancellationToken tok if (_parameters.Encryption) { - sslStream = new SslStream(networkStream, false, UserCertificateValidationCallback); + sslStream = new SslStream(networkStream, false, _userCertificateValidationCallback); var authenticate = sslStream.AuthenticateAsClientAsync(_parameters.Server); @@ -175,10 +180,11 @@ private InternalConnection CreateConnectionInternal(Stream networkStream) #if ENABLE_ARRAY_POOL return new InternalConnection(_parameters, networkStream, reader, environment, _arrayPool); #else - return new InternalConnection(_parameters, networkStream, reader, environment); + return new InternalConnection(_parameters, networkStream, reader, environment); #endif } + private bool UserCertificateValidationCallback(object sender, X509Certificate serverCertificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { var certificateChainPolicyErrors = (sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors; diff --git a/src/AdoNetCore.AseClient/Internal/SchemaTableBuilder.cs b/src/AdoNetCore.AseClient/Internal/SchemaTableBuilder.cs index 29b88a09..6298f58b 100644 --- a/src/AdoNetCore.AseClient/Internal/SchemaTableBuilder.cs +++ b/src/AdoNetCore.AseClient/Internal/SchemaTableBuilder.cs @@ -130,17 +130,12 @@ private FillTableResults FillTableFromFormats(DataTable table) private void TryLoadKeyInfo(DataTable table, string baseTableNameValue, string baseSchemaNameValue, string baseCatalogNameValue) { if (_connection == null) - { throw new InvalidOperationException("Invalid AseCommand.Connection"); - } if (_connection.State != ConnectionState.Open) - { throw new InvalidOperationException("Invalid AseCommand.Connection.ConnectionState"); - } - if (!string.IsNullOrWhiteSpace(baseTableNameValue) && - !string.IsNullOrWhiteSpace(baseCatalogNameValue)) + if (string.IsNullOrWhiteSpace(baseTableNameValue)) return; using (var command = _connection.CreateCommand()) diff --git a/test/AdoNetCore.AseClient.Tests/AdoNetCore.AseClient.Tests.csproj b/test/AdoNetCore.AseClient.Tests/AdoNetCore.AseClient.Tests.csproj index 9728f013..d2636731 100644 --- a/test/AdoNetCore.AseClient.Tests/AdoNetCore.AseClient.Tests.csproj +++ b/test/AdoNetCore.AseClient.Tests/AdoNetCore.AseClient.Tests.csproj @@ -10,6 +10,7 @@ + @@ -34,9 +35,11 @@ + + diff --git a/test/AdoNetCore.AseClient.Tests/Integration/AseCommandTests.cs b/test/AdoNetCore.AseClient.Tests/Integration/AseCommandTests.cs index 445f871c..83888baa 100644 --- a/test/AdoNetCore.AseClient.Tests/Integration/AseCommandTests.cs +++ b/test/AdoNetCore.AseClient.Tests/Integration/AseCommandTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Xml; using AdoNetCore.AseClient.Internal; using AdoNetCore.AseClient.Tests.Util; @@ -178,6 +179,106 @@ public void Command_Reuse_ShouldWork() } } + [TestCaseSource(nameof(ReUseCommandTypeData))] + public void Command_Reuse_ShouldWork_For_Null_Value(System.Data.DbType dbType, Type type, object value) + { + using (var connection = GetConnection()) + { + connection.Open(); + using (var cmd = connection.CreateCommand()) + { + var sql = @"SELECT @value"; + var p = cmd.CreateParameter(); + p.ParameterName = "@value"; + p.DbType = dbType; + p.Value = Convert.ChangeType(value, type); + cmd.CommandText = sql; + cmd.Parameters.Add(p); + cmd.ExecuteScalar(); + + p = cmd.CreateParameter(); + p.ParameterName = "@value"; + p.DbType = dbType; + p.Value = null; + cmd.Parameters.Clear(); + cmd.Parameters.Add(p); + + cmd.ExecuteScalar(); + } + } + } + + + [TestCaseSource(nameof(ReUseCommandTypeData))] + public void Command_Reuse_ShouldWork_For_NonNull_Value(System.Data.DbType dbType, Type type, object value) + { + using (var connection = GetConnection()) + { + connection.Open(); + using (var cmd = connection.CreateCommand()) + { + var sql = @"SELECT @value"; + var p = cmd.CreateParameter(); + p.ParameterName = "@value"; + p.DbType = dbType; + p.Value = null; + cmd.CommandText = sql; + cmd.Parameters.Add(p); + cmd.ExecuteScalar(); + + p = cmd.CreateParameter(); + p.ParameterName = "@value"; + p.DbType = dbType; + p.Value = Convert.ChangeType(value, type); + cmd.Parameters.Clear(); + cmd.Parameters.Add(p); + + cmd.ExecuteScalar(); + } + } + } + + [Test] + public void Command_Duplicate_Parameter_Name_Should_Throws_ArgumentException() + { + using (var connection = GetConnection()) + { + connection.Open(); + var sql = "select @p1, @p2"; + var aseCommand = connection.CreateCommand(); + aseCommand.CommandText = sql; + aseCommand.CommandType = CommandType.Text; + aseCommand.Parameters.Add("@p1", "test"); + aseCommand.Parameters.Add("@p2", "test2"); + Assert.Throws(() => aseCommand.Parameters.Add("@p1", "test3")); + } + } + + private static IEnumerable ReUseCommandTypeData() + { + yield return new TestCaseData(DbType.Boolean, typeof(bool), false); + yield return new TestCaseData(DbType.Byte, typeof(byte), 12); + yield return new TestCaseData(DbType.SByte, typeof(sbyte), 2); + yield return new TestCaseData(DbType.Int16, typeof(short), 3); + yield return new TestCaseData(DbType.UInt16, typeof(ushort), 4); + yield return new TestCaseData(DbType.Int32, typeof(int), 23); + yield return new TestCaseData(DbType.UInt32, typeof(uint), 45); + yield return new TestCaseData(DbType.Int64, typeof(long), 76434755); + yield return new TestCaseData(DbType.UInt64, typeof(ulong), 1223); + yield return new TestCaseData(DbType.String, typeof(string), "If it could only be like this always—always summer, always alone, the fruit always ripe"); + yield return new TestCaseData(DbType.AnsiString, typeof(string), "Doubt thou the stars are fire; Doubt that the sun doth move; Doubt truth to be a liar; But never doubt I love"); + yield return new TestCaseData(DbType.AnsiStringFixedLength, typeof(string), "For never was a story of more woe than this of Juliet and her Romeo."); + yield return new TestCaseData(DbType.Guid, typeof(string), "e2207b47-3fce-4187-808f-e206398a9133"); + yield return new TestCaseData(DbType.Decimal, typeof(decimal), 342.23); + yield return new TestCaseData(DbType.Currency, typeof(decimal), 1233.3); + yield return new TestCaseData(DbType.Single, typeof(float), 20.34f); + yield return new TestCaseData(DbType.Double, typeof(double), 3423.234d); + yield return new TestCaseData(DbType.DateTime, typeof(DateTime), "2019-03-13 03:20:35.23 AM"); + yield return new TestCaseData(DbType.Date, typeof(DateTime), "2018-07-04 23:20:35.23 PM"); + yield return new TestCaseData(DbType.Time, typeof(DateTime), "2014-09-10 23:20:35"); + + } + private static IEnumerable GetDataTypeName_ShouldWork_Cases() { yield return new TestCaseData("convert(unichar(2), 'À')", "unichar"); @@ -244,5 +345,15 @@ private static IEnumerable GetDataTypeName_ShouldWorkUtf8_Cases() yield return new TestCaseData("convert(nvarchar(2), 'a')", "nvarchar"); yield return new TestCaseData("convert(nvarchar(2), null)", "nvarchar"); } + + public T CastObject(object input) { + return (T) input; + } + + public T ConvertObject(object input) { + return (T) Convert.ChangeType(input, typeof(T)); + } + } + } diff --git a/test/AdoNetCore.AseClient.Tests/Integration/ConnectionTests.cs b/test/AdoNetCore.AseClient.Tests/Integration/ConnectionTests.cs index 1faa913a..3da3b611 100644 --- a/test/AdoNetCore.AseClient.Tests/Integration/ConnectionTests.cs +++ b/test/AdoNetCore.AseClient.Tests/Integration/ConnectionTests.cs @@ -43,5 +43,21 @@ public void OpenConnection_ToNonListeningServer_ThrowsAseException() Assert.AreEqual(30294, ex.Errors[0].MessageNumber); } } + + [Test] + //Note: for this to work, we would need a sybase SSL setup with a separate SSL port + //for this test, no certificate on the consuming side + public void UserCertificateValidationCallback_ShouldWork() + { + var isDelegateCalled = false; + + using (var connection = new AseConnection(ConnectionStrings.Tls)) + { + connection.UserCertificateValidationCallback = (o, cert, chain, pol) => { isDelegateCalled = true; return true; }; + + connection.Open(); + Assert.True(isDelegateCalled); + } + } } } diff --git a/test/AdoNetCore.AseClient.Tests/Integration/TextEchoProcedureTests.cs b/test/AdoNetCore.AseClient.Tests/Integration/TextEchoProcedureTests.cs index 96795d8a..02837b05 100644 --- a/test/AdoNetCore.AseClient.Tests/Integration/TextEchoProcedureTests.cs +++ b/test/AdoNetCore.AseClient.Tests/Integration/TextEchoProcedureTests.cs @@ -447,8 +447,8 @@ public void Insert_Text_ShouldBeValid() fragmentCommand.CommandType = CommandType.Text; fragmentCommand.Transaction = transaction; - //var bytesSegmentSize = 16382; - var bytesSegmentSize = 2048; + var bytesSegmentSize = 16382; + //var bytesSegmentSize = 2048; var data = Enumerable.Repeat((byte) 0x65, 16384).ToArray(); //var data = Enumerable.Repeat((byte) 0x65, 6380).ToArray(); var totalSegment = GetTotalSegments(data.Length, bytesSegmentSize ); diff --git a/test/AdoNetCore.AseClient.Tests/Unit/AseConnectionTests.cs b/test/AdoNetCore.AseClient.Tests/Unit/AseConnectionTests.cs index 009a9f05..934d64ef 100644 --- a/test/AdoNetCore.AseClient.Tests/Unit/AseConnectionTests.cs +++ b/test/AdoNetCore.AseClient.Tests/Unit/AseConnectionTests.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Net.Security; using AdoNetCore.AseClient.Interface; using AdoNetCore.AseClient.Internal; using Moq; @@ -166,7 +167,7 @@ public void ChangeDatabase_WhenOpen_Succeeds() var mockConnectionPoolManager = new Mock(); mockConnectionPoolManager - .Setup(x => x.Reserve(It.IsAny(), It.IsAny(), It.IsAny())) + .Setup(x => x.Reserve(It.IsAny(), It.IsAny(), It.IsAny(),It.IsAny())) .Returns(mockConnection.Object); mockConnection.Setup(x => x.ChangeDatabase(It.IsAny())); @@ -176,10 +177,10 @@ public void ChangeDatabase_WhenOpen_Succeeds() // Act connection.Open(); connection.ChangeDatabase("bar"); - // Assert // No error... } + [Test] public void ChangeDatabase_WhenNotOpen_Succeeds() { @@ -188,7 +189,7 @@ public void ChangeDatabase_WhenNotOpen_Succeeds() var mockConnectionPoolManager = new Mock(); mockConnectionPoolManager - .Setup(x => x.Reserve(It.IsAny(), It.IsAny(), It.IsAny())) + .Setup(x => x.Reserve(It.IsAny(), It.IsAny(), It.IsAny(),It.IsAny())) .Returns(mockConnection.Object); mockConnection.Setup(x => x.ChangeDatabase(It.IsAny())); @@ -272,7 +273,7 @@ private static IConnectionPoolManager InitMockConnectionPoolManager() var mockConnectionPoolManager = new Mock(); mockConnectionPoolManager - .Setup(x => x.Reserve(It.IsAny(), It.IsAny(), It.IsAny())) + .Setup(x => x.Reserve(It.IsAny(), It.IsAny(), It.IsAny(),It.IsAny())) .Returns(mockConnection.Object); return mockConnectionPoolManager.Object;