Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtention d'une erreur :erreur lors de la conversion du type de données nvarchar en numérique dans SQL

Habituellement, ce n'est pas un problème de passer une string en un paramètre numérique, tant que SQL Server est capable de convertir lui-même le contenu de la chaîne en une valeur numérique. Si cela ne fonctionne pas, vous obtenez cette erreur.

Par exemple :Passer "Hello" à un paramètre numérique, vous obtenez une erreur. Passer "1234" vous ne le faites pas. Veuillez noter qu'une chaîne vide ou une chaîne contenant des espaces ne peut pas être convertie en valeur numérique !

Cependant, il faut dire que ce n'est pas le bon style de faire cela. Vous devez vous assurer que les types que vous utilisez dans votre application correspondent aux types de la base de données pour éviter les problèmes. Peut-être quelques détails supplémentaires sur la raison pour laquelle vous avez besoin d'avoir string types dans votre application pourraient vous aider.

MODIFICATION 1
Pour rendre un paramètre optionnel pour la requête, la marche à suivre serait la suivante :

  1. Modifiez votre instruction SQL pour autoriser des paramètres facultatifs tels que WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) .
  2. Ne pas ajouter le @Raumklasse_ID paramètre s'il doit être facultatif ou ajouter la valeur DBNull.Value

Vous devriez vraiment envisager de changer votre string propriétés aux types nullables comme int? .

MODIFICATION 2
Voici à quoi pourrait ressembler votre code en implémentant les modifications que j'ai suggérées dans l'édition 1 :

using (SqlCommand cmd = new SqlCommand(@"SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID FROM RAUM r WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) OR STADT_ID = ISNULL(@Stadt_ID, STADT_ID) OR GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) OR REGION_ID = ISNULL(@Region_ID, REGION_ID)", con)) 
{
    con.Open();
    if (!String.IsNullOrWhitespace(RAUMKLASSE_ID))
        cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID);
    else
        cmd.Parameters.AddWithValue("@Raumklasse_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(STADT_ID))
        cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID);
    else
        cmd.Parameters.AddWithValue("@Stadt_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(GEBAEUDE_ID))
        cmd.Parameters.AddWithValue("@Gebaeude_ID", GEBAEUDE_ID);
    else
        cmd.Parameters.AddWithValue("@Gebaeude_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(REGION_ID))
        cmd.Parameters.AddWithValue("@Region_ID", REGION_ID);
    else
        cmd.Parameters.AddWithValue("@Region_ID", DBNull.Value);
    ...
}