Avatar billede Slettet bruger
24. november 2004 - 20:25 Der er 21 kommentarer og
1 løsning

Loope gennem en database - sådan cirka

Hej
Jeg er ny i det her, og roder lidt med at lave en funktion, der kigger i en database, hvor den finder nogle personer, som den så sender en mail til.

Jeg er nået frem til følgende, og kan godt få den til at sende mail, men jeg kan ikke finde ud at kombinere det jeg henter i db med at sende en mail.
Jeg vil altså gerne sende en mail til "personale.mail" med indholdet "id"?

På forhånd tak.

Kode:

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Web.Mail

Namespace OpgaveMail

Public Class ClassOpgaveMail

Private Function DbConnection() As String
Return "PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\inetpub\wwwroot\database\calendar.mdb"
End Function
   
Public Function SendMail() As String
Dim MailSet As New DataSet
Dim DbConn As New OleDbConnection(DbConnection())
Dim sqlCmd As New OleDbCommand("SELECT personale.mail, Id, EventDate, MailInitialer, MailVarsel FROM Events WHERE Status=TRUE AND Afsluttet=False AND MailSendt=False INNER JOIN MailInitialer ON Personale.initialer", DbConn)
Try
DbConn.open
                   
Dim objMailMessage As MailMessage
Try
objMailMessage = New MailMessage
objMailMessage.From = "tester@mail.dk"
objMailMessage.To = "modtager@mail.dk"
objMailMessage.Subject = "Test mail fra Opgavemail"
objMailMessage.Body = "Dette er så body af testmail"
Catch
Return "Mail IKKE Dannet"
End Try
Try
SmtpMail.SmtpServer = "Smtp.mail.dk"
SmtpMail.Send( objMailMessage )
'Return "Mail er sendt"
Catch
Return "Mail er ikke sendt"
End Try
Try
DbConn.Close()
Return "Forbindelse Lukket"
Catch
Return "Forbindelsen er IKKE lukket"
End Try
Catch   
Return "Der blev ikke oprette nogen databaseforbindelse"
End Try
   
End Function
   
End Class

End Namespace
Avatar billede arne_v Ekspert
24. november 2004 - 20:31 #1
Prøv:

Dim DbConn As New OleDbConnection(DbConnection())
Dim sqlCmd As New OleDbCommand("SELECT personale.mail, Id, EventDate, MailInitialer, MailVarsel FROM Events WHERE Status=TRUE AND Afsluttet=False AND MailSendt=False INNER JOIN MailInitialer ON Personale.initialer", DbConn)
Try
DbConn.open

Dim reader As OleDbDataReader = sqlCmd.ExecuteReader
reader.Read
Dim permail As String = reader.GetString(0)
Dim id As String = reader.GetString(1)

og så brug permail og id (ret type fra String til Integer om nødvendigt)
Avatar billede arne_v Ekspert
24. november 2004 - 20:35 #2
Hvis queryen returnerer mere end en række så skal du have en while løkke.

Eksempel:

        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
        con.Open
        Dim cmd As OleDbCommand = New OleDbCommand ("SELECT * FROM T1", con)
        Dim rdr As OleDbDataReader = cmd.ExecuteReader
        While rdr.Read
            Dim f1 As Integer = CType(rdr(0), Integer)
            Dim f2 As String = CType(rdr(1), String)
            ' brug f1 og f2
        End While
        con.Close
Avatar billede Slettet bruger
24. november 2004 - 20:46 #3
Det gør den - var lige ved at skrive til dig :-)
Kigger lige på det.
Avatar billede Slettet bruger
24. november 2004 - 21:51 #4
ÆV - hvad det driller. Jeg tester det ved følgende asp.net kode:

<%@ Import Namespace="OpgaveMail" %>
<%@ Page EnableViewState="False" %>

<Script Runat="server">

Sub Button_Click( s As Object, e As EventArgs )
    Dim myOpgaveMail As New ClassOpgaveMail
    txt.Text = myOpgaveMail.SendMail
End Sub
</Script>
<html
<head><title>Test mail</title></head>
<body>
<form Runat="server">
<asp:label Id="txt" Runat="server" />

<asp:button
    onclick="Button_Click"
    Text="Tester"
    Runat="server" />
</form>
</body>
</hmtl>

Og får så følgende fejl, som vist er noget med sql-comandoen:

System.Data.OleDb.OleDbException: Syntax error (missing operator) in query expression 'Status=TRUE AND Afsluttet=False AND MailSendt=False INNER JOIN MailInitialer ON Personale.initialer'.

Jeg har prøvet forskellige ændringer i sql-stringen, men kan ikke få det til. Ved du tilfældigvis noget om det også?
Avatar billede arne_v Ekspert
24. november 2004 - 21:55 #5
prøv:

Dim sqlCmd As New OleDbCommand("SELECT personale.mail, Id, EventDate, MailInitialer, MailVarsel FROM Events INNER JOIN MailInitialer ON Events.X=MailInitialer.Y WHERE Status=TRUE AND Afsluttet=False AND MailSendt=False", DbConn)

X og Y skal erstattes med noget
Avatar billede Slettet bruger
24. november 2004 - 22:26 #6
Det fatter jeg ikke. Nu har jeg:
"SELECT personale.mail, Id, EventDate, MailInitialer, MailVarsel FROM Events INNER JOIN Events ON Personale.initialer=Events.mailinitialer", DbConn

Dvs. fra tabellen events skal den tage en række informatiner. Til disse informationer skal der knyttes en mailadresse. Det felt der er ens i de to tabeller er hhv. mailinitialer i tabel 1 og initialer i tabel 2 (tabel 2 har mailadressen).
Men jeg får stadig følgende fejl:
System.Data.OleDb.OleDbException: Syntax error in JOIN operation.

Det kan det have noget at gøre med min asp.net side, hvorfra jeg aktiverer vb.net filen?
Avatar billede Slettet bruger
24. november 2004 - 22:32 #7
Sidste linie i ovenstående skulle være:

Kan det have noget at gøre med min asp.net side, hvorfra jeg aktiverer vb.net filen?
Avatar billede arne_v Ekspert
24. november 2004 - 22:53 #8
Events INNER JOIN Events

skal det ikke være:

Personale INNER JOIN Events
Avatar billede Slettet bruger
24. november 2004 - 23:11 #9
Jo. Det er rigtigt. Hvis det stadig er rimligt (ellers oprette jeg et nyt spørgsmål), vil jeg gerene bede om svar på et spm. mere.

Når der er sendt en mail, vil jeg gerne opdatere databasen ved at mailsendt_1 sættes til true.
Avatar billede arne_v Ekspert
24. november 2004 - 23:14 #10
Dim sqlCmd2 As New OleDbCommand("UPDATE tabelnavn SET feltnavn = værdi")
sqlCmd2.ExecuteNonQuery
Avatar billede Slettet bruger
24. november 2004 - 23:24 #11
Tak - men jeg får følgende fejl:

System.InvalidOperationException: ExecuteNonQuery: Connection property has not been initialized.??
Avatar billede arne_v Ekspert
24. november 2004 - 23:26 #12
Jeg glemte connection sorry ...

Dim sqlCmd2 As New OleDbCommand("UPDATE tabelnavn SET feltnavn = værdi", DbConn)
sqlCmd2.ExecuteNonQuery
Avatar billede Slettet bruger
24. november 2004 - 23:41 #13
Den vil godt sende mail, hvis jeg udelader de to linier, der skal opdatere databasen når mailen er sendt. Men hvis jeg sætter de to linier ind, får jeg følgende fejl:

System.InvalidOperationException: There is already an open DataReader associated with this Connection which must be closed first.

På følgende kode:

While Reader.Read
Dim f1 As Integer = CType(reader(0), Integer)
Dim f2 As String = CType(reader(1), String)
' brug f1 og f2
           
Dim objMailMessage As MailMessage
objMailMessage = New MailMessage
objMailMessage.From = "test@mail.dk"
objMailMessage.To = f2
objMailMessage.Subject = "Test mail fra Opgavemail"
objMailMessage.Body = f1
           
SmtpMail.SmtpServer = "Smtp.mail.dk"
SmtpMail.Send( objMailMessage )
       
       
Dim sqlCmd2 As New OleDbCommand("UPDATE Events SET sendtmail_1 = true", DBConn)
sqlCmd2.ExecuteNonQuery
       
End While
       
reader.close()
DbConn.Close()
Avatar billede arne_v Ekspert
24. november 2004 - 23:51 #14
Ah.

Man kan ikke UPDATE på en connection man er igang med at læse fra.
Avatar billede Slettet bruger
24. november 2004 - 23:52 #15
Kan jeg så gøre det på en anden måde?
Avatar billede arne_v Ekspert
24. november 2004 - 23:52 #16
While Reader.Read
Dim f1 As Integer = CType(reader(0), Integer)
Dim f2 As String = CType(reader(1), String)
' brug f1 og f2
         
Dim objMailMessage As MailMessage
objMailMessage = New MailMessage
objMailMessage.From = "test@mail.dk"
objMailMessage.To = f2
objMailMessage.Subject = "Test mail fra Opgavemail"
objMailMessage.Body = f1
         
SmtpMail.SmtpServer = "Smtp.mail.dk"
SmtpMail.Send( objMailMessage )
     
Dim DbConn2 As New OleDbConnection(DbConnection())     
Dim sqlCmd2 As New OleDbCommand("UPDATE Events SET sendtmail_1 = true", DBConn2)
sqlCmd2.ExecuteNonQuery
DbConn2.Close
     
End While
     
reader.close()
DbConn.Close()
Avatar billede Slettet bruger
24. november 2004 - 23:53 #17
Hvis jeg sætter det ind efter reader.close(), siger den noget om at der mangler nogle parameterværdier?
Avatar billede arne_v Ekspert
24. november 2004 - 23:55 #18
23:52:39
Avatar billede Slettet bruger
25. november 2004 - 00:00 #19
Tak - du er hurtig :-)

Men når jeg så åbner DBConn2 og forsøger at sætte sendtmail_1 = true, siger den faktisk at:
Exception Details: System.Data.OleDb.OleDbException: No value given for one or more required parameters.
Avatar billede arne_v Ekspert
25. november 2004 - 00:03 #20
Den kan jeg ikke lige forklare

Men iøvrigt skal der nok en WHERE betingelse på ellers opdatrer den jo alle rækker
Avatar billede Slettet bruger
25. november 2004 - 00:04 #21
OK - sender du ikke et svar?

Tak for hjælpen.
Avatar billede arne_v Ekspert
25. november 2004 - 00:06 #22
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester