using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void RadarScan(int objectID, int scanRadius)
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
   conn.Open();
   SqlCommand cmd = conn.CreateCommand();
   cmd.CommandText =
     "SELECT Location FROM GameObjects WHERE ObjectID = " + objectID.ToString();
   Point3D sourceLocation = Point3D.Null;
   SqlDataReader rdr = cmd.ExecuteReader();
   if (rdr.Read())
   {
      sourceLocation = (Point3D)rdr["Location"];
   }
   rdr.Close();

   // teraz wybierz wszystkie obiekty znajdujące się w zasięgu radaru
   SqlCommand scanCmd = conn.CreateCommand();
   scanCmd.CommandText =
     "SELECT ObjectID, Name, Location.ToString() as CurrentLocation, " +
     "Location.DistanceFromPoint(@pointRef) as DistanceTotarget FROM " +
     "GameObjects WHERE Location.DistanceFromPoint(@pointRef) < " +
     scanRadius.ToString() + "AND ObjectID != " + objectID.ToString();
   scanCmd.Parameters.Add(new SqlParameter("@pointRef", SqlDbType.Udt));
   scanCmd.Parameters[0].UdtTypeName = "Point3D";
   scanCmd.Parameters[0].Value = sourceLocation;

   // wykonaj polecenie i prześlij wyniki do wywołującego klienta
   SqlContext.Pipe.ExecuteAndSend(scanCmd);
   rdr.Close();
} // nie ma potrzeby jawnego zamykania połączenia ze względu na instrukcję 'using'
}
};
