我不确定这是可能的,但我只是想不通。 我的数据库中有一个SP,如下所示:
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
我要做的是将表格与数据库like this中的表名映射:
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#中的代码也会有所帮助。
答案 0 :(得分:2)
Chinz,
这是一个可以为您提供所需内容的Hack ...
在您的存储过程中,为您的选择添加一个附加字段(TableName)
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
现在在da.Fill(ds)
之后的c#代码中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是一种从DataTable中抓取第一个字段的方法
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();
}
另一种方法是首先在存储过程中选择表的顺序和名称。然后在da.Fill(ds)之后的c#代码中,您可以读取ds.tables [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
并在da.Fill(ds)之后的c#代码中执行此操作
//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();
}
答案 1 :(得分:0)
正如MSDN中的文档所描述的那样,它应该被使用。
http://msdn.microsoft.com/en-us/library/ms810286.aspx
如果按顺序设置存储过程,则必须在将来保留该顺序。
如果您想制作这款Dynimac,您可以验证表架构并尝试确定您是否正在查看正确的表格,但这会增加性能成本。
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)
您的第二个示例是正确使用此功能。