Ok, to start off with I think your database normalisation may be a bit off the mark.
Am I correct in thinking that the 'LocationConnectionCharge' only changes by Call Plan, not by ServicePlan? I'm guessing this because you have done a 'select distinct' which will get you just one LocationConnectionCharge. Therefore, I'd say that this column should be in the '2nd DB'.
Anyway, this aside, I think you're misunderstanding the nature of placeholders (the '@' value).
Code:
Dim sqlCmd As New SqlCommand("SELECT DISTINCT TSP.LocalConnectionChargePerCall FROM tblTelephoneCallPlans TCP " & _
"INNER JOIN tblTelephoneServicePlans TSP ON TSP.TelephoneCallPlanID = TCP.TelephoneCallPlanID " & _
"WHERE TCP.TelephoneCallPlanID = @TelephoneCallPlanID)")
sqlCmd.Parameters.Add(New SqlParameter("@TelephoneCallPlanID", SqlDbType.Int))
sqlCmd.Parameters("@TelephoneCallPlanID").Value = 0 'pass in the relevant value here
Dim read As Integer = sqlCmd.ExecuteScalar
This code won't work straight off, you'd have to attach a SqlConnection object to the sqlCmd.Connection parameter. Once this is done, however, the relevant value will go into the read variable. Just make sure that you assign the correct value to @TelephoneCallPlanID