PROBLEMA AO SALVAR EM BANCO DE DADOS.

CLAUDIOD 29/06/2011 01:27:36
#377991
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.
ANAMOREIRA 29/06/2011 05:33:07
#377993
aconselho, que quando criar uma tabela na base de dados, ponha tudo como texto..
assim nao irá dar erros!
PEGUDO 29/06/2011 10:24:47
#378010
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.
KILLER 29/06/2011 13:29:27
#378032
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)
CLAUDIOD 29/06/2011 18:16:10
#378061
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

Tópico encerrado , respostas não são mais permitidas