TableMappings With TableName Instead of TableN
本文关键字:of TableN Instead TableName With TableMappings | 更新日期: 2023-09-27 18:16:58
我不确定这是可能的,但我就是想不出来。我有一个SP在我的DB如下:
CREATE PROCEDURE [dbo].[GetMyValue]
AS
SELECT Code, TypeDesc FROM IDType
SELECT Code, Race FROM Race
SELECT Code, Nation FROM Nationality
SELECT Code, [Language name] AS 'Language' FROM Languages
SELECT Code, Occupation FROM Occupation
SELECT Code, Country FROM Country
GO
我想做的是映射表与表名从DB像这样:
Dim da As New SqlDataAdapter(cmd)
da.TableMappings.Add("IDType", "NRICType")
da.TableMappings.Add("Race", "Race")
da.TableMappings.Add("Nationality", "Nationality")
da.TableMappings.Add("Languages", "Languages")
da.TableMappings.Add("Occupation", "Occupation")
da.TableMappings.Add("Country", "Country")
da.Fill(ds)
而不是像这样使用TableN:
Dim da As New SqlDataAdapter(cmd)
da.TableMappings.Add("Table", "NRICType")
da.TableMappings.Add("Table1", "Race")
da.TableMappings.Add("Table2", "Nationality")
da.TableMappings.Add("Table3", "Languages")
da.TableMappings.Add("Table4", "Occupation")
da.TableMappings.Add("Table5", "Country")
da.Fill(ds)
无论如何,当我尝试使用Dim dt As DataTable = ds.Tables("NRICType")
访问后一部分的值时,它似乎不起作用。ds.Tables("NRICType")
看起来是NULL
。当我将它映射到TableN时,一切都很好。
但未来可能出现的问题是,如果SP中SELECT STATEMENT
的序列发生变化会怎样?映射肯定会搞砸。c#代码也会有帮助。
中国,
这是一个Hack,会给你什么你正在寻找…
在您的存储过程中添加一个额外的字段(TableName)到您的select
CREATE PROCEDURE [dbo].[GetMyValue]
AS
SELECT 'IDType' TableName, Code, TypeDesc FROM IDType
SELECT 'Race' TableName, Code, Race FROM Race
SELECT 'Nationality' TableName, Code, Nation FROM Nationality
SELECT 'Languages' TableName, Code, [Language name] AS 'Language' FROM Languages
SELECT 'Occupation' TableName, Code, Occupation FROM Occupation
SELECT 'Country' TableName, Code, Country FROM Country
GO
现在在你的c#代码中data . fill (ds)
之后da.Fill(ds);
for (int i = 0; i < ds.Tables.Count; i++)
{
if (i == 0)
da.TableMappings.Add("table", GetTableName(i, ds));
else
da.TableMappings.Add("table" + i.ToString(), GetTableName(i, ds));
}
GetTableName是一个从数据表中获取第一个字段的方法
static string GetTableName(int tableIndex, DataSet ds)
{
if (ds.Tables[tableIndex].Rows.Count > 0)
return ds.Tables[tableIndex].Rows[0]["TableName"].ToString();
// If there aren't any rows I don't know the Table name and return table[index] as the name
return "table" + tableIndex.ToString();
}
另一种方法是在存储过程中首先选择表的顺序和名称。然后在你的c#代码data . fill (ds)之后,你可以从ds中读取行。表[0],并将其用于表映射。
我希望这对你有帮助。
如果您不想处理结果中多余的列,那么考虑以下
您的存储过程将有一个额外的选择,这将是第一个选择,并定义被返回的表的顺序。
CREATE PROCEDURE [dbo].[GetMyValue]
AS
SELECT 'IDType' TableName, 1 as SortOrder
UNION
SELECT 'Race' TableName , 2 as SortOrder
UNION
SELECT 'Nationality' TableName , 3 as SortOrder
UNION
SELECT 'Languages' TableName ,4 as SortOrder
UNION
SELECT 'Occupation' TableName , 5 as SortOrder
UNION
SELECT 'Country' TableName, 6 as SortOrder
ORDER BY SortOrder
SELECT Code, TypeDesc FROM IDType
SELECT Code, Race FROM Race
SELECT Code, Nation FROM Nationality
SELECT Code, [Language name] AS 'Language' FROM Languages
SELECT Code, Occupation FROM Occupation
SELECT Code, Country FROM Country
GO
和c#代码中data . fill (ds)后面的
//string[] listOfTableNames;
listOfTableNames = GetTableNames(ds);
for (int i = 0; i < ds.Tables.Count; i++)
{
da.TableMappings.Add("table" + i.ToString(), listOfTableNames[i]);
}
和GetTableNames方法被定义为
static string[] GetTableNames( DataSet ds)
{
List<string> tablenames = new List<string>();
// The first Table contains the TABLE NAMES
tablenames.Add("TableNames");
if (ds.Tables[0].Rows.Count > 0)
foreach( DataRow row in ds.Tables[0].Rows)
{
tablenames.Add(row["TableName"].ToString());
}
return tablenames.ToArray();
}
正如MSDN文档中所描述的那样,这是应该使用的方式。
http://msdn.microsoft.com/en-us/library/ms810286.aspx如果存储过程是按这个顺序设置的,那么以后必须保持这个顺序。
如果你想让这个动态,你可以验证表模式,并尝试确定你是否在看正确的表,但这将增加很大的性能成本。
Dim da As New SqlDataAdapter(cmd)
da.TableMappings.Add("Table", "NRICType")
da.TableMappings.Add("Table1", "Race")
da.TableMappings.Add("Table2", "Nationality")
da.TableMappings.Add("Table3", "Languages")
da.TableMappings.Add("Table4", "Occupation")
da.TableMappings.Add("Table5", "Country")
da.Fill(ds)
第二个例子是这个特性的正确用法