PROBLEMA AO SALVAR EM BANCO DE DADOS.
Boa noite, tenho um formulário que se preencher todos os campos ele salva no banco de dados, porém, se algum campo do tipo Hora ficar sem preencher ele não salva.
Abaixo segue os dados. Poderiam me ajudar?
Tenho uma tabela:
IdPonto – Int
Funcionario – Nvarchar
Data – Date
HoraEntrada – Time
HoraSaidaAlmoco – Time
HoraEntradaAlmoco – Time
HoraSaida – Time
Todos estão marcados como Allow Nulls, menos a chave que é o IdPonto, ou seja, somente a chave é obrigatória.
Tenho um formulário que se preencher todos os campos ao clicar no botão salvar ele salva, porém, se deixar um campo de hora sem preencher ele não aceita, segue o código do botão salvar:
A mensagem de erro é: Falha ao converter valor de parâmetro de String em TimeSpan.
Conectar()
Dim conn As New SqlConnection(strCon)
[ô]O CodProduto e o @CodProduto foram inseridos porque o banco não está inserindo automaticamente o código
[ô]O código está sendo inserido automaticamente através do usuário.
[ô]Caso o auto incremento do banco de dados for ativado, tem que tirar os valores do CodProduto de todo o código abaixo
Dim SQL As String = [Ô]INSERT INTO TblPonto (IdPonto, funcionario, Data, HoraEntrada, HoraSaidaAlmoco, HoraEntradaAlmoco,[Ô] _
& [Ô]HoraSaida) VALUES (@IdPonto, @funcionario, @Data, @HoraEntrada, @HoraSaidaAlmoco, @HoraEntradaAlmoco,[Ô] _
& [Ô]@HoraSaida)[Ô]
Dim cmd As New SqlCommand(SQL, conn)
Dim sqlcod As String = [Ô]Select ISNULL(Max(IdPonto),0)+1 From TblPonto[Ô]
Dim sqlcmdcod As New SqlCommand(sqlcod, conn)
conn.Open()
TxtIdPonto.Text = sqlcmdcod.ExecuteScalar().ToString()
conn.Close()
cmd.Parameters.Add([Ô]@IdPonto[Ô], SqlDbType.Int)
cmd.Parameters.Add([Ô]@funcionario[Ô], SqlDbType.NVarChar)
cmd.Parameters.Add([Ô]@Data[Ô], SqlDbType.Date)
cmd.Parameters.Add([Ô]@HoraEntrada[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaidaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraEntradaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaida[Ô], SqlDbType.Time)
cmd.Parameters([Ô]@IdPonto[Ô]).Value = TxtIdPonto.Text
cmd.Parameters([Ô]@funcionario[Ô]).Value = CboxFuncionario.Text
cmd.Parameters([Ô]@Data[Ô]).Value = DtpData.Text
cmd.Parameters([Ô]@HoraEntrada[Ô]).Value = MskHoraEntrada.Text.ToString
cmd.Parameters([Ô]@HoraSaidaAlmoco[Ô]).Value = MskSaidaAlmoco.Text.ToString
cmd.Parameters([Ô]@HoraEntradaAlmoco[Ô]).Value = MskRetornoAlmoco.Text.ToString
cmd.Parameters([Ô]@HoraSaida[Ô]).Value = MskSaida.Text.ToString
Try
conn.Open()
cmd.ExecuteNonQuery()
Carrega_DataGridView()
MessageBox.Show([Ô]Os dados foram salvos com sucesso![Ô])
DesativaDataGridView()
TxtPesquisa.Enabled = True
HabilitaBotoes()
BtnSalvar.Enabled = False
Catch ex As Exception
MessageBox.Show([Ô]Verifique se há campos obrigatórios sem preenchimento. Caso contrário, ocorreu um erro no banco de dados. Favor contatar o administrador![Ô])
BtnNovo.Enabled = True
Finally
conn.Close()
End Try
End If
Grato.
Abaixo segue os dados. Poderiam me ajudar?
Tenho uma tabela:
IdPonto – Int
Funcionario – Nvarchar
Data – Date
HoraEntrada – Time
HoraSaidaAlmoco – Time
HoraEntradaAlmoco – Time
HoraSaida – Time
Todos estão marcados como Allow Nulls, menos a chave que é o IdPonto, ou seja, somente a chave é obrigatória.
Tenho um formulário que se preencher todos os campos ao clicar no botão salvar ele salva, porém, se deixar um campo de hora sem preencher ele não aceita, segue o código do botão salvar:
A mensagem de erro é: Falha ao converter valor de parâmetro de String em TimeSpan.
Conectar()
Dim conn As New SqlConnection(strCon)
[ô]O CodProduto e o @CodProduto foram inseridos porque o banco não está inserindo automaticamente o código
[ô]O código está sendo inserido automaticamente através do usuário.
[ô]Caso o auto incremento do banco de dados for ativado, tem que tirar os valores do CodProduto de todo o código abaixo
Dim SQL As String = [Ô]INSERT INTO TblPonto (IdPonto, funcionario, Data, HoraEntrada, HoraSaidaAlmoco, HoraEntradaAlmoco,[Ô] _
& [Ô]HoraSaida) VALUES (@IdPonto, @funcionario, @Data, @HoraEntrada, @HoraSaidaAlmoco, @HoraEntradaAlmoco,[Ô] _
& [Ô]@HoraSaida)[Ô]
Dim cmd As New SqlCommand(SQL, conn)
Dim sqlcod As String = [Ô]Select ISNULL(Max(IdPonto),0)+1 From TblPonto[Ô]
Dim sqlcmdcod As New SqlCommand(sqlcod, conn)
conn.Open()
TxtIdPonto.Text = sqlcmdcod.ExecuteScalar().ToString()
conn.Close()
cmd.Parameters.Add([Ô]@IdPonto[Ô], SqlDbType.Int)
cmd.Parameters.Add([Ô]@funcionario[Ô], SqlDbType.NVarChar)
cmd.Parameters.Add([Ô]@Data[Ô], SqlDbType.Date)
cmd.Parameters.Add([Ô]@HoraEntrada[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaidaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraEntradaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaida[Ô], SqlDbType.Time)
cmd.Parameters([Ô]@IdPonto[Ô]).Value = TxtIdPonto.Text
cmd.Parameters([Ô]@funcionario[Ô]).Value = CboxFuncionario.Text
cmd.Parameters([Ô]@Data[Ô]).Value = DtpData.Text
cmd.Parameters([Ô]@HoraEntrada[Ô]).Value = MskHoraEntrada.Text.ToString
cmd.Parameters([Ô]@HoraSaidaAlmoco[Ô]).Value = MskSaidaAlmoco.Text.ToString
cmd.Parameters([Ô]@HoraEntradaAlmoco[Ô]).Value = MskRetornoAlmoco.Text.ToString
cmd.Parameters([Ô]@HoraSaida[Ô]).Value = MskSaida.Text.ToString
Try
conn.Open()
cmd.ExecuteNonQuery()
Carrega_DataGridView()
MessageBox.Show([Ô]Os dados foram salvos com sucesso![Ô])
DesativaDataGridView()
TxtPesquisa.Enabled = True
HabilitaBotoes()
BtnSalvar.Enabled = False
Catch ex As Exception
MessageBox.Show([Ô]Verifique se há campos obrigatórios sem preenchimento. Caso contrário, ocorreu um erro no banco de dados. Favor contatar o administrador![Ô])
BtnNovo.Enabled = True
Finally
conn.Close()
End Try
End If
Grato.
aconselho, que quando criar uma tabela na base de dados, ponha tudo como texto..
assim nao irá dar erros!
assim nao irá dar erros!
Aconselho a, no formulário, impedir que o usuário grave alguma coisa sem colocar a data
ou se ele não colocar a data, pergunte-o se ele quer salvar com a data atual ou colocar uma data nova.
ou se ele não colocar a data, pergunte-o se ele quer salvar com a data atual ou colocar uma data nova.
você poderia fazer assim:
cmd.Parameters([Ô]@Data[Ô]).Value = IIf(Not IsDate (DtpData.Text), [Ô]NULL[Ô], DtpData.Text)
cmd.Parameters([Ô]@HoraEntrada[Ô]).Value = IIf(Not IsDate (MskHoraEntrada.Text.ToString), [Ô]NULL[Ô], MskHoraEntrada.Text.ToString)
cmd.Parameters([Ô]@HoraSaidaAlmoco[Ô]).Value = IIf(Not IsDate ( MskSaidaAlmoco.Text.ToString), [Ô]NULL[Ô], MskSaidaAlmoco.Text.ToString)
cmd.Parameters([Ô]@HoraEntradaAlmoco[Ô]).Value = IIf(Not IsDate (MskRetornoAlmoco.Text.ToString), [Ô]NULL[Ô], MskRetornoAlmoco.Text.ToString)
cmd.Parameters([Ô]@HoraSaida[Ô]).Value = IIf(Not IsDate ( MskSaida.Text.ToString), [Ô]NULL[Ô], MskSaida.Text.ToString)
cmd.Parameters([Ô]@Data[Ô]).Value = IIf(Not IsDate (DtpData.Text), [Ô]NULL[Ô], DtpData.Text)
cmd.Parameters([Ô]@HoraEntrada[Ô]).Value = IIf(Not IsDate (MskHoraEntrada.Text.ToString), [Ô]NULL[Ô], MskHoraEntrada.Text.ToString)
cmd.Parameters([Ô]@HoraSaidaAlmoco[Ô]).Value = IIf(Not IsDate ( MskSaidaAlmoco.Text.ToString), [Ô]NULL[Ô], MskSaidaAlmoco.Text.ToString)
cmd.Parameters([Ô]@HoraEntradaAlmoco[Ô]).Value = IIf(Not IsDate (MskRetornoAlmoco.Text.ToString), [Ô]NULL[Ô], MskRetornoAlmoco.Text.ToString)
cmd.Parameters([Ô]@HoraSaida[Ô]).Value = IIf(Not IsDate ( MskSaida.Text.ToString), [Ô]NULL[Ô], MskSaida.Text.ToString)
Pessoal obrigado pela ajuda.
Killer tentei com o código acima e deu o mesmo erro, mas, consegui resolver, segue solução (mesmo que não seja a melhor, mas...) e se alguém souber como melhorar por favor fique a vontade para contibuir.
Segue código se alguém estiver com o mesmo problema e novamente obrigado a todos.
Criei uma Private sub:
Private Sub ConversaoHoras()
Dim HoraEntrada As TimeSpan
Dim SaidaAlmoco As TimeSpan
Dim RetornoAlmoco As TimeSpan
Dim Saida As TimeSpan
MskHoraEntrada.Text = HoraEntrada.ToString
MskSaidaAlmoco.Text = SaidaAlmoco.ToString
MskRetornoAlmoco.Text = RetornoAlmoco.ToString
MskSaida.Text = Saida.ToString
End Sub
E a chamei no código da inserção dos registros:
ConversaoHoras()
Conectar()
Dim conn As New SqlConnection(strCon)
Dim SQL As String = [Ô]INSERT INTO TblPonto (IdPonto, funcionario, Data, HoraEntrada, HoraSaidaAlmoco, HoraEntradaAlmoco,[Ô] _
& [Ô]HoraSaida) VALUES (@IdPonto, @funcionario, @Data, @HoraEntrada, @HoraSaidaAlmoco, @HoraEntradaAlmoco,[Ô] _
& [Ô]@HoraSaida)[Ô]
Dim cmd As New SqlCommand(SQL, conn)
[ô]Esse código salva o código do registro somente quando clicar no botão salvas.
[ô]Nesse caso ele busca o último numero e salva. Evitando conflitos com outros usuários.
Dim sqlcod As String = [Ô]Select ISNULL(Max(IdPonto),0)+1 From TblPonto[Ô]
Dim sqlcmdcod As New SqlCommand(sqlcod, conn)
conn.Open()
TxtIdPonto.Text = sqlcmdcod.ExecuteScalar().ToString()
conn.Close()
cmd.Parameters.Add([Ô]@IdPonto[Ô], SqlDbType.Int)
cmd.Parameters.Add([Ô]@funcionario[Ô], SqlDbType.NVarChar)
cmd.Parameters.Add([Ô]@Data[Ô], SqlDbType.Date)
cmd.Parameters.Add([Ô]@HoraEntrada[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaidaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraEntradaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaida[Ô], SqlDbType.Time)
cmd.Parameters([Ô]@IdPonto[Ô]).Value = TxtIdPonto.Text
cmd.Parameters([Ô]@funcionario[Ô]).Value = CboxFuncionario.Text
cmd.Parameters([Ô]@Data[Ô]).Value = DtpData.Text
cmd.Parameters([Ô]@HoraEntrada[Ô]).Value = MskHoraEntrada.Text
cmd.Parameters([Ô]@HoraSaidaAlmoco[Ô]).Value = MskSaidaAlmoco.Text
cmd.Parameters([Ô]@HoraEntradaAlmoco[Ô]).Value = MskRetornoAlmoco.Text
cmd.Parameters([Ô]@HoraSaida[Ô]).Value = MskSaida.Text
Try
conn.Open()
cmd.ExecuteNonQuery()
Carrega_DataGridView() [ô]Preenche o DataGridView
MessageBox.Show([Ô]Os dados foram salvos com sucesso![Ô])
DesativaDataGridView()
TxtPesquisa.Enabled = True
HabilitaBotoes()
BtnSalvar.Enabled = False
Catch ex As Exception
MessageBox.Show(ex.Message)
BtnNovo.Enabled = True
Finally
conn.Close()
End Try
Killer tentei com o código acima e deu o mesmo erro, mas, consegui resolver, segue solução (mesmo que não seja a melhor, mas...) e se alguém souber como melhorar por favor fique a vontade para contibuir.
Segue código se alguém estiver com o mesmo problema e novamente obrigado a todos.
Criei uma Private sub:
Private Sub ConversaoHoras()
Dim HoraEntrada As TimeSpan
Dim SaidaAlmoco As TimeSpan
Dim RetornoAlmoco As TimeSpan
Dim Saida As TimeSpan
MskHoraEntrada.Text = HoraEntrada.ToString
MskSaidaAlmoco.Text = SaidaAlmoco.ToString
MskRetornoAlmoco.Text = RetornoAlmoco.ToString
MskSaida.Text = Saida.ToString
End Sub
E a chamei no código da inserção dos registros:
ConversaoHoras()
Conectar()
Dim conn As New SqlConnection(strCon)
Dim SQL As String = [Ô]INSERT INTO TblPonto (IdPonto, funcionario, Data, HoraEntrada, HoraSaidaAlmoco, HoraEntradaAlmoco,[Ô] _
& [Ô]HoraSaida) VALUES (@IdPonto, @funcionario, @Data, @HoraEntrada, @HoraSaidaAlmoco, @HoraEntradaAlmoco,[Ô] _
& [Ô]@HoraSaida)[Ô]
Dim cmd As New SqlCommand(SQL, conn)
[ô]Esse código salva o código do registro somente quando clicar no botão salvas.
[ô]Nesse caso ele busca o último numero e salva. Evitando conflitos com outros usuários.
Dim sqlcod As String = [Ô]Select ISNULL(Max(IdPonto),0)+1 From TblPonto[Ô]
Dim sqlcmdcod As New SqlCommand(sqlcod, conn)
conn.Open()
TxtIdPonto.Text = sqlcmdcod.ExecuteScalar().ToString()
conn.Close()
cmd.Parameters.Add([Ô]@IdPonto[Ô], SqlDbType.Int)
cmd.Parameters.Add([Ô]@funcionario[Ô], SqlDbType.NVarChar)
cmd.Parameters.Add([Ô]@Data[Ô], SqlDbType.Date)
cmd.Parameters.Add([Ô]@HoraEntrada[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaidaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraEntradaAlmoco[Ô], SqlDbType.Time)
cmd.Parameters.Add([Ô]@HoraSaida[Ô], SqlDbType.Time)
cmd.Parameters([Ô]@IdPonto[Ô]).Value = TxtIdPonto.Text
cmd.Parameters([Ô]@funcionario[Ô]).Value = CboxFuncionario.Text
cmd.Parameters([Ô]@Data[Ô]).Value = DtpData.Text
cmd.Parameters([Ô]@HoraEntrada[Ô]).Value = MskHoraEntrada.Text
cmd.Parameters([Ô]@HoraSaidaAlmoco[Ô]).Value = MskSaidaAlmoco.Text
cmd.Parameters([Ô]@HoraEntradaAlmoco[Ô]).Value = MskRetornoAlmoco.Text
cmd.Parameters([Ô]@HoraSaida[Ô]).Value = MskSaida.Text
Try
conn.Open()
cmd.ExecuteNonQuery()
Carrega_DataGridView() [ô]Preenche o DataGridView
MessageBox.Show([Ô]Os dados foram salvos com sucesso![Ô])
DesativaDataGridView()
TxtPesquisa.Enabled = True
HabilitaBotoes()
BtnSalvar.Enabled = False
Catch ex As Exception
MessageBox.Show(ex.Message)
BtnNovo.Enabled = True
Finally
conn.Close()
End Try
Tópico encerrado , respostas não são mais permitidas