Hola, necesariamente necesitas usar el SqlDataReader, salvo que uses generics creo que te convendría usar un DataTable, claro que todo depende del escenario en el que te encuentres.
Podrías hacer algo así:
Código vb.net:
Ver originalPrivate Function Consulta() As DataTable
Using testCMD As New SqlCommand("spMostrarEnfermedad", con)
testCMD.CommandType = CommandType.StoredProcedure
Dim RetValue As SqlParameter = testCMD.Parameters.Add("RetValue", SqlDbType.Int)
RetValue.Direction = ParameterDirection.ReturnValue
Dim nombre As SqlParameter = testCMD.Parameters.Add("nombre", SqlDbType.VarChar, 50)
nombre.Direction = ParameterDirection.Input
nombre.Value = nom_enferm
Using testDa As New SqlDataAdapter(cmd)
Dim dt As New DataTable()
da.Fill(dt)
return dt
End Using
End Using
'Para llamar al reporte
private sub cargarReporte()
Dim rpt As New ReportDocument()
rpt.Load("C:\mireporte.rpt") 'Reemplazalo por la ruta del reporte
rpt.SetParameterValue("RetValue", 0) //parametro 1
rpt.SetParameterValue("nombre", nom_enferm) //parametro 2
rpt.SetDataSource(Me.Consulta)
CrystalReportViewer1.ReportSource = rpt
End sub
Como te das cuenta tienes que usar el método setParameterValue para los parámetros, el primer valor es el nombre del parámetro y el segundo el dato que tendrá este parámetro.
Luego con SetDataSource le indicas el origen de datos.
Al final le agregas el reporte al visor mediante la propipedad ReportSource.
Cualquier duda me avisas