I think I found it. Instead of directly hitting the tables, I always try to use the SharePoint object Model. In the SP Object Model there is an owner property of the SPSite class:
The Owner property of the SPSite class gets or sets the owner of the site collection.
public Microsoft.SharePoint.SPUser Owner {get; set;}
Property Value
A Microsoft.SharePoint.SPUser object that represents the owner.
So this will return a SPUser instance that represents the Owner. In the SPUser class there is a property for email. So if you first get the Site Owner by using:
string url = "http://Your Server_Name/sites/Your Site_Name/default.aspx";
SPSite mySite = new SPSite(url);
SPUser siteOwner = mySite.Owner;
siteOwner.Email="theownersemail";
You could then use the class called SPUtility that has a method called SendRequestAccessTo Owner. Below is the entry from the SDK documentation. Let us know if this works for you.
public static bool SendRequestAccessToOwner(
Microsoft.SharePoint.SPWeb web,
Microsoft.SharePoint.SPObjectType objType,
string objID,
string txtMessageBody
);
Parameters
web A Microsoft.SharePoint.SPWeb object that represents the site.
objType A Microsoft.SharePoint.SPObjectType value that specifies whether the object is a list or a site.
objID The ID of the list or site.
txtMessageBody A string that contains the message to convey to the owner.
Return Value
true if the e-mail is sent to the owner; otherwise, false.