2010-06-29 3 views
1

J'ai une table avec une colonne PK de type uniqueidentifier.Echec de la conversion de chaîne en identificateur unique en C# via un paramètre SQL

J'essaye d'écrire une instruction de mise à jour de C#, où j'ai l'identificateur comme chaîne.

Voici le code que je suis en train:

 string sql_start = "update SecurityUserGroup set "; 
     int paramPos = 0; 
     var paramList = new List<SqlParameter>(); 
     if (roleName != null) 
     { 
      sql_start += " RoleName = '{" + paramPos + "}'"; 
      paramList.Add(new SqlParameter(""+paramPos, roleName)); 
      paramPos++; 
     } 
     if (activeDirectoryGroup != null) 
     { 
      sql_start += " ActiveDirectoryGroup = '{" + paramPos + "}'"; 
      paramList.Add(new SqlParameter(""+paramPos, activeDirectoryGroup)); 
      paramPos++; 
     } 
     //sql_start += " where SecurityUserGroupId = cast('{" + paramPos + "}' as uniqueidentifier)"; 
     //sql_start += " where SecurityUserGroupId = convert(uniqueidentifier, '{" + paramPos + "}')"; 
     sql_start += @" where SecurityUserGroupId = '{" + paramPos + @"}'"; 
     paramList.Add(new SqlParameter(""+paramPos, new Guid(id))); 
     //paramList.Add(new SqlParameter(""+paramPos, id)); 
     SqlHelper.ExecSql(sql_start, paramList); 

La fonction SqlHelper.ExecSql fait ceci:

public static void ExecSql(string sql, List<SqlParameter> parms) 
    { 
     using (SqlConnection con = GetConnection()) 
     { 
      SqlCommand command = new SqlCommand(sql, con) {CommandType = CommandType.Text}; 

      foreach (SqlParameter parm in parms) 
      { 
       command.Parameters.Add(parm); 
      } 

      command.ExecuteNonQuery(); 
     } 

    } 

Mais je soit obtenir une syntaxe non valide ou « Échec de la conversion d'une chaîne de caractères à uniqueidentifier "

J'ai déjà eu ce problème sur l'extraction et a fini par mettre la conversion dans une procédure stockée et il semble que je vais devoir faire t son dans une procédure stockée aussi.

Merci d'avance pour toute idée/conseils à ce sujet.

EDIT: Un exemple d'ID ressemble à ceci "45d9ec51-1e52-49d8-9139-51f18fe13563", qui ressemble à ce que je vois sur la table via Management Studio.

EDIT2: Voici le code qui a travaillé à la fin (en utilisant @ au lieu de {}):

 var sql_start = new StringBuilder("update SecurityUserGroup set "); 
     int paramPos = 0; 
     var paramList = new List<SqlParameter>(); 
     if (roleName != null) 
     { 
      sql_start.Append(" RoleName = @" + paramPos); 
      paramList.Add(new SqlParameter("@"+paramPos, roleName)); 
      paramPos++; 
     } 
     if (activeDirectoryGroup != null) 
     { 
      if (paramPos > 0) sql_start.Append(","); 
      sql_start.Append(" ActiveDirectoryGroup = @" + paramPos); 
      paramList.Add(new SqlParameter("@"+paramPos, activeDirectoryGroup)); 
      paramPos++; 
     } 
     sql_start.Append(" where SecurityUserGroupId = @id"); 
     paramList.Add(new SqlParameter("@id", id)); 
     SqlHelper.ExecSql(sql_start.ToString(), paramList); 

Cordialement, Chris

+0

pouvez-vous nous montrer ce que la variable "id" que vous utilisez pour créer votre nouveau GUID ressemble ?? –

+1

En aparté: si vous continuez à concaténer la chaîne sql_start encore et encore, cela nuira beaucoup aux performances. Vous allez créer de nouvelles instances de chaîne avec chaque concaténation et lancer l'ancienne. Pour des choses comme ça, je recommande fortement d'utiliser un StringBuilder qui est beaucoup mieux adapté pour des opérations comme celle-ci ... –

Répondre

2

mieux que je pouvais faire, votre dynamique créée SQL va finir par quelque chose comme:

update SecurityUserGroup set RoleName = '{0}' ActiveDirectoryGroup = '{1}' where SecurityUserGroupId = '{2}' 

Quand ce que vous avez probablement besoin est quelque chose comme:

update SecurityUserGroup set RoleName = @RoleName, ActiveDirectoryGroup = @ActiveDirectoryGroup where SecurityUserGroupId = @SecurityUserGroupId 

pour ce faire, Rempl code CE comme:

sql_start += @" where SecurityUserGroupId = '{" + paramPos + @"}'"; 
paramList.Add(new SqlParameter(""+paramPos, new Guid(id))); 

avec le code comme:

sql_start += " where SecurityUserGroupId = @SecurityUserGroupId"; 
paramList.Add(new SqlParameter("@SecurityUserGroupId", new Guid(id))); 
+0

Merci - cela a fait l'affaire. Et aussi merci de souligner le problème de virgule SQL. –

1

Je ne sais pas - mais peut-être SQL Server méprend votre valeur de paramètre comme une chaîne, au lieu d'un GUID, ici:

paramList.Add(new SqlParameter(""+paramPos, new Guid(id))); 

J'ajouterais ceci à l'aide:

SqlParameter workParam = new SqlParameter("" + paramPos, SqlDbType.Uniqueidentifier); 
workParam.Value = new Guid(id); 
paramList.Add(workParam); 

Si vous créez le SqlParameter avec un type spécifique explicite, SQL Server ne pas avoir à interpréter automatiquement vos trucs et peut-être se tromper ...

+0

Merci, mais cela ne marche pas non plus. La même erreur concerne l'échec de la conversion de la chaîne en identifiant unique. Essayé avec/sans fonction de conversion, même essayé sans guillemets autour de l'identifiant unique.Je sens un proc stocké venir. –

Questions connexes