2009-08-31 9 views
2

J'ai une SqlCommand qui insère une date-heure dans une colonne à l'aide d'un paramètre SqlParameter. Actuellement, j'utilise DateTime.Now comme valeur de ce paramètre.Insérer une date-heure de serveur à l'aide d'une SqlCommand

Je crois que cela va ajouter le datetime sur le PC de l'utilisateur qui n'est pas cohérent. Comment puis-je changer cela pour que le datetime du serveur de base de données soit inséré?

EDIT:

Je l'ai fait clair que c'était juste pour inserts

Répondre

5

Est-ce strictement pour les INSERT? Ou pour des mises à jour aussi? Si c'est uniquement pour les INSERT, vous pouvez déclarer une contrainte DEFAULT dans votre colonne DATETIME du côté de SQL Server, puis ne pas insérer de valeur du côté client, en utilisant par défaut le serveur.

Dans SQL:

ALTER TABLE YourTable 
    ADD CONSTRAINT DF_YourTable_YourColumn 
    DEFAULT (GETDATE()) FOR YourColumn 

puis dans votre commande SQL, il suffit de ne pas mentionner le « YourColumn » et ne fournissent pas une valeur pour elle - le serveur utilisera getdate() pour obtenir la date actuelle/heure sur le serveur à la place.

Marc

6

Ne passe pas dans un paramètre pour la date actuelle; obtenir SQL Server pour le générer.

SQL pour faire ce que vous avez décrit est GETDATE(), bien que vous voudrez peut-être envisager d'utiliser GETUTCDATE(), comme il se comportera mieux par rapport aux changements de fuseau horaire (et déplacer le serveur!)

Voir MSDN pour plus de détails.

+0

peut une fonction SQL Server être spécifié comme la valeur d'un SQLParameter?Sinon, je suppose que la meilleure méthode serait d'utiliser une contrainte par défaut comme suggéré dans une autre réponse –

+0

Je ne pense pas que ce soit possible. La contrainte par défaut fonctionnerait bien si vous insérez directement dans la table - je supposais que cela faisait partie d'une procédure stockée plus grande. –

+0

+1: À mon humble avis, c'est * la meilleure solution. Néanmoins, si DataSets est utilisé, le DateColumn.DateTimeMode peut être utilisé pour que tous les utilisateurs aient des paramètres TimeZone cohérents (Utc, je suppose). Voir: http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datetimemode.aspx – van

0

Dans ce cas, ne transmettez pas de valeur de date/heure en tant que paramètre. Au lieu d'utiliser la fonction GetDate() et insérer ce résultat dans le tableau

insertion dans X valeurs (Id, Col1, Col2) (1, 'Customer1', GetDate())

Hope this helps

0

Vous pouvez utiliser-procédure stockée et GETDATE(),

tableName (pas: int, nom: varchar (40), datetime date)

procédure stockée

CREATE PROCEDURE AddRec 
@no int, 
@name varchar(40) 
AS 
insert into tableName 
values (@no,@name,getdate()) 
RETURN 

Code d'exécution de la procédure stockée

SqlConnection cn=new SqlConnection("Your_Cn_Str"); 
SqlCommand cmd=new SqlCommand(); 
cmd.CommandText="AddRec"; 
cmd.CommandType=CommandType.StoredProcedue; 
cmd.Connection=cn; 

cmd.Parameters.AddWithValue("@no",10); 
cmd.Parameters.AddWithValue("@name","Foo"); 

cn.Open(); 
cmd.ExecuteNonQuery(); 
cn.Close(); 
Questions connexes