111 lines
4.2 KiB
C#
111 lines
4.2 KiB
C#
using Microsoft.Data.SqlClient;
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
using Sarand.Net.Standard.Base.Dbas;
|
|
using Sarand.Net.Standard.Dbas.Base;
|
|
using Sarand.Net.Standard.Dbas.Data;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Data.Common;
|
|
using System.Data.Odbc;
|
|
|
|
namespace Sacs.UnitTests.Net.Standard.Base.Dbas
|
|
{
|
|
[TestClass]
|
|
public class DatabaseProvider_Tester
|
|
{
|
|
private class ParameterTestItem : DbDataItem
|
|
{
|
|
public ParameterTestItem() : base() { }
|
|
public override string SchemaName => "dbo";
|
|
public override string TableName => "TestItem";
|
|
public override void PopulateFrom(DbCommand dbCommand, string tableAlias, string filter) { }
|
|
public override void PopulateFrom(DbDataReader dbDataReader) { }
|
|
public override bool ExecuteInsertCommand(DbCommand dbCommand) => false;
|
|
public void AddParameter<T>(DbCommand command, string name, T value) => AddCommandParameter(command, name, value);
|
|
}
|
|
|
|
// --- Provider Selection ---
|
|
|
|
[TestMethod]
|
|
public void OpenOdbcDatabase_CreatesSqlClientAndForcedOdbcConnections()
|
|
{
|
|
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig
|
|
{
|
|
Dbms = DbmsType.MsSql,
|
|
DatabaseName = "TestDb",
|
|
Location = "MsSql:localhost\\TestDb",
|
|
ConnectionString = "Driver={SQL Server};Server=localhost;Database=TestDb;Trusted_Connection=Yes;"
|
|
};
|
|
|
|
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
|
|
using DbConnection sqlConnection = database.CreateConnection();
|
|
using DbConnection odbcConnection = database.CreateConnection(true);
|
|
|
|
Assert.IsInstanceOfType(sqlConnection, typeof(SqlConnection));
|
|
StringAssert.Contains(sqlConnection.ConnectionString, "Server=localhost");
|
|
StringAssert.Contains(sqlConnection.ConnectionString, "Database=TestDb");
|
|
Assert.IsInstanceOfType(odbcConnection, typeof(OdbcConnection));
|
|
Assert.AreEqual(config.ConnectionString, odbcConnection.ConnectionString);
|
|
}
|
|
|
|
// --- Command Parameters ---
|
|
|
|
[TestMethod]
|
|
public void AddCommandParameter_AssignsValuesNullsAndExplicitTypes()
|
|
{
|
|
ParameterTestItem item = new ParameterTestItem();
|
|
using SqlCommand command = new SqlCommand();
|
|
|
|
item.AddParameter(command, "@Count", 12);
|
|
item.AddParameter<int?>(command, "@MissingCount", null);
|
|
item.AddParameter<byte[]>(command, "@Data", null);
|
|
|
|
Assert.AreEqual("@Count", command.Parameters[0].ParameterName);
|
|
Assert.AreEqual(12, command.Parameters[0].Value);
|
|
Assert.AreEqual(DbType.Int32, command.Parameters[0].DbType);
|
|
Assert.AreEqual(DBNull.Value, command.Parameters[1].Value);
|
|
Assert.AreEqual(DbType.Int32, command.Parameters[1].DbType);
|
|
Assert.AreEqual(DBNull.Value, command.Parameters[2].Value);
|
|
Assert.AreEqual(DbType.Binary, command.Parameters[2].DbType);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void AddCommandParameter_NormalisesSqlAndOdbcDates()
|
|
{
|
|
ParameterTestItem item = new ParameterTestItem();
|
|
DateTime value = new DateTime(2026, 9, 14, 10, 20, 30, 456, DateTimeKind.Utc);
|
|
using SqlCommand sqlCommand = new SqlCommand();
|
|
using OdbcCommand odbcCommand = new OdbcCommand();
|
|
|
|
item.AddParameter(sqlCommand, "@When", value);
|
|
item.AddParameter(odbcCommand, "When", value);
|
|
|
|
Assert.AreEqual(DbType.DateTime2, sqlCommand.Parameters[0].DbType);
|
|
Assert.AreEqual(DbType.DateTime, odbcCommand.Parameters[0].DbType);
|
|
Assert.AreEqual(value.AddMilliseconds(-456), sqlCommand.Parameters[0].Value);
|
|
Assert.AreEqual(value.AddMilliseconds(-456), odbcCommand.Parameters[0].Value);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void AddCommandParameter_MapsSentinelDatesToDatabaseNull()
|
|
{
|
|
ParameterTestItem item = new ParameterTestItem();
|
|
using SqlCommand command = new SqlCommand();
|
|
|
|
item.AddParameter(command, "@Minimum", DateTime.MinValue);
|
|
item.AddParameter<DateTime?>(command, "@Maximum", DateTime.MaxValue);
|
|
item.AddParameter<DateTime?>(command, "@Missing", null);
|
|
|
|
Assert.AreEqual(DBNull.Value, command.Parameters[0].Value);
|
|
Assert.AreEqual(DBNull.Value, command.Parameters[1].Value);
|
|
Assert.AreEqual(DBNull.Value, command.Parameters[2].Value);
|
|
Assert.AreEqual(DbType.DateTime2, command.Parameters[0].DbType);
|
|
Assert.AreEqual(DbType.DateTime2, command.Parameters[1].DbType);
|
|
Assert.AreEqual(DbType.DateTime2, command.Parameters[2].DbType);
|
|
}
|
|
|
|
// --- The End ---
|
|
}
|
|
}
|