2016-11-29 1 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' или нужна только 1-я строка, вы можете достичь этого, добавив' TOP 1' в свои 'select' заявления. – fujiFX

+0

Мне нужно получить все кратные строки, а не только первые. – Azrael94

ответ

0

Один из ваших запросов возвращает более одной строки. Если вы запустили хранимую процедуру с этим идентификатором без использования ASP.NET, просто через SQL Server Management Studio (или Visual Studio Data Tools) вы, вероятно, увидите ту же ошибку. Я подозреваю, что ваш Places_Details имеет более одной строки для данного идентификатора.

Глядя на то, что вы делаете, кажется, ваш запрос действительно должен быть примерно следующим.

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 для пользователя. Вы удалите свою ошибку и обнаружите, что несколько строк возвращаются для одного и того же идентификатора пользователя. У вас будет денормализованная таблица, в которой вы можете использовать Linq GroupBy в C# для группировки результатов (или циклических результатов и обработки одного объекта).

Единственный другой вариант - это три процедуры: одна, которая возвращает человека, одну широту и одну долготу. Но я думаю, вы обнаружите, что сразу получите все данные и сгладьте его, вероятно, будет быстрее.

Единственный другой вариант, который я знаю, это использовать что-то вроде Dapper ORM, где вы можете связать три вызова хранимой процедуры вместе, чтобы все они были возвращены при подключении и отобразили бы один объект в несколько строк. Но это, безусловно, вне этих вопросов.

+0

Спасибо за ваш ответ. Я добавляю считыватель SqlDataReader = sqlCommand.ExecuteReader() ;. Это возвращает полеCount 3, которое является именем, широтой и долготой. Но дело в том, что я просто вижу имя, но не координаты. – Azrael94

+0

Я решил. Как и любой массив, вам нужно установить позицию, и вы получите элемент. – Azrael94

Смежные вопросы