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

CBr*_*eze 0 c# dbf visual-foxpro

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

 Could not find file 'S:\Picture\Chris               .jpg'.
Run Code Online (Sandbox Code Playgroud)

你可以告诉你有很多空格,所以我尝试了这个,其中每个空格都将在netname中用"a"替换;

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

当然,我开始收到类似的新错误消息;

Could not find file 'S:\Picture\Chrisaaaaaaaaaaaaaaa.jpg'.
Run Code Online (Sandbox Code Playgroud)

您会立即认为更改STRTRAN(em_netname, ' ', 'a')STRTRAN(em_netname, ' ', '')将删除所有空格.虽然这在一定程度上起作用,但首先如果有一个以上的克里斯,例如"ChrisB"和"ChrisC",他们现在都变成了"克里斯".

为了增加这一点,一些空格不会被删除,例如我仍然会收到错误说;

Could not find file 'S:\Picture\YenT .jpg'.
Run Code Online (Sandbox Code Playgroud)

即在某些情况下仍然留有一个空间.

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

Cet*_*soz 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 ''";
Run Code Online (Sandbox Code Playgroud)

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

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