Convertir ASP.NET contrôle de zone de texte .contenu de texte de format de Date/Heure
Je suis en train de les insérer dans une base de données - les diverses informations sur un événement. L'asp.net zone de texte est à l'aide du Calendrier Extender (donc un peu de calendrier pop-up et remplit la zone de texte avec une date formatée). Le EventDate champ dans ma base de données Access est de type Date/Heure. J'ai besoin de convertir le texte/chaîne de format de date/heure
J'ai essayé jusqu'à présent:
VB:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim oleDbConn As New OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("BookMeetConnString").ConnectionString) Dim SqlString As String = "Insert into Events(EventTitle,EventDescription,EventDate,EventCategory) Values (@f1,@f2,@f3,@f4)" Dim cmd As OleDbCommand = New OleDbCommand(SqlString, oleDbConn) Dim strDate As String = tb_eventdate.Text Dim dtfi As New System.Globalization.DateTimeFormatInfo dtfi.ShortDatePattern = "dd/MM/yyyy" dtfi.DateSeparator = "/" Dim objDate As DateTime = Convert.ToDateTime(strDate, dtfi) cmd.CommandType = CommandType.Text cmd.Parameters.AddWithValue("@f1", tb_eventtitle.Text) cmd.Parameters.AddWithValue("@f2", tb_eventdescription.Text) cmd.Parameters.AddWithValue("@f3", tb_eventdate.Text) cmd.Parameters.AddWithValue("@f4", dd_eventcategory.Text) oleDbConn.Open() cmd.ExecuteNonQuery() System.Threading.Thread.Sleep("2000") Response.Redirect("~/calendar.aspx") End Sub
Voici mon code côté client juste pour la référence:
<h1>Add An Event!<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"> </ajaxToolkit:ToolkitScriptManager> </h1> <p>Title of Event: <asp:TextBox ID="tb_eventtitle" runat="server"></asp:TextBox> </p> <p>Event Description: <asp:TextBox ID="tb_eventdescription" runat="server"></asp:TextBox> </p> <p>Event Date: <asp:TextBox ID="tb_eventdate" runat="server"></asp:TextBox> <ajaxToolkit:CalendarExtender ID="tb_eventdate_CalendarExtender" runat="server" TargetControlID="tb_eventdate"> </ajaxToolkit:CalendarExtender> </p> <p>Event Category: <asp:DropDownList ID="dd_eventcategory" runat="server" DataSourceID="SqlDataSource1" DataTextField="CategoryTitle" DataValueField="CategoryTitle"> </asp:DropDownList> </p> <p> <asp:Button ID="Button1" runat="server" Text="Submit" /> </p>
Quand j'essaie de remplir le formulaire, je reçois cette erreur:
Mes Deux questions sont:
- Quel est le problème avec le code ci-dessus, et comment puis-je utiliser avec succès la classe DateTimeFormatInfo à convertir en Chaîne de caractères Date/Heure?
- Sur une note de côté, le Calendrier Extender entrées de la date dans la zone de texte en Américain Time format (JJ/MM/AAAA), comment puis-je changer cette Britannique (JJ/MM/AAAA) format (je ne pouvais pas voir une évidente à la propriété dans la boîte de dialogue propriétés pour ce faire?)
Merci d'avance pour vos réponses!
Adam
EDIT: mis à Jour le code ci-dessous:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim oleDbConn As New OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("BookMeetConnString").ConnectionString) Dim SqlString As String = "Insert into Events(EventTitle,EventDescription,EventDate,EventCategory) Values (@f1,@f2,@f3,@f4)" Dim cmd As OleDbCommand = New OleDbCommand(SqlString, oleDbConn) cmd.CommandType = CommandType.Text cmd.Parameters.AddWithValue("@f1", tb_eventtitle.Text) cmd.Parameters.AddWithValue("@f2", tb_eventdescription.Text) cmd.Parameters.AddWithValue("@f3", DateTime.ParseExact(tb_eventdate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture)) cmd.Parameters.AddWithValue("@f4", dd_eventcategory.Text) oleDbConn.Open() cmd.ExecuteNonQuery() System.Threading.Thread.Sleep("2000") Response.Redirect("~/calendar.aspx") End Sub
Vous devez vous connecter pour publier un commentaire.
Je vous recommandons d'utiliser
DateTime.ParseExact
méthode statique, surtout à ce oveload:DateTime.ParseExact(textBox.Text, "dd/MM/yyyy",
CultureInfo.InvariantCulture
)
Cette analyse le texte que vous avez par le béton de format que vous spécifiez (
"dd/MM/yyyy"
actuellement, cas est important depuismm
est à quelques minutes plutôtMM
en cours de mois). L'utilisation deCultureInfo.InvariantCulture
garantit que les séparateurs de date va être récupéré à partir de la chaîne de format (le deuxième paramètre). J'ai remarqué que si la culture actuelle est utilisé, il remplace certains aspects de la chaîne de format que vous passez àParseExact
.Une note sur CultureInfo
Culture invariante est bon aussi pour la raison que votre local en environnement de dev peuvent avoir différentes régional d'information de configuration de l'environnement de déploiement. Habituellement, .NET utilise la culture actuelle dans tous les
.ToString
appels et implicites de la mise en forme ou de l'analyse. Lors de forcer un format et de la culture de l'invariance explicitement, vous êtes moins enclin à des problèmes vous ne pouvez pas reproduire localement, mais qui existent sur l'application de production.Une note sur les formats de date/heure
Exacte, l'analyse, le format datetime devrait strictement correspondre le format de l'entrée. Vous devez alors prendre en considération les exemples suivants:
dd
correspond à deux chiffres de jours seulement. Donc"dd/MM/yyyy"
, il correspondra à la"01/01/2013"
, mais échoue pour"1/1/2013"
, car il attend que le nombre exact de chiffres pour la partie jour. Si vous ne voulez pas de zéros utilisation:d/M/yyyy
à la place. Lettre unique signifie un chiffre pour les jours de moins que10
et deux chiffres pour les autres.MM
correspond à deux chiffres du mois, donc tout ce qui s'applique àdd
vsd
est la même depuis des mois.yyyy
attend de l'année en 4 chiffres. Si vous utilisez deux chiffres de l'année, l'utilisationyy
à la place.Une remarque sur certains ADO.NET les fournisseurs
Comme il s'avère être le cas avec MS Access, l'correctement analysée date-heure d'objet n'est pas suffisant pour faire le travail de requête. Actuellement, le code suivant
est utilisé pour ajouter des paramètres à la requête. Cependant, cette approche omet de transmettre des renseignements à la ADO.NET db fournisseur qui indique à quel type de base de données à utiliser pour le paramètre. J'ai lu sur certains forums que MS Access/OleDb n'est pas capable de résoudre le type correct dans tous les cas. Donc je recommande l'approche suivante:
Le code ci-dessus permet de spécifier le paramètre de type de base de données explicitement, de sorte que le pilote OleDb est maintenant capable de correctement le passage de la
DateTime
objet de la base de données MS Access.DateTime.ParseExact
échouer, ou il échoue après qu'il a atteint la base de données? Dans le dernier cas, peut-être que le paramètre n'est pas reconnus correctement par la base de données.OleDbType.DateTime
/OleDbType.SmallDateTime
lors du passage de paramètre à la requête de travail? Au moins, il est là, je crois que le problème se produit, que l'analyse aurait déjà réussi. Essayez de déboguer et de voir ceDateTime
objet est réellement passé - se déplacer dans local var au lieu d'avoir leParseExact
appel où vous ajoutez le paramètre.OleDbParameter prm = new OleDbParameter(parameterName, parameterType);
pour créer un paramètre de l'objet; l'Utilisationprm.Value = value;
oùvalue
est l'analyse de l'objet date, et ensuite utilisercmd.Parameters.Add(prm);
J'ai utilisé ci-dessous court code: