Visual FoxPro STRTRAN() 以一种奇怪的方式工作

VisualFoxPro STRTRAN() Working in a Strange Way

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

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

正如您可能知道的那样,有一个 space 的负载,所以我尝试了这个,其中每个 space 都将在网络名称中替换为 "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, ' ', '') 会删除所有 space。虽然这在一定程度上确实有效,但首先如果有多个 Chris,例如 "ChrisB" 和 "ChrisC",他们现在都变成 "Chris".

要添加一些 spaces 没有被删除,例如我仍然得到一个错误说;

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

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

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

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

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

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

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

然后在您的 C# 代码中处理该值。例如,如果您使用 reader:

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