Fefer, creo que el problema viene en que crystal cuando trabaja conexiones por código tiene independencia entre la conexion que le des al runtime para ejecutar el reporte y la conexión que cada una de las tablas del reporte tiene.
Parece una locura pero a mi me funcionó cuando cargué (gracias a un aporte de este foro!!) la conexión a cada una de las tablas.
C#
//instancia del runtime
CRAXDRT.ApplicationClass app = new CRAXDRT.ApplicationClass();
//objeto del reporte
CRAXDRT.ReportClass reporte = new CRAXDRT.ReportClass();
//cargo el reporte en el objeto reporte
reporte = (CRAXDRT.ReportClass) app.OpenReport("C:\\ReporteTecsis.rpt", 0);
//asigno al runtime por medio de la aplicación del reporte la conexion que necesito
reporte.Application.LogOnServer("p2ssql.dll", server, data, usuario, pwd);
//"p2ssql.dll" es la dll que llamo para atender el servido de MS-SQLSERVER
//a cada tabla le asigno la misma conexion
for (int i = 0; i < reporte.Database.Tables.Count; i++)
reporte.Database.Tables[i+1].SetLogOnInfo(server, data, usuario, pwd);
Espero que te ayude. Saludos!!