none
Como isolar a única linha de uma tabela em um DataRow? RRS feed

  • Pergunta

  • Olá! Estou com um erro em uma parte de um programa que estou desenvolvendo, mas, infelizmente, não sei como corrigi-lo. Alguém poderia me ajudar??

    NÃO SEI COMO ISOLAR O ÚNICO REGISTRO DA TABELA [Param_email] em minha Datarow, considerando que estou trazendo as conexões de um outro formulário para uma classe diferente.  Quando tento instanciar as informações da única linha de minha tabela, tentando indicar a linha a ser considerada com "Dim i As New Object", a partir da posição (única) de meu BindingSource (i = parametros.Param_emailBindingSource.Position) me dá um erro [Object reference not set to an instance of an object.]   

    Tentei isso, porque ao fazer um "preview data" em minha fill no dataset (new_dataset.Param_email.Fill), retorna que tenho somente (1) uma linha e oito colunas. Logo, imaginava que poderia capturar a linha com "Dim oDtR As DataRow = mDtSt.Tables("Param_email").Rows(i)" onde o "i" seria 1. Porém, colocando Rows(0) ou Rows(1) resulta em erro do tipo "There is no row at position" 0 ou 1.

    Logo, infelizmente, como aprendiz, ainda não consigo identificar o que estou errando e, realmente, gostaria da ajuda de algum de vocês que têm mais experientes.

    Obrigadão!

    Vejam:

    Imports System.Data.OleDb
    Imports System.Net.Mail
    
    Public Class envio_mails
    
    ' Estancio o DataSet
        Dim mDtSt As New new_dataset
    
    ' Estancio a classe de validação de dados
        Dim validaciones As validarcampo = New validarcampo
    
    ' Estancio os dois formulários que servem de base para o envio de emails. 
    ' O [Form2] contém os parâmetros SMTP a serem utilizados, fazendo a conexão com a tabela
    ' a partir de um BindingSource. 
    ' Já o [Form3] é onde se insere os dados específicos do email a ser enviado, como assunto, texto e arquivos anexos
        Dim parametros As Form2
        Dim email As Form3
    
        Public Sub Send(ByVal reg As String, ByVal txtemail As String, ByVal txtsubject As String, ByVal rtfmess As String)
    
            Dim objNovoEmail As New MailMessage
            Dim objSmtp As New SmtpClient
    
    ' Criamos e atribuímos sete variáveis ​​com o conteúdo dos campos da tabela de parâmetros
            Dim param1, param2, param5, param6, param7 As String
            Dim param3, param4 As Integer
    
    ' AQUI ESTÁ O ERRO!!!
    ' Tento isolar o único  registro (linha) de minha tabela [Param_email] para buscar os parâmetros
    ' de configuração do servidor SMTP a ser empregado na solução
    
    	Dim i As New Object
            i = parametros.Param_emailBindingSource.Position
    
            Dim oDtR As DataRow = mDtSt.Tables("Param_email").Rows(i)
    
            param1 = oDtR("email_rem")
            param2 = oDtR("smtp_host")
            param3 = oDtR("smtp_port")
            param4 = oDtR("smtp_time")
            param5 = oDtR("smtp_user")
            param6 = oDtR("smtp_pass")
            param7 = oDtR("smtp_host")
    
    ' Adicionando o e-mail do remetente
            objNovoEmail.From = New MailAddress(param1)
    
    ' Adicionando o e-mail do destinatário
            objNovoEmail.To.Add(New MailAddress(txtemail))
    
    ' Adiciona a prioridade do e-mail
            objNovoEmail.Priority = MailPriority.High
    
    ' Adicionando o assunto ao atributo assunto
            objNovoEmail.Subject = txtsubject.ToString
    
    ' Formato de e-mail em Html?
            objNovoEmail.IsBodyHtml = True
    
    ' Inserir o corpo da mensagem no atributo Body
            objNovoEmail.Body = rtfmess.ToString
    
    ' Configuração de tipagem da linguagem, para não aparecer caracteres estranhos na mensagem
            objNovoEmail.SubjectEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
            objNovoEmail.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
    
    ' Aqui carrego os campos de atributos da configuração do e-mail
    ' com os parametros necessários para o correspondente envio.
    
    ' Configuração do IP do servidor SMTP
            objSmtp.Host = param2
            objSmtp.Port = param3
    
    ' Caso queira definir um tempo do timeout 
            objSmtp.Timeout = param4
    
    ' Define se deve usar autenticação ou não
            objSmtp.Credentials = New System.Net.NetworkCredential(param5, param6)
    
    ' Habilitar SSL ou não? 
            objSmtp.EnableSsl = param7
    
    ' Enviando a mensagem por e-mail
    
            Try
    
                objSmtp.Send(objNovoEmail)
    
    ' Aqui, uma vez enviado o e-mail, como não há registro de erro, é adicionado os respectivos dados dos na tabela Emails.
    
                Dim MDtR As DataRow = mDtSt.Tables("Email").NewRow()
    
                MDtR("id_contacto") = Integer.Parse(reg.ToString)
                MDtR("email_pri") = True
                MDtR("email_sub") = txtsubject.ToString
                MDtR("email_bod") = txtemail.ToString
                MDtR("email_fec") = Date.Today
    
                mDtSt.Tables("Email").Rows.Add(MDtR)
    
            Catch ex As Exception
    
                Throw ex
                MessageBox.Show(ex.ToString, "ERRO")
    
            Finally
    
                objNovoEmail.Dispose()
    
            End Try
    
        End Sub
    
    End Class




    Paulo Afonso


    • Editado Paulo Meireles terça-feira, 7 de maio de 2013 11:19 Redação equivocada!
    terça-feira, 7 de maio de 2013 11:18

Todas as Respostas

  • Você validou se na base há registros ?
    Pois testei a sintaxe na minha máquina e deu certo.
    terça-feira, 7 de maio de 2013 11:54
  • Salve Ninho, obrigado por ajudar-me mais uma vez!

    Acredito que sim. Pelo menos é o que me aparece no Preview Data. Veja:


    Paulo Afonso

    terça-feira, 7 de maio de 2013 13:14
  • Sempre a disposição
    Aonde vc está populando seu dataset ?

    terça-feira, 7 de maio de 2013 14:39
  • Estou populando o DataSet em cada formulário, imagino eu! Como não usei a forma programada, mas sim via Wizard do VS, para cada formulário acrescentei o DataSet (new_dataset) vinculando-o aos respectivos BindingSource, DataTable e BidingNavegator correspondentes. Fiz certo?! 

    Paulo Afonso

    terça-feira, 7 de maio de 2013 15:46
  • Olá pessoal, bom dia! Além do Ninho, que já tem muito me ajudado, ninguém mais se arrisca um ato de ajuda e ensino?!?! Acredito que esteja errando em coisas elementares e muito pequenas, mas meu pequeno conhecimento, em evidente fase de aprendizado, faz com que não consiga ver esse erro. 

    Paulo Afonso

    quarta-feira, 8 de maio de 2013 10:11
  • Não está errado, pois no modo Visual e uma funcionalidade que o VS disponibiliza pra vc.
    Tira um print de como você fez no modo visual, pois o erro citado é que ele não está encontrando o registro.
    quarta-feira, 8 de maio de 2013 11:41
  • Caro Ninho, fico feliz em saber que não estou tão longe, apesar de meu trabalho ainda estar gerando tanto erro!

    A seguir posto os print dos quatro formulário. Poderia te mandar uma arquivo compactado com a aplicação toda, mas não sei como fazê-lo por aqui. Façamos o que é possível. Veja:



    Paulo Afonso

    quarta-feira, 8 de maio de 2013 12:02

  • Paulo Afonso

    quarta-feira, 8 de maio de 2013 12:03

  • Paulo Afonso

    quarta-feira, 8 de maio de 2013 12:03

  • Paulo Afonso

    quarta-feira, 8 de maio de 2013 12:03
  • Paulo não consegui visualizar direito.
    Me envia o projeto no e-mail bru_blink@hotmail.com assim eu analiso ele e vejo o que está ocorrendo.
    quarta-feira, 8 de maio de 2013 15:01
  • Ok! Acabo de encaminhar e teu servidor de e-mail já respondeu com o recibo! Obrigado.

    Paulo Afonso

    quarta-feira, 8 de maio de 2013 16:47
  • Dei uma olhada no seu projeto e percebi que você não puxa o dataset de nenhum lugar.
    No seu código está assim :

       Dim oDtR As DataRow = mDtSt.Tables("Param_email").Rows(0)
    Esse mDtSt você declarou como uma variável global e não populou ela, pela que eu entendi da sua lógica quando vc chama essa clase vc deveria passar um dataset como parametro.E este dataset passado como parametro deverá estar populado.

    quinta-feira, 9 de maio de 2013 16:16
  • Oi Bruno, obrigado uma vez mais!

    Entender eu entendi tua explicação, mas como dizem, não compreendi totalmente a solução. Pensei que ao criar o dataset pelo wizard do VS ele estaria criado e sendo populado automaticamente. Não é assim?

    Porque ao chamar a classe envio_emails, instancio o dataset nessa variável mDtSt, assim:


    Dim mDtSt As New new_dataset

    No Data Source, criado na solução, consta o new_dataset que, quando dou uma Preview nos respectivos fill me retorna, para cada uma das tabelas, os respectivos conteúdos. Isso não confirmaria que o DataSet está populado?

    Então, ao chamar essa classe (envio_emails), como ela não é um formulário onde tenha vinculado o new_dataset via Wizard do VS, eu teria que fazer a configuração padrão de um DataSet? É isso???



    Paulo Afonso


    • Editado Paulo Meireles quinta-feira, 9 de maio de 2013 18:52 Equivoco de redação
    quinta-feira, 9 de maio de 2013 18:50