【发布时间】:2020-12-28 17:58:59
【问题描述】:
我正在使用我的 .net Web API 连接一个数据库(大约 30 个表)。 现在我使用以下代码:
public static int GetIntNullCheck(IDataRecord reader, string columnName, int valueIfNull = -1)
{
if (reader == null)
throw new ArgumentNullException(nameof(reader));
int ordinal = reader.GetOrdinal(columnName);
return reader.IsDBNull(ordinal) ? valueIfNull : reader.GetInt32(ordinal);
}
因为我的一些查询连接了许多表,所以我想使用完全限定的列名来访问结果。 有没有办法在 ado.net 中以干净的方式做到这一点?互联网上有多个关于此主题的问题已得到解答,但在我的情况下,每个解决方案都是 hack 或不实用。
想过但不想用的东西:
1.对冲突的列名使用 SQL 列别名
这在理论上是可能的,但我的查询已经非常大,对于每个查询 20 多列这样做是不切实际的
2。更改数据库以在整个数据库中具有唯一的列名
这可能是最现实的解决方案,但列名变得非常混乱。如果我没有其他选择,我必须这样做,但我真的很想避免它。
3.使用SQLDataReader.GetSchemaTable()自己编写这个功能
首先我不喜欢这样,因为它感觉像是一种 hack,并且可能对性能不利。此外,这不适用于表别名,但我必须在我的一些查询中使用这些别名来进行自联接。尽管如此,我还是尝试实现它,但我只在表的BaseTableName 字段上得到空值,尽管我使用command.ExecuteReader(CommandBehavior.KeyInfo))
3.使用不同的数据库连接库
Ado.Net 被广泛使用,我主要使用许多人使用的库,因为它们更易于维护 - 如果我对它们有问题,几乎可以肯定互联网上的 100 个人也有同样的问题,并且有博客文章讨论解决方案。如果 ado.net 中没有干净的方法,我会切换图书馆。
必须有一个好方法来做到这一点。就像我提到的,有很多人有这个问题,而且 ado.net 足够大,所以它应该支持它。我只想能够使用reader.GetOrdinal(tableName + "." + columnName);。我总是将它与 java 中的 JDBC 一起使用,所以它必须可以从 SQL 端实现
因此这里是我的结果问题:
我是否错过了一些可能的解决方案,或者您认为我描述的解决方案之一比我想象的要好?
【问题讨论】:
标签: sql sql-server .net-core ado.net