TableMappings与表名而不是表

时间:2014-08-08 04:40:40

标签: c# asp.net .net sql-server vb.net

我不确定这是可能的,但我只是想不通。 我的数据库中有一个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#中的代码也会有所帮助。

2 个答案:

答案 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)

您的第二个示例是正确使用此功能。