2016-06-19 2 views
-1

내가 큰 문제가 호환되지 않는 VARCHAR ..SQL 서버 VARCHAR (최대) 및

내가 주소의 거리 (위도와 경도)를 측정 연구를 수행하려면이 옵션을 사용하고 있습니다 (텍스트 상자에 삽입) 거리가 < 0.86 ....

또한 페이징을 수행하기 위해 오프셋을 사용하고 있습니다. 나는이 방법을 시도 할 때

public static List<Galleria> GetRistorante(int page, string key, string lon) 
{ 
    Galleria Galleria = new Galleria(); 
    string im = string.Empty; 

    int items = 10; 
    int offset = (page - 1) * items; 

    List<Galleria> lst = new List<Galleria>(); 

    using (SqlConnection sqlConn = new SqlConnection(DB.GetConnectionString())) 
    { 
     using (SqlCommand sqlComm = new SqlCommand()) 
     { 
      sqlConn.Open(); 
      sqlComm.Connection = sqlConn; 

      sqlComm.CommandText = @"SELECT R.* , C.* FROM dbo.Ristorante R INNER JOIN CategoriaRistorante C ON C.Id = R.CategoriaRistoranteId           
      HAVING (SQRT(POWER(69.1 * (R.lat - @key), 2) + POWER(69.1 * (@lon - R.lon) * COS(R.lat/57.3), 2))) < 0.8699197 
      ORDER BY R.Id OFFSET @offset ROWS FETCH NEXT @items ROWS ONLY"; 

      SqlParameter s1 = new SqlParameter(); 
      s1.SqlDbType = System.Data.SqlDbType.Int; 
      s1.ParameterName = "@offset"; 
      s1.Value = offset; 

      sqlComm.Parameters.Add(s1); 

      SqlParameter s2 = new SqlParameter(); 
      s2.SqlDbType = System.Data.SqlDbType.Int; 
      s2.ParameterName = "@items"; 
      s2.Value = items; 

      sqlComm.Parameters.Add(s2); 

      SqlParameter s3 = new SqlParameter(); 
      s3.SqlDbType = System.Data.SqlDbType.VarChar; 
      s3.ParameterName = "@key"; 
      s3.Value = string.Format("%{0}%", Convert.ToDouble(key)); 

      sqlComm.Parameters.Add(s3); 

      SqlParameter s4 = new SqlParameter(); 
      s4.SqlDbType = System.Data.SqlDbType.VarChar; 
      s4.ParameterName = "@lon"; 
      s4.Value = string.Format("%{0}%", Convert.ToDouble(lon)); 

      sqlComm.Parameters.Add(s4); 

      SqlDataReader reader = sqlComm.ExecuteReader(); 

      while (reader.Read()) 
      { 
       Galleria = new Galleria(); 
       Galleria.Id = Convert.ToInt32(reader["Id"]); 
       Galleria.Nome = reader["Nome"].ToString(); 
       Galleria.Info = reader["Info"].ToString(); 
       Galleria.Immagine = reader["Immagine"].ToString(); 
       Galleria.Telefono = reader["Telefono"].ToString(); 
       Galleria.Cap = Convert.ToInt32(reader["Cap"]);   
       Galleria.Via = reader["Via"].ToString(); 
       Galleria.Citta = reader["Citta"].ToString(); 

       lst.Add(Galleria); 
      } 

      return lst; 
     } 
    } 
} 

지금,이 오류가 얻을 :

enter image description here

가 처음 쿼리가 일을하지만 추가 할 때이 "필요"그것은 나에게 오류를 제공합니다.

P. 위도와 경도는 입니다.

+5

위도 및 경도에'varchar (max) '를 사용하지 마십시오. 첫째로,'varchar (max)'는 SQL 서버에 의해 다르게 처리되며 특히 경도와 위도 같은 것을 저장하는 경우 응용 프로그램의 성능에 큰 영향을 줄 수 있습니다. 또한'varchar'에서 숫자로의 암시 적 변환이 없으므로 예외가 될 수 있습니다. 위도와 경도에 숫자를 사용하도록 변경해야한다고 생각합니다. – Yobik

+1

ecimal (9,6)은 lat에 대해 더 적절한 데이터 유형이 될 것입니다 –

+0

답장을 보내 주셔서 감사합니다. 십진법을 사용하려고했지만 "10.10"과 같이 "."가 사라집니다. –

답변

0

캐스팅 해보세요. 위의 설명에서 언급 한 바와 같이

HAVING (SQRT(POWER(69.1 * (CAST(R.lat AS DECIMAL(9,6)) - @key), 2) + POWER(69.1 * (@lon - CAST(R.lon AS DECIMAL(9,6))) * COS(CAST(R.lat AS DECIMAL(9,6))/57.3), 2))) < 0.8699197 

그러나 나는이 주조는 성능 저하 될 것입니다으로 소수점 필드 자체를 사용하는 것이 좋습니다 것입니다.