VisualFoxPro STRTRAN()以奇怪的方式工作

时间:2015-10-07 14:55:44

标签: c# visual-foxpro dbf

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

 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, ' ', '')会删除所有空格。虽然这在一定程度上起作用,但首先如果有不止一个克里斯,例如“ChrisB”和“ChrisC”,他们现在都变成了“克里斯”。

要添加到此,一些空格不会被删除,例如我仍然会收到错误说法;

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

即在某些情况下还有一个空间。

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

1 个答案:

答案 0 :(得分:5)

不要在那里使用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());