none
Pb avec date d'aujourd'hui RRS feed

  • 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 

      
    dimanche 20 janvier 2013 13:30

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
    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".

    lundi 21 janvier 2013 09:34
  • 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 Logout 

    Pourriez-vous m'éclairer.

    Merci D'avance.

    Cordialement.

    lundi 21 janvier 2013 16:47
  • 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".

    lundi 21 janvier 2013 17:47
  • 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">|&lt;</Button>
            <Button HorizontalAlignment="Left" Margin="41,0,0,0" Name="btnPrevious" Width="35" Height="23" VerticalAlignment="Top">&lt;</Button>
            <Button Margin="82,1,0,0" Name="btnNext" Height="23" VerticalAlignment="Top" HorizontalAlignment="Left" Width="35" Grid.ColumnSpan="2">&gt;</Button>
            <Button HorizontalAlignment="Left" Margin="9,1,0,0" Name="btnLast" Width="35" Height="23" VerticalAlignment="Top" Grid.Column="1">&gt;|</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">|&lt;</Button>
            <Button Margin="41,-0.001,0,17.978" Name="btnPrevious" HorizontalAlignment="Left" Width="34.538">&lt;</Button>
            <Button Margin="82,0,0,17.977" Name="btnNext" HorizontalAlignment="Left" Width="35" Grid.ColumnSpan="2">&gt;</Button>
            <Button HorizontalAlignment="Left" Margin="21,0,0,17.977" Name="btnLast" Width="35" Grid.Column="1">&gt;|</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.

    mardi 22 janvier 2013 11:20
  • 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,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 22 janvier 2013 14:21
  • 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.

    mercredi 23 janvier 2013 14:19
  • 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,

     


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 23 janvier 2013 14:52
  • 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. 

    jeudi 24 janvier 2013 07:24
  • 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


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 24 janvier 2013 07:51
  • 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".


    jeudi 24 janvier 2013 09:41
  • 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.

    jeudi 24 janvier 2013 18:41
  • vendredi 25 janvier 2013 08:18
  • 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.

    samedi 26 janvier 2013 03:15
  • 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
    samedi 26 janvier 2013 09:32