First thing, confirm you actually have a value in patient_ID. If it is an empty string then your Report will be blank which - unless you have data with a blank record Id - then you will get a blank report.
Second thing, ensure you have a Report document.
Server.MapPath should reference the full path to your report based on the current page path or the root of the web site.
Assume you have the following structure;
www.mysite.com/mywebpage.aspx
www.mywebsite.com/Reports/CrystalReport1.rpt
To run the report from mywebpage you would need access it using the following;
Server.MapPath("~/Reports/CrystalReport1.rpt");
Always reference from the root of your website by using the tilde (~) character.
Third, you are not passing the parameters or values to the report. You are creating discrete parameters but you are adding them to a new ParameterFields collection, not the Reports ParameterFields collection.
If you run the Report in Crystal Report & it prompts for the parameters then you need to do as follows;
foreach(CrystalDecsions.CrystalReports.Engine.ParameterFieldDefinition objParam in reportDocument.DataDefinition.ParameterFields)
{
if(objParam.ReportName == string.empty)
{
string strParamName = objParam.ParameterFieldName;
reportDocument.SetParameterValue(strParamName, "myValue");
}
}
I personally do not add discreet parameters to a Report because the Report may then load all of the data and then "hide" the data that does not meet the provided values - this is especially true with sub-reports. This is really bad for performance on big datasets & allows for the use of wildcards, which can allow the user to get data that you did not intend them to have.
My Reports typically retrieve data from a stored procedure due to the inherent performance and security benefits.
Kind Regards