Skip to content

Commit a332f6d

Browse files
authored
Merge pull request #22 from DataAction/column-aliases
Make sure resulting column aliases are used if available
2 parents 3a6da80 + d770e72 commit a332f6d

File tree

4 files changed

+116
-7
lines changed

4 files changed

+116
-7
lines changed

src/AdoNetCore.AseClient/AseDataReader.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ public override string GetName(int i)
472472
throw new ArgumentOutOfRangeException(nameof(i));
473473
}
474474

475-
return format.ColumnName;
475+
return format.DisplayColumnName;
476476
}
477477

478478
public override int GetOrdinal(string name)
@@ -495,7 +495,7 @@ public override int GetOrdinal(string name)
495495

496496
for (var i = 0; i < formats.Length; i++)
497497
{
498-
if (string.Equals(formats[i].ColumnName?.TrimStart('[').TrimEnd(']'), name, StringComparison.OrdinalIgnoreCase))
498+
if (string.Equals(formats[i].DisplayColumnName?.TrimStart('[').TrimEnd(']'), name, StringComparison.OrdinalIgnoreCase))
499499
{
500500
return i;
501501
}
@@ -640,7 +640,7 @@ private void EnsureSchemaTable()
640640
var row = table.NewRow();
641641
var aseDbType = TypeMap.GetAseDbType(column);
642642

643-
row[columnName] = string.IsNullOrWhiteSpace(column.ColumnLabel) ? column.ColumnName : column.ColumnLabel;
643+
row[columnName] = column.DisplayColumnName;
644644
row[columnOrdinal] = i;
645645
row[columnSize] = column.Length ?? -1;
646646
row[numericPrecision] = column.Precision ?? -1;

src/AdoNetCore.AseClient/Internal/FormatItem.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ public string ParameterName
3232
public bool IsNullable { get; set; }
3333
public bool IsOutput { get; set; }
3434

35+
/// <summary>
36+
/// Get the most appropriate column name to display to the driver user.
37+
/// Preference is to the Label/Alias (e.g. "some_alias" from "select some_column as some_alias")
38+
/// If no Label/Alias, then just use whatever value the underlying column name has.
39+
/// </summary>
40+
public string DisplayColumnName => string.IsNullOrWhiteSpace(ColumnLabel)
41+
? ColumnName
42+
: ColumnLabel;
43+
3544
/// <summary>
3645
/// Relates to TDS_BLOB
3746
/// </summary>
@@ -104,6 +113,7 @@ public static FormatItem ReadForRow(Stream stream, Encoding enc, TokenType srcTo
104113
ReadTypeInfo(format, stream, enc);
105114

106115
Logger.Instance?.WriteLine($" <- {format.ColumnName}: {format.DataType} (len: {format.Length}) (ut:{format.UserType}) (status:{format.RowStatus}) (loc:{format.LocaleInfo})");
116+
Logger.Instance?.WriteLine($" <- format names available: ColumnLabel [{format.ColumnLabel}], ColumnName [{format.ColumnName}], CatalogName [{format.CatalogName}], ParameterName [{format.ParameterName}], SchemaName [{format.SchemaName}], TableName [{format.TableName}]");
107117

108118
return format;
109119
}
@@ -186,7 +196,7 @@ private static void ReadTypeInfo(FormatItem format, Stream stream, Encoding enc)
186196
break;
187197
}
188198
default:
189-
throw new NotSupportedException($"Unsupported data type {format.DataType} (column: {format.ColumnName})");
199+
throw new NotSupportedException($"Unsupported data type {format.DataType} (column: {format.DisplayColumnName})");
190200
}
191201

192202
format.LocaleInfo = stream.ReadByteLengthPrefixedString(enc);

test/AdoNetCore.AseClient.Tests/AdoNetCore.AseClient.Tests.csproj

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@
3333
<PackageReference Include="System.Data.Common" Version="4.3.0" />
3434
</ItemGroup>
3535
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp2.0'">
36-
<PackageReference Include="Sybase.AdoNet4.AseClient">
37-
<Version>1.0.0</Version>
38-
</PackageReference>
3936
<PackageReference Include="System.Security.Permissions">
4037
<Version>4.4.1</Version>
4138
</PackageReference>
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
using System;
2+
using System.Data;
3+
using System.Linq;
4+
using AdoNetCore.AseClient.Internal;
5+
using Dapper;
6+
using NUnit.Framework;
7+
8+
namespace AdoNetCore.AseClient.Tests.Integration
9+
{
10+
[TestFixture]
11+
public class AliasTests
12+
{
13+
private IDbConnection GetConnection()
14+
{
15+
Logger.Enable();
16+
return new AseConnection(ConnectionStrings.Pooled);
17+
}
18+
19+
[SetUp]
20+
public void Setup()
21+
{
22+
using (var connection = GetConnection())
23+
{
24+
connection.Execute("create table [dbo].[test_aliases] (column_with_table_name int)");
25+
connection.Execute("insert into [dbo].[test_aliases] (column_with_table_name) values (1)");
26+
}
27+
}
28+
29+
[TestCase]
30+
public void SelectColumnWithoutAlias_UsesColumnName_InResultSet()
31+
{
32+
using (var connection = GetConnection())
33+
{
34+
connection.Open();
35+
using (var command = connection.CreateCommand())
36+
{
37+
command.CommandText = "select column_with_table_name from [dbo].[test_aliases]";
38+
39+
using (var reader = command.ExecuteReader(CommandBehavior.SingleRow))
40+
{
41+
Assert.AreEqual(0, reader.GetOrdinal("column_with_table_name"));
42+
Assert.Throws<ArgumentException>(() => reader.GetOrdinal("aliased_name"));
43+
}
44+
}
45+
}
46+
}
47+
48+
[TestCase]
49+
public void SelectColumnWithAlias_UsesAliasName_InResultSet()
50+
{
51+
using (var connection = GetConnection())
52+
{
53+
connection.Open();
54+
using (var command = connection.CreateCommand())
55+
{
56+
command.CommandText = "select column_with_table_name as aliased_name from [dbo].[test_aliases]";
57+
58+
using (var reader = command.ExecuteReader(CommandBehavior.SingleRow))
59+
{
60+
Assert.AreEqual(0, reader.GetOrdinal("aliased_name"));
61+
Assert.Throws<ArgumentException>(() => reader.GetOrdinal("column_with_table_name"));
62+
}
63+
}
64+
}
65+
}
66+
67+
private class AliasTestsDapperResult
68+
{
69+
public int? column_with_table_name { get; set; }
70+
public int? aliased_name { get; set; }
71+
}
72+
73+
[TestCase]
74+
public void SelectColumnWithoutAlias_UsesColumnName_InDapperResult()
75+
{
76+
using (var connection = GetConnection())
77+
{
78+
var result = connection.Query<AliasTestsDapperResult>("select column_with_table_name from [dbo].[test_aliases]", commandType: CommandType.Text).FirstOrDefault();
79+
Assert.IsNotNull(result?.column_with_table_name);
80+
}
81+
}
82+
83+
[TestCase]
84+
public void SelectColumnWithAlias_UsesAliasName_InDapperResult()
85+
{
86+
using (var connection = GetConnection())
87+
{
88+
var result = connection.Query<AliasTestsDapperResult>("select column_with_table_name as aliased_name from [dbo].[test_aliases]", commandType: CommandType.Text).FirstOrDefault();
89+
Assert.IsNotNull(result?.aliased_name);
90+
}
91+
}
92+
93+
[TearDown]
94+
public void Teardown()
95+
{
96+
using (var connection = GetConnection())
97+
{
98+
connection.Execute("drop table [dbo].[test_aliases]");
99+
}
100+
}
101+
}
102+
}

0 commit comments

Comments
 (0)