在 C# .Net Web 应用程序中使用 VFP 报告
Using VFP Reports within a C# .Net Web Application
提前谢谢你。本人自学,不足请见谅'tech speak'.
我正在将我的 VFP 应用程序转换为 C# .Net Web 应用程序。 VFP 应用程序已被各种客户使用了将近 20 年,并且有 280 个可从界面打印的报告表格。我想在我的新 Web 应用程序中重用这些报告。我已经构建了一个新的 VFP 应用程序,其中包括所有报告、dll 等,并包括具有多个报告的各种参数的过程,当来自共享文件夹的 运行 时工作正常,但是当执行 C# 中的代码时,出现错误被抛出。
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
正在执行的调用是 Run_Reports,而不是该可执行文件中的函数,因此参数列表被传递给 Run_Reports 而不是 "single_ordr_prnt"。
要尝试解决方法,您可能需要调整它的调用方式,但您是从网页获取值,这在任何 SQL 引擎中都是最常见的危险... VFP 仍然可以通过 SQL 注入进行攻击,但是如果有人不了解 VFP,VFP 就会呕吐并失败。
您可以尝试将字符串构建为 VFP 中的 "ExecScript()" 调用,但您仍然受限于 shell 执行调用将提供的参数长度。只是为了测试理论,在 VFP 环境中,您可以尝试这样的事情...
使用 [ExecScript( "Do single_ordr_prnt with 'blah', 'blah', etc" )]
执行 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
因此,虽然这是一个选项(同样,在 VFP 中进行预测试),但我强烈建议尽你所能将这些东西直接移植到网页上,并通过 VFPOleDB 将数据直接拉到网络上使用 C# 直接连接到您的数据库。您将从 VFP 获得的报告无法直接推送到网络(以我的最佳体验和自 93 年以来使用 VFP 的经验)。
来自评论的反馈...
我也使用过 frx2any,但您可能会选择生成一个 .PDF 并 return 将其作为流提要。我不知道 and/or 报告的性能要求 returning 中的延迟时间。
您可以考虑的另一种选择是创建一个 COM/OlePublic 服务器 class 在您的可执行文件中公开方法。这太多了,无法在本论坛中实际涵盖...甚至还有其他 VFP 和 Web 的替代方案。
提前谢谢你。本人自学,不足请见谅'tech speak'.
我正在将我的 VFP 应用程序转换为 C# .Net Web 应用程序。 VFP 应用程序已被各种客户使用了将近 20 年,并且有 280 个可从界面打印的报告表格。我想在我的新 Web 应用程序中重用这些报告。我已经构建了一个新的 VFP 应用程序,其中包括所有报告、dll 等,并包括具有多个报告的各种参数的过程,当来自共享文件夹的 运行 时工作正常,但是当执行 C# 中的代码时,出现错误被抛出。
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
正在执行的调用是 Run_Reports,而不是该可执行文件中的函数,因此参数列表被传递给 Run_Reports 而不是 "single_ordr_prnt"。
要尝试解决方法,您可能需要调整它的调用方式,但您是从网页获取值,这在任何 SQL 引擎中都是最常见的危险... VFP 仍然可以通过 SQL 注入进行攻击,但是如果有人不了解 VFP,VFP 就会呕吐并失败。
您可以尝试将字符串构建为 VFP 中的 "ExecScript()" 调用,但您仍然受限于 shell 执行调用将提供的参数长度。只是为了测试理论,在 VFP 环境中,您可以尝试这样的事情...
使用 [ExecScript( "Do single_ordr_prnt with 'blah', 'blah', etc" )]
执行 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
因此,虽然这是一个选项(同样,在 VFP 中进行预测试),但我强烈建议尽你所能将这些东西直接移植到网页上,并通过 VFPOleDB 将数据直接拉到网络上使用 C# 直接连接到您的数据库。您将从 VFP 获得的报告无法直接推送到网络(以我的最佳体验和自 93 年以来使用 VFP 的经验)。
来自评论的反馈...
我也使用过 frx2any,但您可能会选择生成一个 .PDF 并 return 将其作为流提要。我不知道 and/or 报告的性能要求 returning 中的延迟时间。
您可以考虑的另一种选择是创建一个 COM/OlePublic 服务器 class 在您的可执行文件中公开方法。这太多了,无法在本论坛中实际涵盖...甚至还有其他 VFP 和 Web 的替代方案。