2016-11-29 5 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

エラーメッセージに基づいて、ストアドプロシージャのクエリの1つが複数の行/レコードを返しているようです。 'select'クエリから単一行しか期待できない場合や、最初の行が必要な場合は、' select'文に 'TOP 1'を追加してください。 – fujiFX

+0

最初のものだけでなく、すべての倍数の行を取得する必要があります。 – Azrael94

答えて

0

複数のクエリのうちの1つが複数の行を返しています。 ASP.NETを使用せずにそのIDを使用してストアドプロシージャを実行する場合、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を使用して結果をグループ化したり、結果をループしたり、1つまたは複数のアイテムを処理したりすることができます。

唯一の他の選択肢は、その人を返すもの、緯度と経度の3つの手順を持つことです。しかし、私はあなたがすぐにすべてのデータを取得し、自分自身を平らにすることがおそらくより速くなると思うでしょう。

私が知っている唯一の他の選択肢はDapper ORMのようなものを使用することです.3つのストアドプロシージャ呼び出しを連鎖させて、それらがすべて接続時に返されるようにして、単一のエンティティを複数の行にマッピングします。しかし、それは確かにこの質問の外です。

+0

あなたの答えをありがとう。私は、SqlDataReaderリーダー= sqlCommand.ExecuteReader();を追加します。これは、名前、緯度および経度であるfieldCount 3を返します。しかし、事は私が名前を見ているだけで、coordenatesは見えないということです。 – Azrael94

+0

私は解決しました。任意の配列のように、位置を設定する必要がありますし、アイテムを取得します。 – Azrael94