2016-11-29 37 views
0

我想返回包含来自同一用户的值的多行。我创建了一个返回3个输出的存储过程。存储过程返回多个行到ASP.NET MVC应用程序

我需要检索所有行的值,而不仅仅是第一个。

我回来的是名字和地点。

存储过程:

ALTER PROCEDURE [dbo].[GetCountries] 
    @UserID int, 
    @Name nvarchar(10) output, 
    @Latitude float output, 
    @Longitude float output 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @Nombre = (SELECT p.Name 
        FROM Places AS p 
        INNER JOIN Places_Details AS pd ON p.Name = pd.Name 
        WHERE p.Id_User = @UserID) 

    SET @Latitude = (SELECT pd.Latitude 
        FROM Places AS p 
        INNER JOIN Places_Details AS pd ON p.Name = pd.Name 
        WHERE p.Id_User = @UserID) 

    --set @Longitude = (SELECT pd.Longitude 
    --    FROM Places as p INNER JOIN Places_Details as pd ON p.Name = pd.Name WHERE p.Id_User = @UserID) 

    SELECT @Name, @Latitude, @Longitude 
END 

而在ASP.NET MVC:

public List<PlacesModel> getMyPlaces() 
{ 
     PlacesList = new List<PlacesModel>(); 

     try 
     { 
      using (SqlConnection sqlConnection = DbConnection.OpenConnection()) 
      { 
       using (SqlCommand sqlCommand = new SqlCommand("GetCountries", sqlConnection)) 
       { 
        sqlCommand.CommandType = CommandType.StoredProcedure; 
        SqlCommandBuilder.DeriveParameters(sqlCommand); 

        sqlCommand.Parameters["@UserID"].Value = 415;//UserRepository.getInstance().getUserId(); 
        sqlCommand.Parameters["@Name"].Value = ""; 
        sqlCommand.Parameters["@Latitude"].Value = 415; 
        sqlCommand.Parameters["@Longitude"].Value = 415; 

        sqlCommand.ExecuteNonQuery(); 

        string name = (string) sqlCommand.Parameters["@Nombre"].Value; 
        double lat= (double)sqlCommand.Parameters["@Latitude"].Value; 
        double lon = (double)sqlCommand.Parameters["@Longitude"].Value; 

        if(!name.Equals("") & lat > 0 && long> 0) 
        { 
         PlacesModel placesm = new LugaresModel(); 
         placesm.Place = name; 
         placesm.Latitude = Convert.ToString(lat); 
         placesm.Longitude = Convert.ToString(lon); 
         PlacesList.Add(placesm); 
        } 
       } 

       sqlConnection.Close(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.GetBaseException(); 
     } 

     return PlacesList; 
    } 
} 

我得到这个错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

任何解决方案?谢谢

+0

您'SELECT'子句返回多个记录 –

+0

根据错误消息,似乎存储过程中的一个查询返回多个行/记录。如果你只希望从'select'查询中得到一行,或者只需要第一行,你可以通过在你的'select'语句中加入'TOP 1'来实现。 – fujiFX

+0

我需要检索所有的倍数行,而不仅仅是第一个。 – Azrael94

回答

0

其中一个查询返回多行。如果您使用该标识运行存储过程而不使用ASP.NET,则只需直接通过SQL Server Management Studio(或Visual Studio数据工具)即可看到相同的错误。我怀疑你的Places_Details对于给定的Id有多个行。

看着你在做什么,看起来你的查询应该是真的如下所示。

SELECT p.Name, pd.Latitude, pd.Longitude 
FROM Places as p INNER JOIN Places_Details as pd ON p.Name = pd.Name 
WHERE p.Id_User = @UserID 

这将返回您正在寻找的结构,其中您为用户提供LAT和LONG。你将删除你的错误,并发现你有多个行返回相同的用户ID。您将拥有一个非规范化表格,您可以使用C#中的Linq GroupBy对结果进行分组(或循环处理结果并处理一对多项目)。

唯一的其他选择是有三个程序,一个返回人,一个纬度和一个经度。但我认为你会发现立即获得所有数据,并且自己展平可能会更快。

我知道的唯一的其他选择是使用类似Dapper ORM的东西,您可以将三个存储过程调用链接在一起,以便它们全部返回,并将一个实体映射到多个行。但是这确实在这个问题之外。

+0

感谢您的回答。我添加SqlDataReader reader = sqlCommand.ExecuteReader();.这将返回一个fieldCount 3,它是名称,经度和纬度。但事情是,我只是看到了这个名字,但没有合作。 – Azrael94

+0

我解决了。就像任何阵列一样,你需要设置位置,你会得到这个项目。 – Azrael94