C# 将多行返回到ASP.NET MVC应用程序的存储过程
我试图返回包含来自同一用户的值的多个行。我创建了一个返回3个输出的存储过程 我需要检索所有的行值,而不仅仅是第一个 我返回的是姓名和地点 存储过程: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;
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,我解决了。与任何阵列一样,您需要设置位置,然后才能获得物品。谢谢