C# 将多行返回到ASP.NET MVC应用程序的存储过程

C# 将多行返回到ASP.NET MVC应用程序的存储过程,c#,sql-server,asp.net-mvc,C#,Sql Server,Asp.net Mvc,我试图返回包含来自同一用户的值的多个行。我创建了一个返回3个输出的存储过程 我需要检索所有的行值,而不仅仅是第一个 我返回的是姓名和地点 存储过程: ALTER PROCEDURE [dbo].[GetCountries] @UserID int, @Name nvarchar(10) output, @Latitude float output, @Longitude float output AS BEGIN SET NOCOUNT ON;

我试图返回包含来自同一用户的值的多个行。我创建了一个返回3个输出的存储过程

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

我返回的是姓名和地点

存储过程:

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;
    }
}
公共列表getMyPlaces()
{
PlacesList=新列表();
尝试
{
使用(SqlConnection SqlConnection=DbConnection.OpenConnection())
{
使用(SqlCommand SqlCommand=newsqlcommand(“GetCountries”,sqlConnection))
{
sqlCommand.CommandType=CommandType.StoredProcess;
派生参数(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();
字符串名称=(字符串)sqlCommand.Parameters[“@Nombre”].Value;
双纬度=(双)sqlCommand.Parameters[“@Latitude”].Value;
double lon=(double)sqlCommand.Parameters[“@Longitude”].Value;
如果(!name.Equals(“”&lat>0&&long>0)
{
PlacesModel placesm=新的LugaresModel();
placesm.Place=名称;
placesm.Latitude=转换为字符串(纬度);
placesm.Longitude=转换为字符串(lon);
PlacesList.Add(placesm);
}
}
sqlConnection.Close();
}
}
捕获(例外e)
{
e、 GetBaseException();
}
返回地层学;
}
}
我得到了这个错误:

子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情


有解决办法吗?谢谢

您的一个查询返回了多行。如果在不使用ASP.NET的情况下使用该ID运行存储过程,直接通过SQL Server Management Studio(或Visual Studio数据工具)可能会看到相同的错误。我怀疑对于给定的Id,您的Places\u详细信息不止一行

看看你在做什么,你的查询应该是这样的

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这样的工具,您可以将三个存储过程调用链接在一起,这样它们在连接时都会返回,并且它会将单个实体映射到多行。但这肯定超出了这个问题。

您的一个查询返回了多行。如果在不使用ASP.NET的情况下使用该ID运行存储过程,直接通过SQL Server Management Studio(或Visual Studio数据工具)可能会看到相同的错误。我怀疑对于给定的Id,您的Places\u详细信息不止一行

看看你在做什么,你的查询应该是这样的

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这样的工具,您可以将三个存储过程调用链接在一起,这样它们在连接时都会返回,并且它会将单个实体映射到多行。但这肯定超出了问题的范围。

SELECT
子句返回了多条记录根据错误消息,您在存储过程中的一个查询似乎返回了多行/记录。如果您只需要
select
查询中的一行,或者只需要第一行,您可以通过在
select
语句中添加
TOP 1
来实现。我需要检索所有的多行,不仅仅是第一条。您的
SELECT
子句返回了多条记录根据错误消息,您在存储过程中的一个查询似乎返回了多行/记录。如果您只需要
select
查询中的一行,或者只需要第一行,您可以通过在
select
语句中添加
TOP 1
来实现。我需要检索所有的多行,而不仅仅是第一行。谢谢您的回答。我添加了SqlDataReader=sqlCommand.ExecuteReader();。这将返回字段计数3,即名称、纬度和经度。但问题是我只是看到了名字,没有看到coordenates,我解决了。与任何阵列一样,您需要设置位置,然后才能获得物品。谢谢