2011-03-26 6 views
1

J'utilise ASP.Net/C# et j'ai un formulaire qui permet aux gens d'ajouter des informations dans une table et avec elle je veux recueillir le GUID des utilisateurs actuels et l'insérer.Insérer GUID dans la table SQL

J'ai une configuration de champ (ID utilisateur) comme identifiant unique et je le code suivant:

protected void Page_Load(object sender, EventArgs e) 
{ 
    MembershipUser currentUser = Membership.GetUser(); 
    Guid temp = (Guid)(Membership.GetUser(User.Identity.Name).ProviderUserKey); 
    Guid @currentUserID = temp; 
} 

SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\ASPNETDB.MDF;Integrated Security=True;User Instance=True"); 
SqlCommand cmd; 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    cmd = new SqlCommand("insert into Accom (UserID) values('" + @currentUserID + "')", con); 
    cmd.ExecuteNonQuery(); 

} 

Je veux essentiellement de lier la variable à la base de données une idée comme ci-dessus donne des erreurs.

Répondre

1
Guid @currentUserID = temp; 

Vous définissez une variable currentUserID portée locale - vous devez enregistrer cette variable dans le Session vous pouvez donc y accéder dans la méthode Button1_Click:

Session["UserId"] = currentUserID; 

Maintenant, vous pouvez le récupérer en Button1_Click:

Guid currentUserID = (Guid)Session["UserId"]; 

De plus, le @ n'est pas nécessaire et ne devrait pas être là, vous en auriez seulement besoin si vous voulez définir vari ables avec un nom qui correspond à un mot clé C# - c'est un mauvais style de toute façon. Aussi, vous voulez mettre le code spécifique SqlConnection tout dans le gestionnaire de clic de bouton - sinon cette variable est instanciée chaque fois que la page se charge, pas seulement lorsque le gestionnaire de clic sur le bouton est utilisé. Enfin, vous souhaitez également utiliser SqlParameters au lieu de chaînes dans votre instruction d'insertion SQL.

Edit:

Comme @pst a souligné, plus "chemin d'ASP.NET" serait d'utiliser seulement une variable d'instance

Guid currentUserID; 

que vous déclarez dans le cadre de la classe, pas dans une méthode - alors vous pouvez utiliser cette variable dans toute la page. Cela signifie toutefois que l'identifiant de l'utilisateur ne sera pas disponible sur d'autres pages (avec une session, il pourrait être récupéré pendant la durée de vie de la session sur n'importe quelle page).

+0

Merci Mate Brillamment :) Merci travaillé à tout le monde :) trop – Mark

+0

Y at-il une raison particulière d'utiliser session ici au lieu d'une variable membre (configuration en chargement de la page)? –

+0

@pst: Oui, je suppose que c'est plus idiomatique pour ASP.NET - J'ai été "décroché" pendant trop longtemps - Je vais éditer cela. – BrokenGlass

0

Je ne sais pas si SQL Server supporte GUID comme type de données, en MysQL j'irais avec un char, mais ce n'est pas important, juste un commentaire. L'important est que, dans la méthode:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    cmd = new SqlCommand("insert into Accom (UserID) values('" + @currentUserID + "')", con); 
    cmd.ExecuteNonQuery(); 

} 

Vous ne spécifiez pas la valeur réelle de @currentUserID vous devez réécrire à quelque chose comme:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    SqlParameter param = new SqlParameter(); 
    con.Open(); 
    cmd = new SqlCommand("insert into Accom (UserID) values(@currentUserID)", con); 
    //this are the important lines that I'm talking about 
    param.ParameterName = "@currentUserID"; 
    param.Value   = valueOfUserId; 
    cmd.Parameters.Add(param); 
    cmd.ExecuteNonQuery();  
} 

espoir qui aide.

+2

"Je ne sais pas si SQL Server supporte GUID comme un type de données" - il ça, ça s'appelle un identifiant unique – kevinw

+0

Je m'arrête sur le -1 parce que je pense qu'il essaie d'utiliser des espaces libres. Cependant, comme c'est le cas maintenant, c'est juste cassé. Corrigez le texte SqlCommand. –

4

Vous ne devez jamais insérer des valeurs directement dans une instruction SQL comme cela, quel que soit leur type, car cela vous ouvre à une attaque SQL Injection. Au lieu de cela, vous devez utiliser des paramètres dans votre requête, à travers lequel les valeurs System.Guid seront automatiquement traduites au type SQL Server uniqueidentifier. Voilà comment je le ferais:

Guid currentUserId = (Guid)(Membership.GetUser(User.Identity.Name).ProviderUserKey); 
using (var connection = new SqlConnection("...")) 
using (var command = connection.CreateCommand()) 
{ 
    command.CommandText = "INSERT INTO Accom (UserID) VALUES (@UserID)"; 
    var param = command.Parameters.Add("@UserID", SqlDbType.UniqueIdentifier); 
    param.Value = currentuserId; 
    connection.Open(); 
    command.ExecuteNonQuery(); 
} 
+0

+1 Placeholders. –

0

Dans le code d'origine au-dessus de la variable currentUser est utilisé. En outre, si l'utilisateur n'est pas connecté sur l'appel à Membership.GetUser(User.Identity.Name) renverra une référence null et essayer de récupérer le code ProviderUserKey lancera une exception NullReferenceException.Il vaudrait mieux avoir quelque chose dans ce sens;

public partial class Default : System.Web.UI.Page 
{ 
    MembershipUser currentUser; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     currentUser = Membership.GetUser(); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (null != currentUser) 
     { 
      Guid currentUserID = currentUser.ProviderUserKey; 
      // database code here 
     } 
    } 
}