Reputation: 11
i need help in sending table in email after retrieving from database. Managed to retrieve the data but the table on show one row but the database have many rows.
The problem of the code is around Message.Body += sb.ToString. All the code above is working perfectly during debug.
I couldnt solve the problem. please help!
Imports System.Data.SqlClient
Imports System.Data
Imports System.Net.Mail
Imports System.Text
Module Module1
Dim db As New Database
Sub Main()
Dim Message As MailMessage = New MailMessage()
Dim Smtp As New SmtpClient()
Dim emailTo As String = "[email protected]"
Smtp.UseDefaultCredentials = True
Smtp.Host = "server.com"
Smtp.Port = 25
Message.Subject = "Computers"
Message.To.Add("[email protected]")
Message.IsBodyHtml = True
Message.Priority = MailPriority.High
Message.From = New MailAddress("[email protected]")
Dim sql As String
Dim sql1 As String
Dim dr As SqlDataReader
Dim dr1 As SqlDataReader
Dim count As Integer = 0
Dim connstring As String = ("Server=QSD13\SQLEXPRESS; Initial Catalog = SoftwareManagementV2; UID=sa; Pwd=password;")
Dim connection As New SqlConnection(connstring)
db.OpenConn()
'Select version and affected softwarename from both SCCM1 DB and affectedsoftware DB to check which are the affected computers
sql = "SELECT SCCM1.DisplayName00, SCCM1.Version00, AffectedSoftware.Version00, AffectedSoftware.DisplayName00, SCCM1.Name00, SCCM1.InstallDate00, SCCM1.Publisher00, SCCM1.LastHWScan, SCCM1.DisplayName, SCCM1.email, SCCM1.Division, SCCM1.Dept, SCCM1.Brand, SCCM1.Model, SCCM1.OS from [SoftwareManagementV2].[dbo].AffectedSoftware, [CM_P01].[dbo].SCCM1 WHERE SCCM1.DisplayName00 = AffectedSoftware.DisplayName00 AND SCCM1.Version00 = AffectedSoftware.Version00"
dr = db.ExecuteQuery(sql)
'Select only values that appear once
sql1 = "Select DISTINCT Name00, DisplayName00, Version00 FROM [SoftwareManagementV2].[dbo].[AffectedComputer] group by Name00, DisplayName00, Version00"
dr1 = db.ExecuteQuery(sql1)
'both condition must be satisfied to insert in affected computer db
While dr.Read = True
'Prevent duplicate values inserted into affected computer db
If dr1.Read = False Then
Console.WriteLine("Display Name:" + dr(0) + ", Version:" + dr(1) + ", Computer Name:" + dr(4))
Dim cmd As SqlCommand = connection.CreateCommand
connection.Open()
'Insert affected computers and softwarenames into AffectedComputer DB
cmd.CommandText = "INSERT into AffectedComputer(Name00, DisplayName00, InstallDate00, Publisher00, Version00, LastHWScan, DisplayName, email, Division, Dept, Brand, Model, OS) VALUES (@Name00, @DisplayName00, @InstallDate00, @Publisher00, @Version00, @LastHWScan, @DisplayName, @email, @Division, @Dept, @Brand, @Model, @OS)"
cmd.Parameters.AddWithValue("@Name00", dr(4))
cmd.Parameters.AddWithValue("@DisplayName00", dr(0))
cmd.Parameters.AddWithValue("@InstallDate00", dr(5))
cmd.Parameters.AddWithValue("@Publisher00", dr(6))
cmd.Parameters.AddWithValue("@Version00", dr(1))
cmd.Parameters.AddWithValue("@LastHWScan", dr(7))
cmd.Parameters.AddWithValue("@DisplayName", dr(8))
cmd.Parameters.AddWithValue("@email", dr(9))
cmd.Parameters.AddWithValue("@Division", dr(10))
cmd.Parameters.AddWithValue("@Dept", dr(11))
cmd.Parameters.AddWithValue("@Brand", dr(12))
cmd.Parameters.AddWithValue("@Model", dr(13))
cmd.Parameters.AddWithValue("@OS", dr(14))
cmd.ExecuteNonQuery()
connection.Close()
Dim collection As New Collection
Dim item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13 As String
item1 = dr(4)
item2 = dr(0)
item3 = dr(5)
item4 = dr(6)
item5 = dr(1)
item6 = dr(7)
item7 = dr(8)
item8 = dr(9)
item9 = dr(10)
item10 = dr(11)
item11 = dr(12)
item12 = dr(13)
item13 = dr(14)
Dim all = item1.ToString + item2.ToString + item3.ToString + item4.ToString + item5.ToString + item6.ToString + item7.ToString + item8.ToString + item9.ToString + item10.ToString + item11.ToString + item12.ToString + item13.ToString
collection.Add(all)
Dim sb As New StringBuilder
sb.Append("<html><table border=""1"" cellpadding=""0"" cellspacing=""0"" bordercolor=""000000"" align=""center"">")
sb.Append("<tr>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Name00</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">DisplayName00</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">InstallDate00</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Publisher00</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Version00</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">LastHWScan</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Display Name</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">email</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Divison</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Dept</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Brand</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">Model</th>")
sb.Append("<th bordercolor=""#000000"" bgcolor=""#FFFF00"" scope=""col"">OS</th>")
sb.Append("</tr>")
For Each all In collection
sb.Append("<tr>")
sb.Append("<td bordercolor=""#000000"">" + item1 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item2 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item3 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item4 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item5 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item6 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item7 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item8 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item9 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item10 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item11 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item12 + "</td>")
sb.Append("<td bordercolor=""#000000"">" + item13 + "</td>")
sb.Append("</tr>")
Next
sb.Append("</table>")
sb.Append("</br></html>")
Message.Body += sb.ToString
count = + 1
End If
End While
dr.Close()
dr1.Close()
db.CloseConn()
'Only send email when theres row(s)
If count > 0 Then
Smtp.Send(Message)
End If
End Sub
End Module
Upvotes: 0
Views: 249
Reputation: 3003
Your collection variable contains 1 string per row. So your table builder should be:
For Each all In collection
sb.Append("<tr>")
sb.Append("<td bordercolor=""#000000"">" + all + "</td>")
sb.Append("</tr>")
Next
Upvotes: 1