Meilleur auteur de réponses
Pb avec date d'aujourd'hui

Question
-
Bonjour, je travaille avec Entity framework 3.5.
Mon interrogation est la suivante :
J'ai une base de données SQL Server 2008, avec différente une table qui contient plusieurs colonnes. Une de ces colonnes est de type 'Datetime', qui informe sur la date de création de l'enregistrement (en l'occurence la date d'aujourd'hui).
Vous trouverez ci joint, le code d'ajout d'un nouvel enregistrement.
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAdd.Click 'Dim newCustomer As New Customer MsgBox(DateTime.Today()) newCustomer.FirstName = TextBox2.Text newCustomer.LastName = Textbox1.Text newCustomer.City = TextBox3.Text newCustomer.Modified = DateTime.Today() newCustomer.Pic = ConvertImage(Image1.Source) Me.DialogResult = True customerList.Add(newCustomer) db.AddToCustomers(newCustomer) db.SaveChanges() Me.Close() End Sub
Le problème qui se pose est qu'au niveau de la date de création, l'appli (WPF), cela m'affiche la date : 01/01/0001, au lieu de la date du jour. J'ai pourtant bien affecté DateTime.Today() pour inserer la date d'aujourd'hui, mais la date enregistrée est 01/01/0001.
MsgBox(DateTime.Today()) me donne bien la date d'aujourd'hui, mais l'affectation de la colonne Modified (newCustomer.Modified = DateTime.Today()), n'est pas éxecutée.
Lorsque je refais un SaveChanges(), j'ai un message d'erreur :
"Dépassement SQLDateTime. Doit être compris entre 1/1/1753 12:00:00 AM et 31/12/9999 11:59:59 PM.
Pourriez-vous m'éclairer.
Merci d'avance.
Cordialement
Réponses
-
Bonjour,
Ca y est, j'ai enfin trouvé la solution à la problèmatique ci-dessus :
Le fait d'avoir modifié le modèle le EDMX, pour la colonne Modified comme vous me l'avez suggéré (mettre StoreGeneratedPattern = Computed) force la mise à jour
des valeurs après l’insertion.
Donc au niveau de la création d'un nouvel enregistrement, cela fonctionne.
Le problème perdurait au niveau de l'affichage, qui par défaut affichait 01/01/0001 12:00:00 AM. Ceci est affaire réglée, puisque je crée une classe :
Public Class Customer Sub New() Me.Modified = DateTime.Now End Sub End Class
Le construteur sert à l'initialisation d'objet.
Par ce biais, j'initialise la TextBox correspondant à la colonne Modified, à la valeur d'aujourd'hui.
Je vous remercie de l'aide que vous m'avez apporter.
A très bientôt.
Cordialement.
- Marqué comme réponse Kensi22 samedi 26 janvier 2013 09:32
Toutes les réponses
-
Bonjour,
La date ne serait pas définie comme étant étant alimentée par la base de données (StoreGenerated ?). Elle est bien définie comme étant de type date ?
Sinon j'utiliserais SQL Server Profiler pour vori exactement l'instruction SQL envoyée au serveur pour le "INSERT" ce qui devrait permettre de mieux cerner le problème.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
-
Bonjour,
Au chargement de mon application, voici le Log de SQL Profiler.
Tout se passe bien, la BD est chargée, et mes contrôles sont remplis.Audit Login -- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language Français
set dateformat dmy
set datefirst 1
set transaction isolation level read committed
SQL:BatchStarting SELECT
[Extent1].[CustomerID] AS [CustomerID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Address] AS [Address],
[Extent1].[City] AS [City],
[Extent1].[State] AS [State],
[Extent1].[ZIP] AS [ZIP],
[Extent1].[Modified] AS [Modified],
[Extent1].[Pic] AS [Pic]
FROM [dbo].[Customer] AS [Extent1]
SQL:BatchCompleted SELECT
[Extent1].[CustomerID] AS [CustomerID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Address] AS [Address],
[Extent1].[City] AS [City],
[Extent1].[State] AS [State],
[Extent1].[ZIP] AS [ZIP],
[Extent1].[Modified] AS [Modified],
[Extent1].[Pic] AS [Pic]
FROM [dbo].[Customer] AS [Extent1]J'appui sur le bouton ajouter, une nouvelle fenêtre s'ouvre (fenêtre d'ajout).
Ma question est : Pourquoi à l'ouverture de ma seconde fenêtre (fenêtre d'ajout), la textbox bindée sur
la colonne "Modified" (type DateTime initialisée avec getdate() dans SQL server), m'affiche la date "01/01/0001 12:00:00 AM" au lieu de la date d'aujourd'hui.Je rempli tous mes items et j'appui sur ajouter (ou enregistrer) pour valider cet ajout.
Audit Logout
Audit Login -- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language Français
set dateformat dmy
set datefirst 1
set transaction isolation level read committed
RPC:Completed exec sp_executesql N'insert [dbo].[Customer]([LastName], [FirstName], [Address], [City], [State], [ZIP], [Modified], [Pic])
values (@0, @1, null, @2, null, null, @3, null)
select [CustomerID]
from [dbo].[Customer]
where @@ROWCOUNT > 0 and [CustomerID] = scope_identity()',N'@0 varchar(8),@1 varchar(4),@2 varchar(21),@3 datetime',@0='TOTO',@1='TATA',@2='ROQUEBRUNE-CAP-MARTIN',@3='2013-01-21 00:00:00'Je remarque que c'est bien la date d'aujourd'hui qui est inserée dans la base.
Donc ma seconde question, est pourquoi la date d'aujourd'hui ne s'affiche pas dans mes TextBox (au lieu de cela ça m'affiche 1/1/0001 12:00:00 AM).Lorsque j'appui une nouvelle fois sur SaveChanges(), j'obtient la message d'erreur :
"Dépassement SQLDateTime. Doit être compris entre 1/1/1753 12:00:00 AM et 31/12/9999 11:59:59 PM."
Audit Logout
Audit Login -- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language Français
set dateformat dmy
set datefirst 1
set transaction isolation level read committed
Audit LogoutPourriez-vous m'éclairer.
Merci D'avance.
Cordialement.
-
Modified est une propriété automatique ? {get;set;}
Apparemment la valeur est donc bien transmise vers SQL. A priori c'est DateTime.MinValue qui doit-être la valeur par défaut d'une date .NET (on aurait sans doute ce phénomène par exemple si on déclare une DateTime et qu'on la laisse à sa valeur par défaut). Si il y a du code dans le get on a peut-être un souci à ce niveau ?
Ou éventuellement modifié temporairement pour retourner une valeur en dur et voir ce que cela donne (si changement c'est bien que cela coince au niveau du transfert SQL->propriété, si cela ne marche toujours pas ce serait peut-être plutôt au niveau propriété->UI ?)
Bon courage.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
-
Bonjour, et merci de votre aide.
Voici mon code au complet :
Tout d'abord, ma fenêtre principale :
<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="282" Width="550" Name="Window1"> <Window.Resources> <CollectionViewSource x:Key="CustomerSource" /> </Window.Resources> <Grid DataContext="{Binding Source={StaticResource CustomerSource}}"> <Grid.RowDefinitions> <RowDefinition Height="44*" /> <RowDefinition Height="218*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="115*" /> <ColumnDefinition Width="129*" /> <ColumnDefinition Width="142*" /> <ColumnDefinition Width="142*" /> </Grid.ColumnDefinitions> <Button Grid.Column="3" HorizontalAlignment="Right" Name="btnSave" Width="60" Margin="0,0,0,17.978">Save</Button> <Button Grid.Column="3" Margin="16,-0.001,66,17.978" Name="btnAdd">Add</Button> <Button Margin="92,-0.001,132,17.978" Name="btnDelete" Grid.Column="2" Grid.ColumnSpan="2">Delete</Button> <Button HorizontalAlignment="Left" Name="btnFirst" Width="35" Height="23" VerticalAlignment="Top">|<</Button> <Button HorizontalAlignment="Left" Margin="41,0,0,0" Name="btnPrevious" Width="35" Height="23" VerticalAlignment="Top"><</Button> <Button Margin="82,1,0,0" Name="btnNext" Height="23" VerticalAlignment="Top" HorizontalAlignment="Left" Width="35" Grid.ColumnSpan="2">></Button> <Button HorizontalAlignment="Left" Margin="9,1,0,0" Name="btnLast" Width="35" Height="23" VerticalAlignment="Top" Grid.Column="1">>|</Button> <StackPanel Grid.Column="1" Grid.Row="1" Name="StackPanel1"> <Label Height="28" Name="Label1" Width="Auto" Margin="3" HorizontalContentAlignment="Right">Customer ID:</Label> <Label Height="28" Name="Label2" Width="Auto" Margin="3" HorizontalContentAlignment="Right">Last Name:</Label> <Label Height="28" Name="Label3" Width="Auto" Margin="3" HorizontalContentAlignment="Right">First Name:</Label> <Label Height="28" Name="Label4" Width="Auto" Margin="3" HorizontalContentAlignment="Right">City:</Label> <Label Height="28" HorizontalContentAlignment="Right" Name="Label5" Width="123">Date:</Label> </StackPanel> <StackPanel Grid.Row="1" HorizontalAlignment="Left" Name="StackPanel2" VerticalAlignment="Top" Width="115" Height="202"> <TextBox Grid.Column="1" Height="23" Name="TextBox5" TextAlignment="Center" Width="Auto"/> <ListBox Height="180" x:Name="lbContacts" ItemsSource="{Binding Source={StaticResource CustomerSource}}" Width="Auto" > <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding FirstName}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> <StackPanel Grid.Column="2" Grid.Row="1" Name="StackPanel3"> <TextBox Name="txtCustomerID" Width="Auto" Height="28" Margin="3" IsReadOnly="True" Text="{Binding ElementName=lbContacts, Path=SelectedItem.CustomerID, Mode=OneWay}"/> <TextBox Name="txtLastName" Width="Auto" Height="28" Margin="3" Text="{Binding ElementName=lbContacts, Path=SelectedItem.LastName}" /> <TextBox Name="txtFirstName" Width="Auto" Height="28" Margin="3" Text="{Binding ElementName=lbContacts, Path=SelectedItem.FirstName}" /> <TextBox Name="txtCity" Width="Auto" Height="28" Margin="3" Text="{Binding ElementName=lbContacts, Path=SelectedItem.City}" /> <TextBox Height="28" Name="TextBox1" Text="{Binding ElementName=lbContacts, Path=SelectedItem.Modified}" Width="136" /> </StackPanel> <TextBox Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="51,2,0,0" Name="TextBox4" VerticalAlignment="Top" Width="72" TextAlignment="Center" /> <StackPanel Grid.Column="3" Grid.Row="1" Margin="0,0,0,1.022" Name="StackPanel4"> <Image Source="{Binding Path=Pic}" Height="150" Name="Image1" Stretch="Fill" Width="132" Margin="3"/> <Button Height="23" Name="Button1" Width="Auto">Add Image</Button> </StackPanel> </Grid> </Window>
Et le code behind associé:
Imports WpfEfDAL Imports System.Collections.ObjectModel Imports Microsoft.Win32.OpenFileDialog Imports System.IO Class Window1 Private db As New OMSEntities Private CustomerData As New ObservableCollection(Of Customer) Private View As ListCollectionView Public Property Customer() As ObservableCollection(Of Customer) Get Return CustomerData End Get Set(ByVal value As ObservableCollection(Of Customer)) CustomerData = value End Set End Property Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded Dim results = From c In db.Customers _ Select c Me.CustomerData = New CustomerCollection(results, db) Dim customerSource = CType(Me.Resources("CustomerSource"), CollectionViewSource) customerSource.Source = Me.CustomerData Me.View = CType(customerSource.View, ListCollectionView) End Sub Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnFirst.Click Me.View.MoveCurrentToFirst() End Sub Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnPrevious.Click If Me.View.CurrentPosition > 0 Then Me.View.MoveCurrentToPrevious() End If End Sub Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnNext.Click If Me.View.CurrentPosition < Me.View.Count - 1 Then Me.View.MoveCurrentToNext() End If End Sub Private Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnLast.Click Me.View.MoveCurrentToLast() End Sub Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnDelete.Click If Me.View.CurrentPosition > -1 Then Me.View.RemoveAt(Me.View.CurrentPosition) End If End Sub Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAdd.Click Dim window As New Window2 If window.ShowDialog = True Then If window.lbContacts IsNot Nothing Then Customer.Add(window.Customer) End If End If Me.TextBox4.Text = lbContacts.Items.Count End Sub Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSave.Click Try db.SaveChanges() MessageBox.Show("Customer data was saved.", Me.Title, MessageBoxButton.OK, MessageBoxImage.Information) Catch ex As Exception MsgBox(ex.ToString()) End Try End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click Dim myDialog As New Microsoft.Win32.OpenFileDialog() myDialog.Filter = "All Files|*.*|Image Files|*.jpg;*.gif;*.png;*.bmp" myDialog.ShowDialog() Image1.Source = New BitmapImage(New Uri(myDialog.FileName, UriKind.Absolute)) 'ListBox1.Items.Add(myDialog.FileName) BufferFromImage(Image1.Source) End Sub Public Function BufferFromImage(ByVal imageSource As BitmapImage) As Byte() Dim memStream As MemoryStream = New MemoryStream() Dim encoder As JpegBitmapEncoder = New JpegBitmapEncoder() encoder.Frames.Add(BitmapFrame.Create(imageSource)) encoder.Save(memStream) Return memStream.GetBuffer() End Function Public Function ConvertToImage(ByVal rawImageData As Byte()) As BitmapImage Dim stream As MemoryStream = New MemoryStream(rawImageData) stream.Position = 0 Dim bi As BitmapImage = New BitmapImage() bi.BeginInit() bi.StreamSource = stream bi.EndInit() Return bi End Function Private Function ImageToBytes(ByVal image As Image) As Byte() Dim bytes As Byte() = Nothing Dim width As Int32 = CInt(image.ActualWidth) Dim height As Int32 = CInt(image.ActualHeight) Dim bit As BitmapImage bit = CType(image.Source, BitmapImage) Dim bmpEnco As New BmpBitmapEncoder bmpEnco.Frames.Add(BitmapFrame.Create(bit)) Dim ms As New MemoryStream bmpEnco.Save(ms) ms.Position = 0 bytes = ms.ToArray() Return bytes End Function End Class
Donc au démarrage de mon application, tout se passe bien, ma listbox se rempli avec les items de ma base se données SQL server, ainsi que mes textbox associées.
Donc la textbox1 est bien bindée avec la colonne Modified de ma base.
Lorsque je souhaite ajouter un élément à ma base, j'appui sur le bouton Add, qui m'ouvre une nouvelle fenêtre, dont voici le code :
<Window x:Class="Window2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="282" Width="550" Name="Window2"> <Window.Resources> <CollectionViewSource x:Key="CustomerSource" /> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="44*" /> <RowDefinition Height="218*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="115*" /> <ColumnDefinition Width="129*" /> <ColumnDefinition Width="142*" /> <ColumnDefinition Width="142*" /> </Grid.ColumnDefinitions> <Button Grid.Column="3" HorizontalAlignment="Right" Name="btnAnnuler" Width="60" Margin="0,2,0,15.977">Annuler</Button> <Button Grid.Column="3" Margin="16,1,66,16.978" Name="btnAdd">Add</Button> <Button Margin="92,0,132,17.978" Name="btnDelete" Grid.Column="2" Grid.ColumnSpan="2">Delete</Button> <Button HorizontalAlignment="Left" Name="btnFirst" Width="35" Margin="0,-0.001,0,17.978">|<</Button> <Button Margin="41,-0.001,0,17.978" Name="btnPrevious" HorizontalAlignment="Left" Width="34.538"><</Button> <Button Margin="82,0,0,17.977" Name="btnNext" HorizontalAlignment="Left" Width="35" Grid.ColumnSpan="2">></Button> <Button HorizontalAlignment="Left" Margin="21,0,0,17.977" Name="btnLast" Width="35" Grid.Column="1">>|</Button> <StackPanel Grid.Column="1" Grid.Row="1" Name="StackPanel1"> <Label Height="28" Name="Label2" Width="Auto" Margin="3" HorizontalContentAlignment="Right">Last Name:</Label> <Label Height="28" Name="Label3" Width="Auto" Margin="3" HorizontalContentAlignment="Right">First Name:</Label> <Label Height="28" Name="Label4" Width="Auto" Margin="3" HorizontalContentAlignment="Right">City:</Label> <Label Height="28" HorizontalContentAlignment="Right" Name="Label1" Width="123">Date:</Label> </StackPanel> <StackPanel Grid.Row="1" HorizontalAlignment="Left" Name="StackPanel2" VerticalAlignment="Top" Width="115" Height="202"> <ListView Height="202" x:Name="lbContacts" ItemsSource="{Binding Source={StaticResource CustomerSource}}" Width="Auto" > <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" > <TextBlock Text="{Binding FirstName}" /> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel> <StackPanel Grid.Column="2" Grid.Row="1" Name="StackPanel3"> <TextBox Text="{Binding Path=LastName}" Name="Textbox1" Width="Auto" Height="28" Margin="3" /> <TextBox Text="{Binding Path=FirstName}" Name="TextBox2" Width="Auto" Height="28" Margin="3" /> <TextBox Text="{Binding Path=City}" Name="TextBox3" Width="Auto" Height="28" Margin="3" /> <TextBox Height="28" Name="TextBox4" Width="136" /> <my:DatePicker Height="25" Name="DatePicker1" Width="142" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" /> </StackPanel> <TextBox Grid.Column="1" Margin="62,1.52,29,16.458" Name="TextBox6" TextAlignment="Center" /> <StackPanel Grid.Column="3" Grid.Row="1" Margin="0,0,0,1.022" Name="StackPanel4"> <Image Height="150" Name="Image1" Stretch="Fill" Width="142" /> <Button Height="23" Name="Button1" Width="Auto">Add Image</Button> </StackPanel> </Grid> </Window>
et le code behind associé :
Imports WpfEfDAL Imports System.Collections.ObjectModel Imports System.IO Public Class Window2 Private db As New OMSEntities Dim customerList As New List(Of Customer) Private _Customer As New Customer() Dim newCustomer As New Customer Public Property Customer() As Customer Get Return _Customer End Get Set(ByVal value As Customer) _Customer = value End Set End Property Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded Me.DataContext = Customer End Sub Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAdd.Click 'Dim newCustomer As New Customer MsgBox(DateTime.Today()) newCustomer.FirstName = TextBox2.Text newCustomer.LastName = Textbox1.Text newCustomer.City = TextBox3.Text newCustomer.Modified = TextBox4.Text newCustomer.Pic = ConvertImage(Image1.Source) Me.DialogResult = True customerList.Add(newCustomer) db.AddToCustomers(newCustomer) db.SaveChanges() Me.Close() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click Dim OpenFileDialog As New Microsoft.Win32.OpenFileDialog OpenFileDialog.FileName = Nothing OpenFileDialog.ShowDialog() Dim bmp As New BitmapImage(New Uri(OpenFileDialog.FileName().Trim)) If Not OpenFileDialog.FileName = Nothing Then Me.Image1.Source = bmp End If Dim stream As FileStream = New FileStream(OpenFileDialog.FileName, FileMode.Open, FileAccess.Read) Dim reader As BinaryReader = New BinaryReader(stream) Dim Data As Byte() = reader.ReadBytes(stream.Length) reader.Close() stream.Close() newCustomer.Pic = Data If Not OpenFileDialog.FileName = Nothing Then Me.Image1.Source = bmp End If End Sub Public Function ConvertImage(ByVal bmp As BitmapImage) As Byte() Dim mstream As New MemoryStream() Dim buffer As Byte() = Nothing If Not mstream Is Nothing And mstream.Length > 0 Then Using br As BinaryReader = New BinaryReader(mstream) buffer = br.ReadBytes(mstream.Length) End Using End If Return buffer End Function ' public Byte[] BufferFromImage(BitmapImage imageSource) '{ ' Stream stream = imageSource.StreamSource; ' Byte[] buffer = null; ' if (stream != null && stream.Length > 0) ' { ' using (BinaryReader br = new BinaryReader(stream)) ' { ' buffer = br.ReadBytes((Int32)stream.Length); ' } ' } ' return buffer; '} End Class
En compariason de ma précédente version, c'est que je n'affecte plus "DateTime.Now" (qui aurait dû m'afficher la date d'aujourd'hui mais au lieu de ceci, m'affiche 01/01/0001 12:00:00 AM), mais laisse à l'utilisateur le choix d'inserer lui même la date.
Une fois les différents champs remplis, j'appui sur Add (seconde fenêtre), pour valider cet ajout. Sur ma fenêtre principale, je retrouve l'élément ajouté(dans mes textboxes), par contre la date (dans la textbox bindée sur la colonne Modified), cela m'affiche 01/01/0001.
Lorsque j'appui sur le bouton "Save" (SaveChanges), cela m'affiche le message d'erreur.
Ce que je n'arrive pas à comprendre, c'est que l'ajout a bien lieu (Voir le log de SQL profiler), et la date correspondant à l'enregistrement est 01/01/0001.
Je vous remercie d'avance de l'intérêt que vous portez ce sujet, ainsi que de me venir en aide.
Cordialement.
-
Bonjour
Si vous exécutez un select * from ma_table, les dates sont toutes OK ou non ?
Comme je vois, le problème apparaît quand vous bindez la date avec DateTime Picker.
Utilisez le debugger pour voir si vous avez des bonnes valeurs pour Modified (le probleme c'est avec le select ou le bindage).
Cordialement,
-
Bonjour,
Je binde la date (colonne Modified) avec la Textboxet non avec le datetimepicker. Je pense que le problème vient de la base de données.
J’ai suivi votre conseil, j’ai utilisé le debugger, lorsque j’espionne la valeur retournée par newCustomer.Modified, celle-ci me renvoi #12:00:00 AM#, alors que la demande est bien La date d’aujourd’hui + 12:00:00 AM.
Lorsque SaveChanges() s’exécute pour la première fois, je vois bien que la date d’aujourd’hui est insérée (SQL profiler), par contre sur ma fenêtre principale, au niveau de la textbox bindée sur la colonne « Modified », je ne retrouve pas la date d’aujourd’hui, mais 01/01/0001 12:00:00 AM, alors que les autres textboxes me fournissent une information correcte (bind avec la database).
Je ne comprends pas du tout ce phénomène.
Pour info, j'ai modifié le type de la colonne "Modified", pour permettre d'accepter la valeur nulle, par contre cela ne resoud pas du tout mon problème, car le but de la manipulation c'est d'avoir la date de création de l'enregistrement.
Merci d’avance de votre aide.
Cordialement.
-
Bonjour
Vérifiez dans le modelé .edmx les propriétés de la colonne Modified.
Aussi faites une mise à jour du modèle à partir de la BD.
Le système n’arrive à extraire correctement la valeur pour la colonne date.
D’habitude ce genre de problèmes arrive à cause du format de la date diffèrent entre le serveur BD et l’application.
Le serveur SQL est sur le même PC ou vous exécutez l’application ? Si non, essayez de exécuter l'appli sur le serveur SQL.
Quand le modèle edmx lis la valeur introduite il n’arrive à transformer dans une date.
Cordialement,
-
Regardez aussi ce lien.
C'est un problème qui ressemble bien avec ce que vous avez :
http://social.msdn.microsoft.com/Forums/eu/adodotnetentityframework/thread/b3bc3bf5-36bd-4975-a71e-24b095c61aa3
Cordialement, -
Bonjour,
Lorsque j'ouvre le fichier *.edmx, la propriété 'Modified', est bien sur datetime.
Comme les autres données de la table (pour cette colonne 'Modified'), sont toutes du même type, et de la forme Date + 12:00:00 AM, la base de données me paraît correcte.
Par contre, le fait que le système n’arrive à extraire correctement la valeur pour la colonne date, me paraît bizzare, puique le SQL Server et l'application visual studio sont sur la même machine, et développés sur la même machine.
Y aurait-il une configuration spécifique sur le SQL Server ou Visual Studio à faire?
Concernant le lien que vous m'avez proposé, j'avoue que c'est un peu flou. Avec entity framework, la creation d'un nouvel enregistrement passe nécessairement par une instanciation de la BD (dans mon exemple : newCustomer) que j'injecte ensuite dans la base de données originale (db.AddToCustomer(newCustomer)), et ensuite je sauvegarde (SaveChanges()).
Par contre, il est vrai, que la textbox bindée sur l'ID de la table reste à 0, alors qu'elle devrait avoir un numero auto (du fait du premier SaveChanges()).
La textbox bindée sur la Date, me donne une date incohérent (01/01/0001 12:00:00 AM), alors qu'elle est sensée être OK d'après SQL Profiler.
Si je ferme l'appli, et la relance, On verifie bien que l'enregistrement a été éffectué correctement. le but est de visualisé l'enregistrement correcte sans avoir à fermer l'appli.
Il y aurait peut-être un décalage entre les enregistrements dans la BD SQL Serveur et l'affichage des infos en temps réel des infos de la base de données sur l'appli, ou manque-t-il une instruction?
Je vous remercie d'avance de votre aide.
Cordialement.
-
Bonjour
Pas de décalage, c'est sûr.
Ce qu’on ne voie pas dans trace du votre profiler, c’est qu’après l’insert on doit avoir un SELECT. Et ici c’est le problème.
Avez-vous essaye de régénérer le modelé comme décrit dans le lien en haut ?
Merci
-
Donc le comportement n'est pas correct pour Id et Modified mais les valeurs des autres champs apparaissent bien ? Ces deux champs sont censés être générés par la base dans le modèle EDMX (vous disiez à un moment que vous utilisez GETDATE malgré que vous alimentiez aussi cette valeur sur le client) ?
Je cherche à comprendre si le point commun entre ces deux champs ne serait pas que le EDMX indique que leur valeur doit-être récupérée dans la base.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
- Modifié Patrice ScribeMVP jeudi 24 janvier 2013 11:45
-
Bonjour, et je vous remercie de l’intérêt que vous apportez à ce sujet.
Je vous récapitule ma problématique depuis le début :
La base de données que j’utilise se compose comme suit :
Table Customer
CustomerID int
FirstName String
LastName String
City String
Modified Datetime (Au départ je ne l’ai pas initialisée)
Pour faire simple
Cette Base de données a été créée avec SQL Server 2008.
Ensuite, sous visual studio, je crée mon interface WPF, avec les codes ci-dessus :
Jusque là, tout fonctionne bien, j’ai bien mes valeurs string et dates affichées dans mon interface WPF (window1).
La fenêtre window2, est la fenêtre d’ajout, c'est-à-dire, que lorsque j’appui sur le bouton Add, de la window1, cela m’ouvre la window2, qui contient mes textboxes d’ajout.
Par défaut, les textboxes sont vides, puisqu’elles vont servir au nouvel enregistrement.
Par code, j’initialise la textbox correspondant à la colonne Modified à DateTime.Now() (ou .today()), mais seulement voilà, lorsque l’appui sur le bouton Add(window1), la fenêtre window2 s’ouvre avec la textbox correspondant à Modified initialisée avec la valeur 01/01/0001 12:00:00 AM (alors que je m’attendais à voir la date d’aujourd’hui).
Comme je ne comprenais pas, j’ai modifié ma base de données sur SQL Server, en mettant la valeur par défaut de Modified à getdate(), pour aujourd’hui.
Mais rien n’y change.
J’uitilise une observablecollection, qui implémente INotifyPropertyChanged, pour signifier l’ajout de la donnée de la window2 vers la window1.
Il y a bien transfert des infos vers les textbox, à l’exception de la valeur de CustomerID qui reste à 0, et la donnée Modified qui reste à 01/01/0001 12:00:00 AM.
Lorsque je fais à nouveau Save, sur window1, j’obtiens le message de dépassement.
Le SQL profiler m’indique une requete INSERT, et d’après notre ami Aurel Bera, il manquerai un SELECT. Mais à quel moment le mettre et surtout comment.
Faudrait-il obligatoirement passer par une procédure stockée.
Je ne saisi pas l’erreur qui est faite.
Merci encore de votre aide.
Coedialement.
-
Bonjour
La solution c’est ici :
http://msdn.microsoft.com/fr-fr/library/system.data.metadata.edm.storegeneratedpattern.aspx
Dans le modèle EDMX, pour la colonne Modified vous devez mettre StoreGeneratedPattern = Computed.
Ca vas forcer la mise à jour des valeurs après l’insertion.
Cordialement, -
Bonjour,
Je vous remercie de votre aide, la solution poposée fonctionne parfaitement, la base de données se met à jour, dès le second SaveChanged (la date ('Modified'), est remplacée par la date d'aujourh'hui, et la valeur de la clé primaire est mise à jour ('CustomerID'). Donc au niveau de la création d'un nouvel enregistrement, cela fonctionne.
Lors de l'édition du modèle EDMX, j'ai pu m'apercevoir que l'on pouvait initialiser la valeur (DefaultValue="quelquechose", je ne savais pas que l'on pouvait le faire), par contre, pour la colonne Modified, je ne parviens pas à l'initialiser à la date d'aujourd'hui ( DefaultValue="Datetime.Now").
Sur SQL Server 2008, j'ai initialisé la valeur par défaut de la colonne Modified, à getdate() (Date d'aujourd'hui). Or, lorsque je crée mon modèle edmx sous visual studio, et j'examine la propriété de la colonne Modified, son type est bien DateTime, conformément à la BD SQL Server 2008 (ce qui est normal, puisque celle-ci a été crée à partir de cette base), par contre je ne retrouve pas l'initialisation de la valeur par défaut (getdate()), de la BD SQL Server.
Au niveau de l'affichage, la textbox correspondant à la date, affiche par défaut : 01/01/0001 12:00:00 AM, que l'on peut modifier manuellement.
Donc, dans la représentation graphique, dans la propriété de la colonne Modified, j'initialise la valeur par défaut à getdate() (Comme dans SQL Server), et je lance l'application.
Je me retrouve avec l'erreur suivante :
Erreur 54 : La valeur par défaut (getdate()) n'est pas valide pour DateTime. La valeur doit avoir la forme « yyyy-MM-dd HH:mm:ss.fffZ ».
Voici la ligne incriminée :
<Property Name="Modified" Type="DateTime" Nullable="false" DefaultValue="getdate()" />
Par contre lorsque dans le modele EDMX, je remplace getgate() par 2011-01-01 14:10:10.094Z, cela fonctionne :
<Property Name="Modified" Type="DateTime" Nullable="false" DefaultValue="2011-01-07 14:10:10.094Z" />
La textbox correspondant à la date s'initialise à la valeur 1/7/2011 2:10:10 PM, ce qui me rassure, puisque l'on peut affecter une valeur par défault à une colonne avec entyti framework.
La question que je me pose, est que mettre à la place de "2011-01-07 14:10:10.094Z", pour obtenir la date d'aujourd'hui. J'ai essayé de mettre 'DateTime.Now' ma sans succès.
Je vous remercie d'avance.
Cordialement.
-
Bonjour,
Ca y est, j'ai enfin trouvé la solution à la problèmatique ci-dessus :
Le fait d'avoir modifié le modèle le EDMX, pour la colonne Modified comme vous me l'avez suggéré (mettre StoreGeneratedPattern = Computed) force la mise à jour
des valeurs après l’insertion.
Donc au niveau de la création d'un nouvel enregistrement, cela fonctionne.
Le problème perdurait au niveau de l'affichage, qui par défaut affichait 01/01/0001 12:00:00 AM. Ceci est affaire réglée, puisque je crée une classe :
Public Class Customer Sub New() Me.Modified = DateTime.Now End Sub End Class
Le construteur sert à l'initialisation d'objet.
Par ce biais, j'initialise la TextBox correspondant à la colonne Modified, à la valeur d'aujourd'hui.
Je vous remercie de l'aide que vous m'avez apporter.
A très bientôt.
Cordialement.
- Marqué comme réponse Kensi22 samedi 26 janvier 2013 09:32