Inquiridor
Como isolar a única linha de uma tabela em um DataRow?

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!
Todas as Respostas
-
-
-
-
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
-
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
-
-
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
-
-
-
-
-
-
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.
-
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