2011-05-23 4 views
2

Voici le code:Comment insérer datetime aC# var dans SQL Server

string ConnectionString= @"Data Source=localhost\SQLEXPRESS; 
Initial Catalog=notepad; Integrated Security=SSPI "; 
SqlConnection con = new SqlConnection(ConnectionString); 
con.Open(); 
string strEvent = TextBoxEvent.Text; 
string strDate = Calendar1.TodaysDate.ToShortDateString(); 
string strInsert = "insert into notepad (time, event) values (strDate, strEvent)"; 
SqlCommand cmd=new SqlCommand(strInsert, con); 
cmd.ExecuteNonQuery(); 

le temps est smalldatetime dans SQL Server 2005

Quand je lance ce programme, une erreur occurrs comme ceci:

Le nom "strDate" n'est pas autorisé dans ce contexte. Les expressions valides sont constantes, expressions constantes et (dans certains contextes) variables. Les noms de colonne ne sont pas autorisés.

mais si je remplace le strDate avec 2010/05/22 comme ceci:

string strInsert = "insert into notepad (time, event) values ("2010/05/22", strEvent)"; 

le programme fonctionnera correctement. Je suis intriguée par ce problème et je me tourne vers vous pour vous aider.

Répondre

1

Cette déclaration ci-dessous est erronée car vous incluez réellement strDate au lieu de substituer sa valeur.

string strInsert = "insert into notepad (time, event) values (strDate, strEvent)"; 

Ce que vous devez faire est d'écrire comme suit:

string strInsert = "insert into notepad (time, event) values ("+strDate+"," +strEvent+)"; 

Cela remplacera strDate et strEvent avec les valeurs réelles lors de l'exécution.

* Cette approche est cependant pas recommandée car elle est sujette à des attaques par injection SQL *

+2

AVERTISSEMENT: Ceci ouvrira les portes à SQL att d'injection Acks !! Vous devriez ** JAMAIS JAMAIS ** juste concaténer ensemble vos instructions SQL - utiliser ** des requêtes paramétrées ** à la place - ** TOUJOURS! ** –

2

Toutes les méthodes dit ici sont bonnes mais je préfère celui qui suit parce que son a un avantage sur les autres

DataAccess DAB = new DataAccess(); 
ArrayList arrList = new ArrayList(); 
string SQL = " insert into notepad (time, event) values (?,?) "; 
arrList.Add(new DataAccessBlock.DataAccess.Parameter("@time", DbType.DateTime, 30, ParameterDirection.Input, "", strDate));  
arrList.Add(new DataAccessBlock.DataAccess.Parameter("@event", DbType.String, 50, ParameterDirection.Input, "", strEvent)); 

DAB.ExecuteScalar(SQL, CommandType.Text, arrList); 
+0

Oui. Évitez de convertir la valeur datetime en une chaîne en premier lieu, et vous évitez toutes sortes de problèmes. (Et aussi, oui, utiliser les paramètres Malheureusement, je ne peux que +1) –

+0

L'espace réservé aux paramètres '?' Ne fonctionnera pas avec l'ADO standard.Fournisseur de base de données NET - vous devez utiliser des paramètres nommés comme '@ Date' et' @ Event'. –

+0

@Marc_s merci pour l'information. – Maxymus

5

vous devez utiliser des requêtes paramétrées pour insérer des données dans SQL Server, et vous devez mettre votre SqlConnection et SqlCommand en utilisant des blocs - essayer quelque chose comme ceci:

string ConnectionString= @"Data Source=localhost\SQLEXPRESS; 
Initial Catalog=notepad; Integrated Security=SSPI "; 

string sqlStatement = "INSERT INTO dbo.Notepad(time, event) VALUES (@Date, @Event)"; 

using(SqlConnection con = new SqlConnection(ConnectionString)) 
using(SqlCommand cmd = new SqlCommand(sqlStatement, con)) 
{ 
    cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = Calendar1.TodaysDate; 
    cmd.Parameters.Add("@Event", SqlDbType.VarChar, 100).Value = TextBoxEvent.Text.Trim(); 

    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
} 

De plus, cela est le mixage de votre code d'accès de base de données avec votre code d'interface utilisateur (récupération des données de zone de texte et le contrôle du calendrier) - ce qui est une mauvaise pratique - vous devez séparer cela en deux étapes:

  1. saisir les valeurs actuelles de l'interface utilisateur dans votre fichier code-behind
  2. les transmettre à une couche de données qui gère l'accès aux données sans jamais toucher directement une commande interface utilisateur
+0

Vous me battez à elle! +1 –

Questions connexes