2012-06-07 4 views
1

J'ai cherché une solution à ce problème et, jusqu'à présent, rien trouvé qui fonctionne malgré d'autres ayant des problèmes similaires. J'exécute une instruction SQL en utilisant le code suivant (désolé la mise en forme hideuse C'est ce que nous utilisons ici.):Erreur lors de la conversion du type de données varchar en float. Préparer une déclaration

/// <summary> 
    /// Executes a prepared statement with the parameters passed to AddParameter(parameterName, parameterValue) and creates a recordset. 
    /// </summary> 
    /// 
    /// <param name="sqlQuery">The sql statement to execute.</param> 
    public DbStandardResponseType ExecutePreparedStatementWithParametersQuery (string sqlQuery) 
     { 
     DbStandardResponseType dbFactoryResponse = new DbStandardResponseType(); 

     if (String.IsNullOrEmpty (sqlQuery)) 
      { 
      dbFactoryResponse.ExceptionMessage = "No query string passed."; 
      dbFactoryResponse.Success = false; 
      dbFactoryResponse.UserFriendlyMessage = "No query string passed."; 

      return dbFactoryResponse; 
      } 

     try 
      { 
      //attempt to prepare our connection 
      dbFactoryResponse = PrepareConnection(); 

      if (!dbFactoryResponse.Success) 
       { 
       return dbFactoryResponse; 
       } 

      m_dbFactoryDatabaseCommand.CommandText = sqlQuery; 
      m_dbFactoryDatabaseCommand.CommandType = CommandType.Text; 

      if (m_parameterName.Count != 0) 
       { 
       for (int i = 0; i < m_parameterName.Count; i++) 
        { 
        //create a new parameter object and assign its values before adding it to the connection object 
        DbParameter parameter = m_dbFactoryDatabaseCommand.CreateParameter(); 
        parameter.Value = m_parameterValue[i]; 
        parameter.ParameterName = m_parameterName[i]; 
        m_dbFactoryDatabaseCommand.Parameters.Add (parameter); 
        } 

       m_parameterName.Clear(); 
       m_parameterValue.Clear(); 
       } 

      m_hasRecordSet = true; 

      *****Error appears on this line inside the reader object***** 

      m_dbFactoryDatabaseDataReader = m_dbFactoryDatabaseCommand.ExecuteReader(); 

      dbFactoryResponse.ExceptionMessage = ""; 
      dbFactoryResponse.Success = true; 
      dbFactoryResponse.UserFriendlyMessage = "OK"; 

      return dbFactoryResponse; 
      } 
     catch (Exception ex) 
      { 
      if (m_queueErrors) 
       { 
       m_queuedErrorsList.AppendLine (ex.Message); 
       m_queuedErrorsList.AppendLine ("\r\n\r\nPrepared Statement: " + sqlQuery); 
       m_queuedErrorsList.AppendLine(); 

       m_queuedErrorCount++; 

       dbFactoryResponse.ExceptionMessage = m_queuedErrorsList.ToString(); 
       dbFactoryResponse.Success = false; 
       dbFactoryResponse.UserFriendlyMessage = "Execute failed on the database."; 
       } 
      else 
       { 
       dbFactoryResponse.ExceptionMessage = ex.Message; 
       dbFactoryResponse.Success = false; 
       dbFactoryResponse.UserFriendlyMessage = "Execute failed on the database."; 
       } 

      try 
       { 
       Close(); 
       } 
      catch (Exception f) 
       { 
       dbFactoryResponse.ExceptionMessage = f.Message + "\r\n\r\nPrepared Statement: " + sqlQuery; 
       dbFactoryResponse.Success = false; 
       dbFactoryResponse.UserFriendlyMessage = "Failed to close the connection to the database."; 
       } 

      return dbFactoryResponse; 
      } 
     } 

La requête est la suivante (avec des valeurs substituées en):

select CONTRIBUTO, count(*) as CountCol 
from HA_WITHOUT_SCOTLAND 
where 
GEOMETRY.STIntersects(geometry::STGeomFromText('POLYGON((-25.43623984375 44.257784519021, 21.62918984375 44.257784519021, 21.62918984375 60.752403080295, -25.43623984375 60.752403080295, -25.43623984375 44.257784519021))', 4326)) = 1 
group by CONTRIBUTO 

colonne CONRIBUTO est un varchar (max) colonne est un type gEOMETRY de données de géométrie

Quand je lance la déclaration directement sur la base de données, il fonctionne sans erreur et retourne ce que je pense. Lorsque je l'exécute via le C# en utilisant une instruction préparée (obtenue à partir d'un tableau plus tôt dans le code C#), l'erreur est produite. Les paramètres qui sont passés en sont les suivantes:

@5 = -25.43623984375 double 
@6 = 44.257784519021 double 
@7 = 21.62918984375 double 
@8 = 60.752403080295 double 

La requête sans valeurs de substitution est comme suit:

select CONTRIBUTO, count(*) 
from HA_WITHOUT_SCOTLAND 
where STIntersects(GEOMETRY, geometry::STGeomFromText('POLYGON(('[email protected]+' '[email protected]+', '[email protected]+' '[email protected]+', '[email protected]+' '[email protected]+', '[email protected]+' '[email protected]+', '[email protected]+' '[email protected]+'))', 4326)) = 1 
group by CONTRIBUTO 

je ne vois nulle part ici que produirait cette erreur compte tenu du fait que les colonnes et les paramètres sont les types de données corrects.

Quelqu'un peut-il nous éclairer à ce sujet?

+0

@ V4Vendetta: le paramètre 'geometry_tagged_text' est un nvarchar (max) (voir http://msdn.microsoft.com/fr-fr/library/bb933823.aspx) –

Répondre

1

Le problème est à la section qui se lit comme suit:

'POLYGON(('[email protected]+'... 

Cela va tenter de convertir en un flotteur afin qu'il corresponde au paramètre @S (ils peuvent être ajoutés) le texte POLYGON(('.

Au lieu de cela, vous pouvez essayer envelopper chaque paramètre dans un CONVERT, par exemple:

'POLYGON(('+CONVERT(VARCHAR(100),@5)+'... 

Le tout sera une chaîne pour l'opérateur +, qui les concaténer à la place.

Dans votre version substituée, vous avez déjà géré la conversion en varchar vous-même, donc pas de problème.

+0

Pas sûr mais il ne donnera pas le substitut s'interroger comme l'OP l'a montré, puisque vous placez la valeur dans '@ 5'? – V4Vendetta

+1

@s est défini comme un double - pas une chaîne. –

+0

ouais mais ne les fera pas en tant que chaînes et ajoutera et finalisera dans la même requête. – V4Vendetta

Questions connexes