在C#.Net Web应用程序中使用VFP报告

时间:2015-03-03 16:01:35

标签: c# visual-foxpro

提前谢谢你。我是自学成才,所以请原谅我缺乏'技术说话'。

我正在将我的VFP应用程序转换为C#.Net Web应用程序。 VFP应用程序已被各种客户使用了近20年,并且有280种报告表格可从界面打印。我想在我的新Web应用程序中重用这些报告。我已经构建了一个新的VFP应用程序,其中包括所有报告,dll等,并包含多个报告的各种参数的过程,这些参数在从共享文件夹运行时工作正常,但是当执行C#中的代码时,会抛出错误。 / p>

String _path = Convert.ToString(Session["ReportPath"]);
String nwstr = Convert.ToString(Session["SOOrderID"]);
String generalchk = Convert.ToInt16(this.GeneralCheck.Checked).ToString();
String newchk = Convert.ToInt16(this.NewCheck.Checked).ToString();
String moneychk = Convert.ToInt16(this.ExcludeCheck.Checked).ToString();
String shipkey = this.ShipList.SelectedValue;
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "run_reports.exe";
p.StartInfo.WorkingDirectory = @_path;
p.StartInfo.Arguments = "DO single_ordr_prnt WITH " + "'" + @nwstr + "', '" 
+ @generalchk + "', '" + @newchk + "', '" + @moneychk + "', '" +        @shipkey   + "'";
p.StartInfo.UseShellExecute = true;
p.Start();

当Fox开火告诉我没有参数时,我收到错误 声明。我已经双重检查了有和没有的参数字符串 单引号并始终得到相同的错误。我有SET PROCEDURES TO'procedures.prg',程序都在那里。 'single_ordr_prnt'是过程名称,'Run_Reports'是exe名称。

任何帮助将不胜感激。我已经为此工作了两天而且已经没有想法了。

JLB

1 个答案:

答案 0 :(得分:0)

正在执行的调用是Run_Reports,而不是可执行文件的WITHIN函数,因此参数列表将传递给Run_Reports而不是“single_ordr_prnt”。

要尝试解决方法,您可能需要调整它的调用方式,但是您从网页获取值,这在任何SQL引擎中最常见危险... VFP仍然可以被SQL注入攻击,但如果有人不熟悉VFP,VFP就会呕吐并失败。

您可以尝试在VFP中将字符串构建为“ExecScript()”调用,但您仍然受限于shell执行调用将提供的参数长度。只是为了测试理论,从VFP环境中,你可以尝试这样的东西......

使用[ExecScript(“使用'blah','blah'等执行single_ordr_prnt)运行Run_Reports”)

并且“Run_Reports”程序中的第一行应该是一个参数,并进行测试以确保它看起来像您期望的那样,并且只是一个参数。如果有人在基于Web的字符串中添加任何额外的引号,这些引号会错误地抵消预期的字符串并在VFP中失败,这将有所帮助。

PARAMETERS pcParmFromWebSite, pcBadParm1, pcBadParm2, pcBadParm3

IF PCOUNT() > 1
   */ Error out
   return
endif 

if PCOUNT() = 1 AND atc( "ExecScript", pcParmFromWebSite ) = 1
   */ The "&" does macro substitution and will in-fact ISSUE the
   */ ExecScript with the parameters is has inclusive with it.
   &pcParmFromWebSite
   return whatever...
endif 

所以,虽然这是一个选项(再次,预先测试WITHIN VFP),我强烈建议尽你所能将内容直接移植到网页上并直接通过VFPOleDB连接将数据直接下载到Web用C#到你的数据库。您从VFP获得的报告无法直接推送到网络上(从我93年以来的最佳体验和使用VFP)。

评论的反馈......

我也使用了frx2any,但你可以选择做的是生成.PDF并将其作为流提要返回。我不知道报告的性能要求和/或返回的滞后时间。

您可以考虑的另一个选项是创建一个COM / OlePublic服务器类,公开可执行文件中的方法。在这个论坛中实际上覆盖的太多了......而且VFP和网络甚至还有其他选择。