SALVAR CAMPO VAZIO DE LISTVIEW COMO NULO

SANROMAN 31/05/2015 18:52:43
#447228
Boa noite,

Estou tentando salvar valores de um listview com valores nulos e não estou conseguindo.

Se todos as colunas do listview estão preenchidas salva normalmente. mas se as colunas estão vazias não.

Estou usando o seguinte código para salvar a listview:

[code vbnet] If listProdComanda.Items(i).SubItems(1).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = listProdComanda.Items(i).SubItems(1).Text
End If
If listProdComanda.Items(i).SubItems(2).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(2).Text
End If
If listProdComanda.Items(i).SubItems(3).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = listProdComanda.Items(i).SubItems(3).Text
End If
If listProdComanda.Items(i).SubItems(4).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(4).Text
End If [/code}

Fico no aguardo e desde já agradeço.
JABA 31/05/2015 19:24:25
#447229
Qual erro é gerado?
SANROMAN 31/05/2015 19:46:38
#447230
Boa noite JABA

Se as colunas estão vazias não da erro nenhum e não salva nenhum dado no banco de dados

Se esta com todas as colunas do listview com valores salva corretamente no banco de dados.

Até mais e tomara que possa me ajudar
JABA 31/05/2015 22:09:56
#447235
Eu acho que está dando um erro e ele não está aparecendo na tela por causa de um tratamento que você não está fazendo. Faça o seguinte: Use o depurador, linha por linha, até o encerramento da rotina e veja se gera um erro. Qualquer coisa posta aí o que aconteceu.
SANROMAN 01/06/2015 09:38:43
#447244
Bom dia, JABA

Acho que o erro está no for que uso para inserir dados no banco de dados, dá uma olhada:

[code vbnet]
Private Sub inserirComanda()

Try
sqlCon.Open()

With sqlCmd
.CommandType = CommandType.Text
.CommandText = [Ô][Ô]
.CommandText = [Ô]INSERT INTO TB_VendaComanda (DataVenda, NumVenda, ComandaNum, CodFunc, Atendente, HoraEnt, HoraSaida, Ocupantes, [Ô] & _
[Ô]Valor, Credito, Qtde, CodProd, Produto, PrecoUnitario, NomeCliente, CPF, CodCliente)[Ô] & _
[Ô]VALUES (@DataVenda, @NumVenda, @ComandaNum, @CodFunc, @Atendente, @HoraEnt, @HoraSaida, @Ocupantes, @Valor, [Ô] & _
[Ô]@Credito, @Qtde, @CodProd, @Produto, @PrecoUnitario, @NomeCliente, @CPF, @CodCliente)[Ô]

For i As Integer = 0 To listProdComanda.Items.Count - 1

.Connection = sqlCon

If listProdComanda.Items(i).SubItems(0).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@CodProd[Ô], SqlDbType.Int)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@CodProd[Ô], SqlDbType.Int)).Value = listProdComanda.Items(i).SubItems(0).Text
End If
If listProdComanda.Items(i).SubItems(1).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = listProdComanda.Items(i).SubItems(1).Text
End If
If listProdComanda.Items(i).SubItems(2).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(2).Text
End If
If listProdComanda.Items(i).SubItems(3).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = listProdComanda.Items(i).SubItems(3).Text
End If
If listProdComanda.Items(i).SubItems(4).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(4).Text
End If
.Parameters.Add(New SqlParameter([Ô]@DataVenda[Ô], SqlDbType.Date)).Value = txtDataVendaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NumVenda[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@ComandaNum[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodFunc[Ô], SqlDbType.Int)).Value = txtCodFuncComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Atendente[Ô], SqlDbType.NVarChar)).Value = txtAtendenteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraEnt[Ô], SqlDbType.Time)).Value = txtHoraEntComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraSaida[Ô], SqlDbType.Time)).Value = txtHoraSaidaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Ocupantes[Ô], SqlDbType.NVarChar)).Value = txtOcupantesComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Credito[Ô], SqlDbType.Decimal)).Value = txtCreditoComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NomeCliente[Ô], SqlDbType.NVarChar)).Value = txtNomeClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CPF[Ô], SqlDbType.NVarChar)).Value = txtCPFClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodCliente[Ô], SqlDbType.Int)).Value = txtCodClienteComanda.Text

sqlCmd.ExecuteNonQuery()
.Parameters.Clear()

Next
End With

Catch ex As Exception
MsgBox(ex.ToString)
Finally
sqlCmd.Parameters.Clear()
sqlCon.Close()
End Try

End Sub [/code]

Será que devo separa em duas tabelas diferentes no banco de dados?

Até mais.

OMAR2011 01/06/2015 11:17:12
#447248
[txt-color=#e80000] For i As Integer = 0 To listProdComanda.Items.Count - 1[/txt-color]

.Connection = sqlCon

If listProdComanda.Items(i).SubItems(0).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@CodProd[Ô], SqlDbType.Int)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@CodProd[Ô], SqlDbType.Int)).Value = listProdComanda.Items(i).SubItems(0).Text
End If
If listProdComanda.Items(i).SubItems(1).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = listProdComanda.Items(i).SubItems(1).Text
End If
If listProdComanda.Items(i).SubItems(2).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(2).Text
End If
If listProdComanda.Items(i).SubItems(3).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = listProdComanda.Items(i).SubItems(3).Text
End If
If listProdComanda.Items(i).SubItems(4).Text = [Ô][Ô] Then
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = DBNull.Value
Else
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(4).Text
End If
[txt-color=#e80000]Parameters.Add(New SqlParameter([Ô]@DataVenda[Ô], SqlDbType.Date)).Value = txtDataVendaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NumVenda[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@ComandaNum[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodFunc[Ô], SqlDbType.Int)).Value = txtCodFuncComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Atendente[Ô], SqlDbType.NVarChar)).Value = txtAtendenteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraEnt[Ô], SqlDbType.Time)).Value = txtHoraEntComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraSaida[Ô], SqlDbType.Time)).Value = txtHoraSaidaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Ocupantes[Ô], SqlDbType.NVarChar)).Value = txtOcupantesComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Credito[Ô], SqlDbType.Decimal)).Value = txtCreditoComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NomeCliente[Ô], SqlDbType.NVarChar)).Value = txtNomeClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CPF[Ô], SqlDbType.NVarChar)).Value = txtCPFClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodCliente[Ô], SqlDbType.Int)).Value = txtCodClienteComanda.Text[/txt-color]

sqlCmd.ExecuteNonQuery()
.Parameters.Clear()

Next
Não condiz com um Listview com caixa de texto.Quando se tem uma linha fica normal,mas quando tem mais de uma vai repetir várias vezes o mesmo valor do textbox.
SANROMAN 01/06/2015 11:42:51
#447250
Bom dia OMAR

As caixa de texto não estão no listview fazem parte do formulário.
SANROMAN 01/06/2015 11:48:12
#447251
Bom dia JABA

Consegui salvar no balco de dados como nulo com o seguinte código:

[code vbnet] Private Sub inserirComanda()

Try
sqlCon.Open()

With sqlCmd
.CommandType = CommandType.Text
.CommandText = [Ô][Ô]
.CommandText = [Ô]INSERT INTO TB_VendaComanda (DataVenda, NumVenda, ComandaNum, CodFunc, Atendente, HoraEnt, HoraSaida, Ocupantes, [Ô] & _
[Ô]Valor, Credito, Qtde, CodProd, Produto, PrecoUnitario, NomeCliente, CPF, CodCliente)[Ô] & _
[Ô]VALUES (@DataVenda, @NumVenda, @ComandaNum, @CodFunc, @Atendente, @HoraEnt, @HoraSaida, @Ocupantes, @Valor, [Ô] & _
[Ô]@Credito, @Qtde, @CodProd, @Produto, @PrecoUnitario, @NomeCliente, @CPF, @CodCliente)[Ô]

.Connection = sqlCon

If listProdComanda.Items.Count = 0 Then
.Parameters.Add(New SqlParameter([Ô]@CodProd[Ô], SqlDbType.Int)).Value = DBNull.Value
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = DBNull.Value
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = DBNull.Value
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = DBNull.Value
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = DBNull.Value
.Parameters.Add(New SqlParameter([Ô]@DataVenda[Ô], SqlDbType.Date)).Value = txtDataVendaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NumVenda[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@ComandaNum[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodFunc[Ô], SqlDbType.Int)).Value = txtCodFuncComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Atendente[Ô], SqlDbType.NVarChar)).Value = txtAtendenteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraEnt[Ô], SqlDbType.Time)).Value = txtHoraEntComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraSaida[Ô], SqlDbType.Time)).Value = txtHoraSaidaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Ocupantes[Ô], SqlDbType.NVarChar)).Value = txtOcupantesComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Credito[Ô], SqlDbType.Decimal)).Value = txtCreditoComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NomeCliente[Ô], SqlDbType.NVarChar)).Value = txtNomeClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CPF[Ô], SqlDbType.NVarChar)).Value = txtCPFClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodCliente[Ô], SqlDbType.Int)).Value = txtCodClienteComanda.Text

sqlCmd.ExecuteNonQuery()
.Parameters.Clear()
Else
For i As Integer = 0 To listProdComanda.Items.Count - 1
.Parameters.Add(New SqlParameter([Ô]@CodProd[Ô], SqlDbType.Int)).Value = listProdComanda.Items(i).SubItems(0).Text
.Parameters.Add(New SqlParameter([Ô]@Produto[Ô], SqlDbType.NVarChar)).Value = listProdComanda.Items(i).SubItems(1).Text
.Parameters.Add(New SqlParameter([Ô]@PrecoUnitario[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(2).Text
.Parameters.Add(New SqlParameter([Ô]@Qtde[Ô], SqlDbType.Int)).Value = listProdComanda.Items(i).SubItems(3).Text
.Parameters.Add(New SqlParameter([Ô]@Valor[Ô], SqlDbType.Decimal)).Value = listProdComanda.Items(i).SubItems(4).Text
.Parameters.Add(New SqlParameter([Ô]@DataVenda[Ô], SqlDbType.Date)).Value = txtDataVendaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NumVenda[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@ComandaNum[Ô], SqlDbType.NVarChar)).Value = txtNumComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodFunc[Ô], SqlDbType.Int)).Value = txtCodFuncComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Atendente[Ô], SqlDbType.NVarChar)).Value = txtAtendenteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraEnt[Ô], SqlDbType.Time)).Value = txtHoraEntComanda.Text
.Parameters.Add(New SqlParameter([Ô]@HoraSaida[Ô], SqlDbType.Time)).Value = txtHoraSaidaComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Ocupantes[Ô], SqlDbType.NVarChar)).Value = txtOcupantesComanda.Text
.Parameters.Add(New SqlParameter([Ô]@Credito[Ô], SqlDbType.Decimal)).Value = txtCreditoComanda.Text
.Parameters.Add(New SqlParameter([Ô]@NomeCliente[Ô], SqlDbType.NVarChar)).Value = txtNomeClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CPF[Ô], SqlDbType.NVarChar)).Value = txtCPFClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CodCliente[Ô], SqlDbType.Int)).Value = txtCodClienteComanda.Text

sqlCmd.ExecuteNonQuery()
.Parameters.Clear()
Next
End If
End With

Catch ex As Exception
MsgBox(ex.ToString)
Finally
sqlCmd.Parameters.Clear()
sqlCon.Close()
End Try

End Sub [/code]

Não sei se esta correto programar dessa maneira, mas funcionou.

OMAR2011 01/06/2015 12:44:50
#447254
Diante disto entendi sua intenção.
Mas vai repetir várias vezes sem necessidade nenhuma.
Se não me engano tem que fazer parte de outra tabela.
[txt-color=#e80000].Parameters.Add(New SqlParameter([Ô]@NomeCliente[Ô], SqlDbType.NVarChar)).Value = txtNomeClienteComanda.Text
.Parameters.Add(New SqlParameter([Ô]@CPF[Ô], SqlDbType.NVarChar)).Value = txtCPFClienteComanda.Text
[/txt-color]
SANROMAN 01/06/2015 13:13:37
#447255
Boa tarde OMAR2011

Realmente do jeito que esta montado o insert repete desnecessariamente os campos textos. Vou pesquisar para ver se acho uma solução para isso.

Acho que vc reparou que consegui salvar no banco de dados os valores do listview como nulos. Só que isso me acarretou outro problema.
Para recuperar os dados uso o seguinte código.

[code vbnet] Private Sub VendaComanda()

Dim sqlCon As New SqlConnection(strCmd)
Dim strSql As String = [Ô]SELECT CodProd, Produto, PrecoUnitario, Qtde, Valor, DataVenda, ComandaNum, CodFunc, Atendente, HoraEnt, HoraSaida, Ocupantes, Credito, NomeCliente, CPF, CodCliente [Ô] & _
[Ô]FROM TB_VendaComanda [Ô] & _
[Ô]WHERE ComandaNum = [ô][Ô] & txtNumComanda.Text & [Ô][ô][Ô]

Dim sqlCmd As New SqlCommand(strSql, sqlCon)
Dim dr As SqlDataReader
listProdComanda.Items.Clear()

sqlCmd.Connection.Open()
dr = sqlCmd.ExecuteReader

While dr.Read

Dim lvItem As New ListViewItem(New String() {dr.GetValue(0).ToString, dr.GetString(1).ToString, dr.GetDecimal(2).ToString, dr.GetInt32(3), dr.GetDecimal(4)})
Me.listProdComanda.Items.Add(lvItem)
txtDataVendaComanda.Text = dr([Ô]DataVenda[Ô]).ToString
txtNumComanda.Text = dr([Ô]ComandaNum[Ô]).ToString
txtCodFuncComanda.Text = dr([Ô]CodFunc[Ô]).ToString
txtAtendenteComanda.Text = dr([Ô]Atendente[Ô]).ToString
txtHoraEntComanda.Text = dr([Ô]HoraEnt[Ô]).ToString
txtHoraSaidaComanda.Text = dr([Ô]HoraSaida[Ô]).ToString
txtOcupantesComanda.Text = dr([Ô]Ocupantes[Ô]).ToString
txtCreditoComanda.Text = dr([Ô]Credito[Ô]).ToString
txtNomeClienteComanda.Text = dr([Ô]NomeCliente[Ô]).ToString
txtCPFClienteComanda.Text = dr([Ô]CPF[Ô]).ToString
txtCodClienteComanda.Text = dr([Ô]CodCliente[Ô]).ToString
End While

sqlCon.Close()
dr.Close()

somarValorItensComanda()
creditoFinal()
somarQtdeItensComanda()
totalizadorComanda()

End Sub [/code]

O problema está aqui:

Dim lvItem As New ListViewItem(New String() {dr.GetValue(0).ToString, dr.GetString(1).ToString, dr.GetDecimal(2).ToString, dr.GetInt32(3), dr.GetDecimal(4)})
Me.listProdComanda.Items.Add(lvItem)

Se existem dados funciona perfeitamente, mas se os campos do listview no banco de dados estiverem como nulos da o seguinte erro:

Dados são Null. Não é possível chamar este método ou esta propriedade em valores Null.

Se tiver alguma solução agradeço.

DAMASCENO.CESAR 01/06/2015 16:05:25
#447259
faça isso:
txtDataVendaComanda.Text =IIf(IsDBNull(dr([Ô]DataVenda[Ô])), [Ô][Ô], dr([Ô]DataVenda[Ô]))

ou no lugar de [Ô][Ô] use nothing, fica a seu criterio
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas