RECUPERAR OS MILLISECONDS DE UMA DATA EM UM BANCO

 Tópico anterior Próximo tópico Novo tópico

RECUPERAR OS MILLISECONDS DE UMA DATA EM UM BANCO

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#496087 - 18/01/2021 20:05:16

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


 Anexos estao visíveis somente para usuários registrados

PessoALL,

  Estou com uma dúvida terrível com a data.

  Quando eu gravo no Banco da dados com ADO.Net, estou passando o seguinte formato:  ''18/01/2021 18:16:10.091'', note que possui o milesegundo, mas ao recuperar a informação, a minha select dentro do Manager Studio recupera o milesegundo, mas no VB.Net comADO.Net não retorna o milesegundo!


  PERGUNTA!!!

  Como eu recupero a data completa (com milisegundos) com VB.Net + SQl Server com ADO.Net?


Obrigado,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanue

#496088 - 18/01/2021 20:49:18

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Está usando o tipo de dados certo(DateTime)? Ele contém os milissegundos.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#496089 - 18/01/2021 22:20:33

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


Última edição em 18/01/2021 22:21:23 por TUNUSAT

KERPLUNK,

   Para gravar eu estava usando 'DateTime' e não gravava os milissegundos...
   ... quando eu troquei dentro da estrutura 'Domain' para STRING:

Private _DataAlteracao As String

Public Property DataAlteracao() As String
    Get
        Return _DataAlteracao
    End Get
    Set(ByVal value As String)
        _DataAlteracao = value
    End Set
End Property



   Comecei a trabalhar com string e começou a gravar dentro do SQL Server, pois faz um 'INSERT' desta forma: ''18/01/2021 20:28:57.821','.
   Quando eu faço um 'SELECT' no MSS Manager Studio a informação dos milissegundos aparecem na tela, mas quando uso o ADO.Net para fazer um 'SELECT'...


SELECT CNPJ, RazaoSocial, NomeFantasia, CodigoSistema,  DataAlteracao
FROM tblHistorico


   ... a data vem sem os milisegundos... Exemplo:

? cod2
'18/01/2021 15:14:41'


    REALMENTE é engraçado, pois o 'DateTime' tem a função para milissegundos, mas parece que NÃO recupera quando a informação vem do SQL Server.

[]'s,
Fabio I.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanue

#496090 - 19/01/2021 01:00:53

JABA
CABO FRIO
Cadast. em:Agosto/2005


Veja isso:

docs.microsoft.com/pt-br/dotnet/standard/base-types/how-to-display-milliseconds-in-date-and-time-values

_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



#496091 - 19/01/2021 09:14:38

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


JABA,

   Sim, funciona, mas a questão é a recuperação de uma data a partir de uma Base de Dados MS SQL Server.
   Por favor, pegue um Tabela de SQL sua e tente recuperar de uma campo data os milissegundos.

[]'s,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanue

#496101 - 19/01/2021 18:05:19

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 19/01/2021 18:13:24 por JABA

Se você usar o método GetDateTime do SQLDataReader, ele retornará um objeto DateTime que preserva os milissegundos:

reader.GetDateTime(reader.GetOrdinal('Timestamp'));


Outra forma:

using (SqlCommand cmd = new SqlCommand('SELECT DataAlteracao FROM Banco'))
        {
          cmd.Connection = conn;

          SqlDataReader reader = cmd.ExecuteReader();
          while(reader.Read())
          {
            DateTime dt = (DateTime)reader['DataAlteracao'];
            int milliSeconds = dt.Millisecond;
            Console.WriteLine(dt.ToString('yyyy-MM-dd HH:mm:ss.fff'));
          }
        }


_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



Resposta escolhida #496120 - 21/01/2021 14:39:29

JABA
CABO FRIO
Cadast. em:Agosto/2005


E aí, conseguiu fazer?

_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



#496122 - 21/01/2021 16:18:12

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


Última edição em 21/01/2021 16:42:04 por TUNUSAT

Jaba,

     Sim o que você escreveu está completamente certo, mas ainda tenho um probleminha conceitual... veja como eu fiz para testar:

*** Chamada da função para testar

Dim strTeste As String

strTeste = GerenciadorBll.Instance.HistoricoBLL.RetornaCodigoHistorico('1', '18-01-2021 15:14:41.897')
mskDataAlteracao.Text = strTeste


*** BLL

Public Function RetornaCodigoHistorico(Codigo As String, DataHistorico As String) As String
    Return GerenciadorDal.Instance.HistoricoDal.RetornaCodigoHistorico(Codigo, DataHistorico)
End Function


*** DAL

Public Function RetornaCodigoHistorico(ByVal codigoHistorico As String, ByVal dataHistorico As String) As String
    MyBase.LimparStrComando()

    MyBase.StrComando.AppendLine(' SELECT ')
    MyBase.StrComando.AppendLine(' DataAlteracao ')
    MyBase.StrComando.AppendLine(' FROM tblHistorico ')
    MyBase.StrComando.AppendLine(String.Format(' WHERE codigoSistema = '{0}' ', codigoHistorico))
    MyBase.StrComando.AppendFormat(' AND DataAlteracao = '{0}' ', dataHistorico)

    Return MyBase.RetornaDataHistorico(StrComando.ToString())
End Function


*** BASE DAL

Protected Function RetornaDataHistorico(ByVal pCommantText As String) As String
    Dim milliSeconds As Int32
    Dim dt As DateTime
    Dim strTempo As String

    Using dataReader As System.Data.SqlClient.SqlDataReader = SQLHelper.ExecuteReader(pCommantText)

        If dataReader.HasRows Then
            dataReader.Read()

            dt = dataReader.GetValue(dataReader.GetOrdinal('DataAlteracao'))
            milliSeconds = dt.Millisecond

            strTempo = dt.ToString() + '.' + milliSeconds.ToString()
        Else
            Return Now()
        End If

        Return strTempo
    End Using

End Function


   Agora, meu problema conceitual é preencho uma grid com um 'Selecionar Todos', a saber:

*** UI - User Interface

Private Sub PreencheGrid(Optional ByVal cod1 As String = Nothing, Optional ByVal cod2 As String = Nothing)

    DgvPadrao.DataSource = Nothing
    DgvPadrao.DataSource = GerenciadorBll.Instance.HistoricoBLL.SelecionarTodos

    If DgvPadrao.Rows.Count > 0 Then

...

   Quando eu retorno o 'SELECIONAR TODOS'...

* BLL

Public Function SelecionarTodos() As List(Of ClsHistoricoDomain) Implements ICrud(Of ClsHistoricoDomain, String).SelecionarTodos
    Return GerenciadorDal.Instance.HistoricoDal.SelecionarTodos()
End Function


* DAL

Public Overrides Function SelecionarTodos() As List(Of ClsHistoricoDomain)
    MyBase.LimparStrComando()

    MyBase.StrComando.AppendLine(' SELECT CNPJ, ')
    MyBase.StrComando.AppendLine(' RazaoSocial, ')
    MyBase.StrComando.AppendLine(' NomeFantasia, ')
    MyBase.StrComando.AppendLine(' CodigoSistema, ')
    MyBase.StrComando.AppendLine(' DataAlteracao ')
    MyBase.StrComando.AppendLine(' FROM tblHistorico ')

    Return MyBase.RetornaLista2(StrComando.ToString())
End Function


* BASE DAL

Protected Function RetornaLista2(ByVal commandText As String, Optional ByVal isSql As Boolean = True) As List(Of ClsHistoricoDomain)

    Dim listaRetorno As List(Of ClsHistoricoDomain) = Nothing

    Try

        If isSql Then
            Using dataReader As System.Data.SqlClient.SqlDataReader = SQLHelper.ExecuteReader(commandText)
                If dataReader.HasRows Then
                    listaRetorno = New List(Of ClsHistoricoDomain)()
                    While dataReader.Read()
                        Dim objeto As ClsHistoricoDomain
                        objeto = Activator.CreateInstance(GetType(ClsHistoricoDomain), dataReader)

                        listaRetorno.Add(objeto)
                    End While
                End If
            End Using
        End If

        Return listaRetorno

    Catch ex As Exception
        Return Nothing
    End Try

End Function


    O SELECT ALL JÁ RETORNA TODAS AS DATAS SEM MILISEGUNDOS!!!

    Como na tabela 'tblHistorico' minha chave primária é composta por 'CodigoSistema' + 'DataAlteracao' então eu me ferro, pois retorna vários registros com a informação da Chave Primária Composta INCOMPLETA...
   ... acho que terei que mudar TODA a lógica de fazer histórico do sistema.... NÃO pode ser uma chave composta com uma data que depende de milissegundos... terá que ser um autonumber ou algo parecido...
   ... que péssimo, por causa de um erro no código do VB.Net que NÃO retorna os milissegundos em uma busca eu terei que mudar totalmente a minha ideia.

[]'s,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanue

#496123 - 21/01/2021 16:31:48

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Porque ainda está usando datas como STRING?
Esse é todo o ponto da coisa, você está usando o tipo errado de dados.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#496125 - 21/01/2021 16:46:49

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


Última edição em 21/01/2021 16:47:47 por TUNUSAT

KERPLUNK,

     Infelizmente a comunicação com o MS SQL Server usando 'DateTime' tanto o 'INSERT' quanto o 'SELECT' a informação dos milissegundos é perdida.

     - INSERT:
     Para contornar o problema no INSERT eu passo como a data para o ADO.Net como uma String e o banco aceita e armazena os milisegundos!

    - SELECT ALL para montar Grid:
    Infelizmente o 'SqlDataReader' NÃO consegue retornar a data completa com os milissegundos, NÃO importando se o receptor é um Objeto, uma String ou um dateTime...


Captou a desgraça?
[]'s,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanue

#496129 - 21/01/2021 18:59:02

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Isso é porque você precisa usar formato específico para exibir os milisegundos, o padrão é sem eles. E o tipo PRECISA ser DateTime.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por TUNUSAT em 23/01/2021 15:24:32