2010-04-01 4 views
0

J'ai des données dans mon modèle, comment puis-je configurer pour insérer les données dans un tableau?Comment insérer des données dans une table à partir du modèle MVC?

public string Name { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 

    public Info() 
    { 
     using (SqlConnection connect = new SqlConnection(connections)) 
     { 
      string query = "Insert Into Personnel_Data (Name, StreetAddress, City, State, Zip, HomePhone, WorkPhone)" + 
       "Values('" + Name + "','" + Address + "','" + City + "','" + State + "','" + Zip + "','" + ContactHPhone + "','" + ContactWPhone + "')"; 

      SqlCommand command = new SqlCommand(query, connect); 
      connect.Open(); 
      command.ExecuteNonQuery(); 
     } 
    } 

Le nom, l'adresse, la ville, etc. sont NULL lorsque la requête est en cours d'exécution. Comment puis-je configurer cela?

Répondre

1

Vous devez initialiser vos propriétés dans le constructeur avant de l'utiliser:

public string Name { get; set; } 
public string Address { get; set; } 
public string City { get; set; } 
public string State { get; set; } 
public string Zip { get; set; } 
public string ContactHPhone { get;set; } 
public string ContactWPhone { get;set; } 

public Info(string name, string address, string city, string state, string zip, string contactHPhone, string contactWPhone) 
{ 
    Name = name; 
    Address = address; 
    City = city; 
    State = state; 
    Zip = zip; 
    ContactHPhone = contactHPhone; 
    ContactWPhone = contactWPhone; 
    using (SqlConnection connect = new SqlConnection(connections)) 
    { 
     string query = "Insert Into Personnel_Data (Name, StreetAddress, City, State, Zip, HomePhone, WorkPhone)" + 
      "Values('" + Name + "','" + Address + "','" + City + "','" + State + "','" + Zip + "','" + ContactHPhone + "','" + ContactWPhone + "')"; 

     SqlCommand command = new SqlCommand(query, connect); 
     connect.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 

Modifié:

La meilleure façon est d'utiliser des paramètres dans votre chaîne SQL:

using (SqlConnection connect = new SqlConnection(connections)) 
{ 
    string query = "Insert Into Personnel_Data (Name, StreetAddress, City, State, Zip, HomePhone, WorkPhone) Values(@name, @address, @city, @state, @zip, @contactHPhone, @contactWPhone)"; 

    SqlCommand command = new SqlCommand(query, connect); 
    command.Parameters.AddWithValue("name", Name); 
    command.Parameters.AddWithValue("address", Address); 
    command.Parameters.AddWithValue("city", City); 
    command.Parameters.AddWithValue("state", State); 
    command.Parameters.AddWithValue("zip", Zip); 
    command.Parameters.AddWithValue("contactHPhone", ContactHPhone); 
    command.Parameters.AddWithValue("contactWPhone", ContactWPhone); 
    connect.Open(); 
    command.ExecuteNonQuery(); 
} 
+0

Je d upvote ceci sinon pour le problème d'injection SQL toujours là. :) Utilisez plutôt SqlParameters. –

+0

Michael avait raison. Je me laissais vulnérable aux attaques par insertion. command.Parameters.Add (nouveau SqlParameter ("nom", nom)); et ainsi de suite – MrM

0

tout d'abord utiliser parametrized queries si vous allez en tenir à votre approche actuelle

Ma suggestion est d'aller pour un ORM comme NHibernate, qui facilitera les choses beaucoup pour vous

0

Cela ressemble Code de l'objet que vous essayez de persister (votre modèle.) Le code pour recevoir la mise à jour et valider l'enregistrement ira dans votre contrôleur. Veuillez poster le code depuis votre contrôleur.

En outre, je vous recommande fortement de considérer un ORM comme LINQ to SQL ou LINQ to Entities. Créez au moins une procédure stockée - n'envoyez pas de code SQL brut à la base de données.

2

Ajoutez des paramètres à votre constructeur ou effectuez l'insertion à partir d'une méthode non-constructeur après l'appel du constructeur et la définition des propriétés.

Le code que vous avez fourni est vulnérable à l'injection SQL, vous devez donc également corriger ce problème.

En outre, en termes de terminologie, appeler une requête d'insertion est source de confusion. Une requête est une sélection, ce qui n'est pas ce que vous faites.

Vous n'avez pas besoin d'une procédure stockée ou d'un ORM, l'utilisation d'ADO.NET lorsque vous l'utilisez est correcte. Vous pouvez constater que l'utilisation d'un ORM réduit la quantité de code répétitif et sujette aux erreurs que vous devez écrire et maintenir, mais il y a des inconvénients à utiliser les ORM.

Questions connexes