无法从不同的外表中将sql数据导入listview(2个表)

时间:2015-03-20 19:08:39

标签: c# sql asp.net listview webforms

几天来一直困在同一个问题上,我一直在网上寻找答案。

我的问题是:在下面的代码中,我得到了两个有1个外键的表。我想在该表中显示nvarchar而不是ID。

在我的aspx页面中,我有一个Listview。

<asp:ListView ID="ListView_Fruit" ItemType="DifferentFruit.Model.Fruit" 
    SelectMethod="ListView_GetData" DataKeyNames="FruitID" runat="server" 
    DeleteMethod="ListView_Del" 
    UpdateMethod="ListView_Update" >
    <LayoutTemplate>
        <table>
            <tr>
                <th>FruitID</th>
                <th>Fruit Name</th>
                <th>TypeOfFruitID</th>
            </tr>
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td><%# Item.FruitID  %></td>
            <td><%# Item.FruitName  %></td>
            <td><%# Item.TypeOfFruitID %></td>
        </tr>
    </ItemTemplate>

数据库

Fruits 
FruitID(int) Pk
FruitName nvarchar(20)
FruitsTypeID(int) 

FruitsType 
FruitsTypeID(int) (fk)
FruitType(nvarchar(20)

现在我显示存储过程中的每个水果。

Getting all data.
    SELECT FruitID, FruitName, TypeOfFruitID
    FROM Fruits
Getting all data from FruitsType
    SELECT FruitsTypeID, FruitType FROM FruitsType
    WHERE FruitsTypeID = CAST(FruitsTypeID as nvarchar(20))

如何显示FruitsType中的数据?现在它只显示FruitsTypeID而不是FruitsType中的另一行。我想显示FruitType

我的水果数据库层

    public IEnumerable<Fruits> GettingAllFruits(int startRow, int maxRow, out int totalRows)
    {
        using (SqlConnection conn = Create())
        {

                SqlCommand cmd = new SqlCommand("appSchema.app_getFruits", conn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@PageIndex", startRow / maxRow + 1);
                cmd.Parameters.Add("@PageSize", maxRow);
                cmd.Parameters.Add("@RecordCount", ParameterDirection.Output)

                conn.Open();

                using (SqlDataReader reader = cmd.ExecuteReader())
                {

                    int fruitID = reader.GetOrdinal("FruitID");
                    int fruitName = reader.GetOrdinal("FruitName");
                    int fruitType = reader.GetOrdinal("TypeOfFruitID");

                    while (reader.Read())
                    {
                        Fruits fruit = new Fruits();
                        fruit.fruitID = reader.GetInt32(fruitID);
                        fruit.fruitName = reader.GetString(fruitName);
                        fruit.typeOfFruitID = reader.GetInt32(fruitType);
                        fruitslist.Add(fruits);
                    }
                }

                totalRows = (int)cmd.Parameters["@RecordCount"].Value;

                fruitlist.TrimExcess();

                return fruitlist;
            }
        }
    }

我的存储过程(已更新)

BEGIN SELECT ROW_NUMBER() 
OVER ( ORDER BY 
[FruitID] DESC 
)AS RowNumber 
,[FruitID] 
,[FruitName] 
,[FruitsTypeID] 
INTO #FruitsRes 
FROM [Fruits] 
INNER JOIN FruitsType ON Fruits.TypeOfFruitID = FruitsType.FruitsTypeID 
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 
DROP TABLE #Results 
END

存储过程很好但是当存储过程被调回到应用程序时,我收到转换错误。这说不能转换为&#39; Apple&#39;到int。 错误在这里 - &gt;

int fruitType = reader.GetOrdinal("TypeOfFruitID");

1 个答案:

答案 0 :(得分:1)

你基本上在寻找Inner Join,试试这个: -

SELECT FruitID, FruitName, FruitType
FROM Fruits INNER JOIN FruitsType
ON Fruits.TypeOfFruitID = FruitsType.FruitsTypeID