2016-06-19 6 views
-1

私は大きな問題を抱えている。..SQL Serverのvarchar型(最大)と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.S.緯度と経度はデータベースにあります

+5

LatitudeとLongitudeには 'varchar(max)'を使用しないでください。まず最初に、 'varchar(max)'はSQLサーバによって異なって扱われ、特に緯度や経度のようなものを格納している場合、アプリケーションのパフォーマンスに悪影響を与える可能性があります。また、 'varchar'から数値への暗黙の変換はありません。これはあなたの例外の理由かもしれません。私は経度と緯度の数値を使うべきだと思います。 – Yobik

+1

ecimal(9,6)はlat longのより適切なデータ型になります –

+0

回答ありがとうございました 10進数を使用しようとしましたが、たとえば "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 

しかし、私は、このキャスティングは、パフォーマンスヒットになるだろうと10進数フィールド自体を使用することをお勧めします。

関連する問題