SQL中的本地化或自定义列名
本文关键字:自定义 本地化 SQL | 更新日期: 2023-09-27 18:01:28
我有两个表,在其中我抽象了SQL列名。第一个表有一个"原始"列名和一个"标题"名称。第二个表使用"原始"列名。
--Columns table
ColumnName HeaderName
StandardColumn_1 balance
StandardColumn_2 FName
StandardColumn_3 LName
StandardColumn_4 Age
--Records table
StandardColumn_1 StandardColumn_2 StandardColumn_3
Value1 Value2 Value3
现在,我必须使用C#中的"头"名称编写一个查询。如何使用"表头"名称查询记录表?
例如string balance = "StandardColumn_1";
,但我需要从列表中动态获取值。
简单的方法是只查询第一个表,并将其存储在用于查询第二个表的Dictionary
中。
Dictionary<string, string> columnMap = new Dictionary<string, string>();
using (var conn = new SqlConnection(...))
using (var cmd = new SqlCommand("SELECT HeaderName, ColumnName FROM Columns"))
using (var dr = cmd.ExecuteReader())
{
while (dr.Read())
{
columnMap.Add(dr.GetString(0), dr.GetString(1));
}
}
现在,您有了一个从HeaderName
到ColumnName
的映射,可以用来构建SQL查询。缓存此映射是一种常见的做法,因为标头名称通常是通过某种设置过程完成的,并且不会经常更改。
如果你的"标题"名称足够唯一,那么一个简单的替换就可以了:
const string originalSql = "SELECT Balance FROM Records WHERE Age = 23";
string convertedSql = originalSql;
foreach (var kvp in columnMap)
{
convertedSql = convertedSql.Replace(kvp.Key, kvp.Value);
}
如果不能保证它们是唯一的子字符串(例如,可以有"Name"answers"FName"(,那么可能需要使用正则表达式来替换。
你试图实现的目标对我来说有点神秘,但无论如何我都会尽力回答。我假设Column Name
是StandardColumn_i
字符串的序列,其中i >= 1
,并且您希望将连续的"标准列"分配给一组已知的字符串。一种方法是创建一个字典并将其填充到循环中。
首先,我们创建一个包含所有标头名称和标准前缀的数组。
string[] headers = new[] { "balance", "FName", "LName", "Age" };
string prefix = "StandardColumn_";
然后,我们创建一个新的Dictionary
对象,并在循环中填充"标准列":
Dictionary<string, string> columnDict = new Dictionary<string, string>
for (int i = 0; i < headers.Length; i++)
{
columnDict.Add(headers[i], prefix + (i + 1));
}
现在,您可以使用索引器检索列名,如下所示:
Console.WriteLine(dict["FName"]); // prints 'StandardColumn_2'