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#代码也会有帮助。

TableMappings With TableName Instead of TableN

中国,

这是一个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)

第二个例子是这个特性的正确用法