【问题标题】:VisualFoxPro STRTRAN() Working in a Strange WayVisual FoxPro STRTRAN() 以一种奇怪的方式工作
【发布时间】:2015-10-07 14:55:43
【问题描述】:

我试图在用户选择他们的网名时显示他们的图像,但是当我试图找到他们的图像时,我收到一条错误消息,例如;

 Could not find file 'S:\Picture\Chris               .jpg'.

正如您可能知道的那样,有很多空格,所以我尝试了这个方法,将 netname 中的每个空格都替换为“a”;

 string dbfQuery = "SELECT em_pplid, em_name, STRTRAN(em_netname, ' ', 'a'), em_surname FROM employs WHERE em_netname NOT LIKE ''";

当然,我开始收到这样的新错误消息;

Could not find file 'S:\Picture\Chrisaaaaaaaaaaaaaaa.jpg'.

您马上会认为将STRTRAN(em_netname, ' ', 'a') 更改为STRTRAN(em_netname, ' ', '') 会删除所有空格。虽然这在一定程度上确实有效,但首先如果有多个 Chris,例如“ChrisB”和“ChrisC”,它们现在都变为“Chris”。

为此添加一些空格并没有删除,例如我仍然收到错误消息;

Could not find file 'S:\Picture\YenT .jpg'.

即在某些情况下还剩下一个空格。

这有什么原因吗?我是否错误地使用了 STRTRAN?我认为可能的一件事是,除了空格之外,还有其他隐藏的、不可打印的字符,但是用“a”替换它们不会留下空格吗?

【问题讨论】:

  • 您是否尝试过 TRIM 和/或 ALLTRIM 函数来删除空格?此外,如果这仅与 VfP 相关,您能否删除其他数据库标签。
  • @PaulF, trim(), alltrim() 在 VFP 表中也不起作用(除非您将其转换为 varchar 值)。 VFP 列是固定大小的。
  • @CetinBasoz:我忘记了查询中会发生这种情况。现在我查看我拥有的旧代码,我发现它需要在结果上完成。
  • @PaulF 我确实尝试过 TRIM 和 LTRIM/RTRIM,但没有任何效果。根据 Cetin 的回答,通过 C# 实现我想要的目标很简单,而不是尝试修改查询。

标签: c# visual-foxpro dbf


【解决方案1】:

不要在那里使用 StrTran() 或任何其他函数。乍一看,要使用的适当函数是 Trim() 或 Rtrim()。但是,VFP 并不真正支持不同的字符大小,这会导致字段大小设置为它找到的第一条记录的内容(因此,如果它首先找到 Chris,那么任何长于 Chris 的名称都会被截断为 5 个字符。并且任何小于 5 的数据仍有尾随空格)。

根据 strtran(),它不仅会替换尾随空格,还会替换字符串中的任何空格字符。

所以不要先使用任何函数,而是先做一个简单的选择:

string dbfQuery = @"SELECT em_pplid, em_name, em_netname, em_surname 
    FROM employs 
    WHERE em_netname NOT LIKE ''";

然后处理 C# 代码中的值。例如,如果您使用的是阅读器:

var pictureFileName = string.Format(@"s:\Picture\{0}.jpg", 
  ((string)reader["em_netname"]).Trim());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2017-01-17
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多