2012-06-19 3 views
0

bonjour je construire un webservice en studio visuel 2010. Je reçois des id qui sont enregistrés dans une chaîne ressemble à ceci:Comment utiliser les chaînes dynamiques séparées par des virgules dans la requête sql?

string room_ids="5,11,99,42"; 

ils sont séparés par des virgules. J'ai créé une boucle foreach pour séparer les identifiants et la virgule et les utiliser dans ma requête sql jusqu'à ce que les identifiants soient finis. mais ça ne marche pas. je reçois une erreur, il dit:

Error converting data type nvarchar to numeric

ici est mon code, merci d'avance pour votre aide!

internal static List<RAUM> Raum(string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID) 
{  
    List<RAUM> strasseObject = new List<RAUM>(); 
    string[] allegebaude = GEBAEUDE_ID.Split(new char[] { ',' }); 

    foreach (string gebaudeid in allegebaude) 
    { 
     Trace.WriteLine("SIND JETZT DRINNE"); 
     Trace.WriteLine(gebaudeid); 

     using (SqlConnection con = new SqlConnection(@"Data Source=Localhost\SQLEXPRESS;Initial Catalog=BOOK-IT-V2;Integrated Security=true;")) 
     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) AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID) AND GEBAEUDE_ID = ISNULL(@gebaudeid,GEBAEUDE_ID) AND REGION_ID = ISNULL(@Region_ID, REGION_ID)", con)) 
     { 
      con.Open(); 
      if (!StringExtensions.IsNullOrWhiteSpace(RAUMKLASSE_ID)) 
       cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID); 
      else 
       cmd.Parameters.AddWithValue("@Raumklasse_ID", DBNull.Value); 

      if (!StringExtensions.IsNullOrWhiteSpace(STADT_ID)) 
       cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID); 
      else 
       cmd.Parameters.AddWithValue("@Stadt_ID", DBNull.Value); 

      if (!StringExtensions.IsNullOrWhiteSpace(GEBAEUDE_ID)) 
       cmd.Parameters.AddWithValue("@gebaudeid", GEBAEUDE_ID); 
      else 
       cmd.Parameters.AddWithValue("@gebaudeid", DBNull.Value); 

      if (!StringExtensions.IsNullOrWhiteSpace(REGION_ID)) 
       cmd.Parameters.AddWithValue("@Region_ID", REGION_ID); 
      else 
       cmd.Parameters.AddWithValue("@Region_ID", DBNull.Value); 



      using (SqlDataReader rdr = cmd.ExecuteReader()) 
      { 
       while (rdr.Read()) 
       { 
        if (rdr["BEZEICHNUNG"] != DBNull.Value && rdr["ID"] != DBNull.Value) 
        { 
         strasseObject.Add(new RAUM() 
         { 
          RaumName = rdr["BEZEICHNUNG"].ToString(), 
          RaumID = rdr["ID"].ToString() 

         }); 
        } 
       } 
      } 

     } 
    } 
    return strasseObject; 
} 

Répondre

1

Si vous avez déjà les ID dans une chaîne séparée par des virgules (appelée IDstring) alors vous pouvez juste faire quelque chose comme ceci:

sqlQuery = "SELECT Columns FROM table WHERE ID IN (" + IDstring + ")"; 

Dans votre cas, ne fend pas la chaîne d'origine (GEBAEUDE_ID), mais l'utiliser comme il est:

// Don't use a foreach loop any more 
    string gebaudeIdSection = " AND GEBAEUDE_ID IN (" + GEBAEUDE_ID + ") "; 
    if (string.IsNullOrEmpty(GEBAUDE_ID)) { gebaudeIdSection = ""; } // if there are no ids, let's remove that part of the query completely. 
    using (SqlConnection con = new SqlConnection(@"Data Source=Localhost\SQLEXPRESS;Initial Catalog=BOOK-IT-V2;Integrated Security=true;")) 
    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) AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID)" + gebaudeIdSection + " AND REGION_ID = ISNULL(@Region_ID, REGION_ID)", con)) 
    { // The rest of the code is the same as before... 
+0

merci pour votre aide, j'ai un petit problème, je ne peux pas mettre le gebaudeid à vide, parce que ma chaîne est whith []. Comment puis-je resoudre ceci? –

+0

Je ne suis pas sûr de comprendre. Vous ne faites rien avec 'gebaudeid'. Vous devez prendre la chaîne originale 'GEBAUDE_ID', séparée par des virgules, que vous avez transmise dans la fonction et l'utiliser simplement sans la diviser. Supprimez le bit de code qui sépare la chaîne en un tableau. –

+0

cela fonctionne mais quand je laisse l'id de gebaude vide j'obtiens une erreur: Syntaxe incorrecte près de ')'. –

0

Vous ne pouvez pas implicitement traiter une liste de valeurs séparées par des virgules; à la place, vous devrez créer une fonction de valeurs de table pour diviser la liste de valeurs en une structure de table, puis utiliser cette structure comme vous le feriez normalement.

Jetez un oeil à cette question: INSERT INTO TABLE from comma separated varchar-list pour un exemple de fonction.

1

essayez ceci:

if (!StringExtensions.IsNullOrWhiteSpace(gebaudeid)) 
      cmd.Parameters.AddWithValue("@gebaudeid", Convert.ToInt32(gebaudeid)); 

vous sh Vous devez également passer le bon paramètre à votre instruction AddWithValue. Vous parcourez la liste de vos identifiants, cette liste étant allegebaude. Donc, vous devez passer le paramètre gebaudeid à votre déclaration, au lieu de ce que vous faites maintenant.

1

d'abord tout ce que je pense que vous devez corriger:

cmd.Parameters.AddWithValue("@gebaudeid", GEBAEUDE_ID); 

avec:

cmd.Parameters.AddWithValue("@gebaudeid", gebaudeid); 

Ensuite, essayez de convertir les ids en nombres entiers (par exemple, en utilisant Convert.ToInt32(gebaudeid)) et de ne pas passer les comme des chaînes dans la méthode AddWithValue.

Questions connexes