Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cintiadel

Conversion failed when converting datetime from character string.

Recommended Posts

Tenho uma página chamada Ficha.aspx onde tem um datagrid, conforme o código abaixo:

<asp:datagrid id="grdBrowse" runat="server" Width="100%" BorderWidth="1px" BackColor="White" BorderColor="Gray" AllowPaging="true" AlternatingItemStyle-BackColor="#C0C0C0" Font-Size="10px" Font-Name="Arial" OnPageIndexChanged="PageChange" PagerStyle-HorizontalAlign="Center" PagerStyle-Mode="NextPrev" DataKeyField="inFichaId" AutogenerateColumns="False" PagerStyle-PageButtonCount="10" AlternatingItemStyle-Font-Size="11" AlternatingItemStyle-Font-Name="Arial"headerstyle-Font-Size="14" headerstyle-Font-Bold="true" headerstyle-Font-Name="Arial" HeaderStyle-ForeColor="GrayText" HeaderStyle-Font-Underline="false" cellpadding="1" Font-Names="Arial" OnItemDataBound="BrowseItemDataBound" OnDeleteCommand="BrowseDelete" PageSize="20" AllowSorting="true">
<SelectedItemStyle ForeColor="#3366FF"></SelectedItemStyle>
<EditItemStyle Font-Size="10px" Font-Names="Arial" Font-Bold="true" ForeColor="White" BackColor="#00CCFF"></EditItemStyle>
<AlternatingItemStyle Font-Size="10px" Font-Names="Arial" BackColor="White"></AlternatingItemStyle>
<headerStyle Font-Size="11px" Font-Names="Arial" Font-Bold="true" CssClass="LABELTEXTBOX" BackColor="Silver" Font-Underline="false"></headerStyle>
<Columns>
       <asp:BoundColumn DataField="inNumeroIni" ReadOnly="true" headerText="Número Inicial" SortExpression="inNumeroIni">
		<headerStyle HorizontalAlign="Right"></headerStyle>
		<ItemStyle HorizontalAlign="Right"></ItemStyle>
       </asp:BoundColumn>
       <asp:BoundColumn DataField="inNumeroFim" ReadOnly="true" headerText="Número Final" SortExpression="inNumeroFim">
		<headerStyle HorizontalAlign="Right"></headerStyle>
		<ItemStyle HorizontalAlign="Right"></ItemStyle>
       </asp:BoundColumn>
       <asp:BoundColumn DataField="dtPedido" ReadOnly="true" headerText="Data Operação" DataFormatString="{0:dd/MM/yyyy}" SortExpression="dtPedido">
		<headerStyle HorizontalAlign="Center"></headerStyle>
		<ItemStyle HorizontalAlign="Center"></ItemStyle>
   	</asp:BoundColumn>
       <asp:BoundColumn DataField="dtEntrega" ReadOnly="true" headerText="Data Entrega" DataFormatString="{0:dd/MM/yyyy}" SortExpression="dtEntrega">
		<headerStyle HorizontalAlign="Center"></headerStyle>
		<ItemStyle HorizontalAlign="Center"></ItemStyle>
       </asp:BoundColumn>
       <asp:BoundColumn DataField="stObs" ReadOnly="true" headerText="Observação" SortExpression="stObs">
		<headerStyle HorizontalAlign="Center"></headerStyle>
		<ItemStyle HorizontalAlign="Center"></ItemStyle>
       </asp:BoundColumn>
       <asp:ButtonColumn Text="<img SRC=images/bt_grid_edit.gif Border=0 alt='Alterar';" CommandName="Select">
		<headerStyle Width="20px"></headerStyle>
		<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
       </asp:ButtonColumn>
       <asp:ButtonColumn Text="<img SRC=images/bt_grid_del.gif Border=0 alt='Excluir' 
			onclick="return confirm('Tem certeza que deseja excluir?')" Width=19 Height=15>" CommandName="Delete">
       	<headerStyle Width="20px"></headerStyle>
		<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
       </asp:ButtonColumn>
</Columns>
<PagerStyle NextPageText="<img SRC=images/bt_grid_next_pg.gif Border=0  Width=19 Height=15>"
PrevPageText="<img SRC=images/bt_grid_prev_pg.gif Border=0  Width=19 Height=15>" HorizontalAlign="Center"></PagerStyle>
</asp:datagrid>

 

Ao clicar na coluna observação para fazer a ordenação ele apresenta a seguinte mensagem de erro: Conversion failed when converting datetime from character string.

 

Só que esse campo stobs não é datetime e sim string (e varchar no banco), os outros ordena normal..

No load da pagina eu chamo essa funçao BindBrowse que popula o grid

 

Código da página ficha.aspx.vb

Private Sub BindBrowse()
  grdBrowse.DataSource = CSClasse.Lista(ViewState("fichaSortExpr"))
  grdBrowse.DataBind()
  grdBrowse.SelectedIndex = -1

 

No SortCommand deveria ordenar mas quando eu clico no campo observação da essa mensagem de erro:

Protected Sub grdBrowse_SortCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles grdBrowse.SortCommand
Dim newSortExpr As String = e.SortExpression
ViewState("fichaSortExpr") = newSortExpr
BindBrowse()
End Sub

 

Código da CSClasse.vb, a função que chama a procedure que lista os campos no datagrid

Public Shared Function Lista(Optional ByVal order As String = "") As DataSet
Dim cnn As New SqlConnection()
cnn.ConnectionString = _stStringConexao
Dim cmd As New SqlCommand("st_procedure", cnn)
With cmd
.CommandText = "st_procedure"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@order", SqlDbType.VarChar).Value = order
End With
Dim adp As New SqlDataAdapter(cmd)
Dim sdr As New DataSet()
adp.Fill(sdr, "lista")
cnn.Close()
Return CType(sdr, DataSet)
End Function

 

Código da st_procedure que é chamada para popular os campos e fazer a ordenação:

ALTER procedure [dbo].[st_procedure]
(@order varchar(500) = null)
as begin
select inFichaId , stDescricao 	= 'de ' + convert(varchar, inNumeroIni) + ' à ' + convert(varchar, inNumeroFim), f.inNumeroIni, f.inNumeroFim ,dtPedido, dtEntrega, stObs from ficha where inAtivo= 1
order by
  case @order 
when 'inNumeroIni' then inNumeroIni
 when 'inNumeroFim' then inNumeroFim
when 'dtPedido' then dtPedido
when 'dtEntrega' then dtEntrega
  when 'stObs' then stObs
 else inFichaId
end 

 

Novamente conto com a ajuda de vocês

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa NOite

 

é bem provável que o problema esteja no fato do tipo de campo ser diferente, digo provável poi nunca tive esse problema, e ficaria dificil eu simular isso aqui agora, mas tentarei e posto o que aconteceu pois além de tudo sou muito curioso

 

Uma forma que você pode resolver isso, se o problema estiver no tipo de campo é você converter os campos do order by para nvarchar tb usando a função convert,

 

No caso da data você vai ter que converter para o formato yyyyMMddHHmmss que deixa a data ordena mesmo estando em string, pois se converter direto fica

 

todos os dias 01, depois todos os dias 02 e por aí vai assim

 

01/01

01/02

02/01

02/02

 

quando por ordem de data seria

01/01

02/01

01/02

02/02

 

tenta usar a procedure como abaixo , a mudança tá só no order by

 

ALTER procedure [dbo].[st_procedure]
(@order varchar(500) = null)
as begin
select inFichaId , stDescricao = 'de ' + convert(varchar, inNumeroIni) + ' à ' + convert(varchar, inNumeroFim), f.inNumeroIni, f.inNumeroFim ,dtPedido, dtEntrega, stObs from ficha where inAtivo= 1
order by
case @order 
when 'inNumeroIni' then inNumeroIni
when 'inNumeroFim' then inNumeroFim
	when 'dtPedido' then convert(nvarchar, dtPedido, 112)
when 'dtEntrega' then convert(nvarchar,dtEntrega, 112)
when 'stObs' then stObs
else inFichaId
end 

 

QQ coisa é só postar , se der certo ou errado

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa NOite

 

é bem provável que o problema esteja no fato do tipo de campo ser diferente, digo provável poi nunca tive esse problema, e ficaria dificil eu simular isso aqui agora, mas tentarei e posto o que aconteceu pois além de tudo sou muito curioso

 

Uma forma que você pode resolver isso, se o problema estiver no tipo de campo é você converter os campos do order by para nvarchar tb usando a função convert,

 

No caso da data você vai ter que converter para o formato yyyyMMddHHmmss que deixa a data ordena mesmo estando em string, pois se converter direto fica

 

todos os dias 01, depois todos os dias 02 e por aí vai assim

 

01/01

01/02

02/01

02/02

 

quando por ordem de data seria

01/01

02/01

01/02

02/02

 

tenta usar a procedure como abaixo , a mudança tá só no order by

 

ALTER procedure [dbo].[st_procedure]
(@order varchar(500) = null)
as begin
select inFichaId , stDescricao = 'de ' + convert(varchar, inNumeroIni) + ' à ' + convert(varchar, inNumeroFim), f.inNumeroIni, f.inNumeroFim ,dtPedido, dtEntrega, stObs from ficha where inAtivo= 1
order by
case @order 
when 'inNumeroIni' then inNumeroIni
when 'inNumeroFim' then inNumeroFim
when 'dtPedido' then convert(nvarchar, dtPedido, 112)
when 'dtEntrega' then convert(nvarchar,dtEntrega, 112)
when 'stObs' then stObs
else inFichaId
end 

 

QQ coisa é só postar , se der certo ou errado

 

Abraços

 

 

Só que por esses campos datetime ta ordenando, o problema esta ocorrendo com o campo stObs que é um varchar(500), por isso que estou achando estranho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não funcionou ???

 

não funcionou

os campos de data ta certo sao datetime mesmo e estao ordenando certo, o campo que nao ordena e da essa mensagem de erro é um campo tipo varchar que é o campo stOBS

 

tentei assim:

order by 
    	case @order 
   	when 'inNumeroIni' then inNumeroIni
   	when 'inNumeroFim' then inNumeroFim
   	when 'dtPedido' then dtPedido
   	when 'dtEntrega' then dtEntrega
   	when 'stObs' then convert(nvarchar,stObs)
  else inFichaId

 end 

 

mas nao funcionou, segue a estrutura da tabela, o campo que esta apresentando o problema é somente o destacado em vermelho.

tbficha.jpg

 

Obrigada pela ajuda q tem dado, aguardo resposta

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

o convert que eu coloquei foi nos campos datetime para transformar eles em nvarchar

 

tenta colocar um try..catch para pegar a mensagem de erro que o sql retorna...

 

 

o erro que da no sql é exatamente o titulo do post: "Conversion failed when converting datetime from character string."

quando passo para o parametro @order o valor 'stOBS'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá cintiadel, acho que temos uma solução

 

Simulei o erro em uma base SQL Server 2005, minha base da NF eletrônica

 

usei esse sql abaixo inicialmente

 

nessa tabela tenho

 

demi - datetime

dsaient - datetime

qvol - int

cancelar - int

natop - nvarchar

 


declare @ordem nvarchar(30)

set @ordem = 'natop'

select * from bdnfe2.nfe.nfeide order by 
case @ordem
when 'demi' then demi
when 'dsaient' then dsaient
when 'qvol' then qvol
when 'natop' then natop
when 'cancelar' then cancelar end

 

o erro ocorre na mesma situação que a sua, quando classifico pelo campo texto (nvarchar)

 

Msg 241, Level 16, State 1, Line 7
Conversion failed when converting datetime from character string.

 

dai fiz a modificação inicial que eu havia proposto e deu erro novamente

 

deu o erro de conversão do tipo novamente mas com uma mensagem diferente

 

declare @ordem nvarchar(30)

set @ordem = 'natop'

select * from bdnfe2.nfe.nfeide order by 
case @ordem
when 'natop' then natop
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then qvol
when 'cancelar' then cancelar end

 

Msg 245, Level 16, State 1, Line 7
Conversion failed when converting the nvarchar value 'Retorno de mercadoria depositada em depósito fechado ou arma' to data type int.

 

Daí resolvei fazer a conversão explicita de todos os campo para nvarchar assim

 

declare @ordem nvarchar(30)

set @ordem = 'natop'

select * from bdnfe2.nfe.nfeide order by 
case @ordem
when 'natop' then convert(nvarchar, natop)
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then convert(nvarchar,qvol)
when 'cancelar' then convert(nvarchar,cancelar) end

 

e deu certo, ou seja, aparentemente o problema está em usar tipos diferente no order by..

 

aí você me pergunta, mas por que só dá no varchar?? eu te respondo, boa pergunta que eu vou pesquisar na biblioteca do msdn, quando eu tiver tempo, e posto aqui, ou no blog que estou tentando montar faz meses mas meu projeto de nota fiscal eletrônica não deixa, kkkk, onde eu postar vou avisar

 

em resumo , a solução é você fazer a converção explicita de todos os campos para um tipo único..

 

se liga que quando converter o tipo datetime, a função fica diferente ok

 

se der certo avisa

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá cintiadel, acho que temos uma solução

 

Simulei o erro em uma base SQL Server 2005, minha base da NF eletrônica

 

usei esse sql abaixo inicialmente

 

nessa tabela tenho

 

demi - datetime

dsaient - datetime

qvol - int

cancelar - int

natop - nvarchar

 


declare @ordem nvarchar(30)

set @ordem = 'natop'

select * from bdnfe2.nfe.nfeide order by 
case @ordem
when 'demi' then demi
when 'dsaient' then dsaient
when 'qvol' then qvol
when 'natop' then natop
when 'cancelar' then cancelar end

 

o erro ocorre na mesma situação que a sua, quando classifico pelo campo texto (nvarchar)

 

Msg 241, Level 16, State 1, Line 7
Conversion failed when converting datetime from character string.

 

dai fiz a modificação inicial que eu havia proposto e deu erro novamente

 

deu o erro de conversão do tipo novamente mas com uma mensagem diferente

 

declare @ordem nvarchar(30)

set @ordem = 'natop'

select * from bdnfe2.nfe.nfeide order by 
case @ordem
when 'natop' then natop
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then qvol
when 'cancelar' then cancelar end

 

Msg 245, Level 16, State 1, Line 7
Conversion failed when converting the nvarchar value 'Retorno de mercadoria depositada em depósito fechado ou arma' to data type int.

 

Daí resolvei fazer a conversão explicita de todos os campo para nvarchar assim

 

declare @ordem nvarchar(30)

set @ordem = 'natop'

select * from bdnfe2.nfe.nfeide order by 
case @ordem
when 'natop' then convert(nvarchar, natop)
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then convert(nvarchar,qvol)
when 'cancelar' then convert(nvarchar,cancelar) end

 

e deu certo, ou seja, aparentemente o problema está em usar tipos diferente no order by..

 

aí você me pergunta, mas por que só dá no varchar?? eu te respondo, boa pergunta que eu vou pesquisar na biblioteca do msdn, quando eu tiver tempo, e posto aqui, ou no blog que estou tentando montar faz meses mas meu projeto de nota fiscal eletrônica não deixa, kkkk, onde eu postar vou avisar

 

em resumo , a solução é você fazer a converção explicita de todos os campos para um tipo único..

 

se liga que quando converter o tipo datetime, a função fica diferente ok

 

se der certo avisa

 

Abraços

 

Até funcionou embora eu não entenda pq como você disse...rsrs

Mas olha como ficou a ordenação pelo inNumeroID (campos do tipo int)

 

ordenacaopornumero.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso era esperado, até comentei em um post anterior

 

é que a classificação é diferente do números quando se trata de um string, ou como número, no seu cao apesar de 140000 ser maior que 16100, como string ele vem antes..

 

o que fiz uma vez pra contornar esse tipo de problema...

 

no vba tinha uma função chamada string, que repetia uma string, um determinado número de vezes, ela ajuda muito com essa questão de zeros no inicio como 00150, que em int fica 150.

 

fiz uma function pro sql server que faz isso

 

 

ALTER function [dbo].[sTRING] ( @texto char(1), @caracteres int) returns varchar(8000)
begin


declare @contador int
declare @novotexto varchar(8000)


set @contador = 0
set @novotexto = ''

while @contador < @caracteres
begin
	set @novotexto = @novotexto + @texto 
	set @contador = @contador + 1
end

return @novotexto

end

 

falta tratar algumas coisas nela principalmente reacionadas à erros

 

ela no caso funciona assim

 

select dbo.string 5, 'a'

 

retorna - aaaaa

 

a sua sql ia ficar meio louca, mas acho que resolveria o problema da classificação, antes de uma solução mais elaborada...

 

você teria que colocar zeros na frente do número para deixá-los com o mesmo número de caracteres

 

tem tratar pra deixar assim que aí

 

0000140000

0000016100

0000016416

0000300000

0000050000

 

olha só enquanto eu postava surgiu uma situação no trabalho, à tarde posto como ficaria o sql completo vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

no vb possuii a função format que faria esse trabalho "sujo", mas não achei no sql server algo semelhante..

 

mas dando uma pesquisada, achi um tutorial aqui do imasters que aparentemente resolve seu problema nesse link

 

Espero que ajude e desculpe a demora

 

Se der certo ou errado é só postar

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.