百万粉丝大号Spenser,分享了一个故事。 有一天,一个粉丝问Spenser:“S叔,有什么最直接的办法得到大佬的青睐或者帮助?”
有次李笑来老师在朋友圈卖跑车,问大家,有谁要买他的保时捷。Spenser说:“我当时银行卡账户里的钱,买笑来老师的车还是挺紧张的。但我为了得到大佬的帮助,想都没多想,直接飞去北京,敲开笑来老师的家门,说,老师我来买你的跑车。“
就那一次,让我抓住了机会,跟笑来老师见面聊天,就是受他的点拨,才有了2017年我的知识付费,把写作课卖成了全网第一。
你看,这就是得到牛人帮助的结果。
而得到这个结果之前,最重要的是,你应该成为那个值得被帮助被投资的人。
有人说,这个故事的关键是买车。
对不起,重点错了,这个故事的重点是“李笑来老师在朋友圈卖车”。
而我之所以能看到李老师的朋友圈,是因为在那之前我已经是个小V了。
Spenser说,你有什么样的实力,可以在见到你所谓的贵人时让他愿意帮助你呢?
除了勇气和自信,除了热血和崇拜,你还有什么?
虽然是李笑来老师卖车,我买车,但这背后的逻辑是我去找他啊。
放在世界很多事情要想办成,最重要的是你去找他啊,贵人给了方向,还是需要不断要朝一个目标打磨自己。
在技术圈子,同样。你想赚到以前赚不到的钱,比如小程序、公众号、物联网你就要选对的领路人,少走弯路才是最快的路。
只有快才能把事情做成。
中间层开发的一个重要的思路
我们开发中间层,最重要的是考虑传递的效率,毕竟网络传输也需要时间,如果动不动就是整张表传递,那效率实在是太低了,那么我们是不是可以只发送自己需要的变动信息就好了。
中间层那端收到变动信息就可以根据这个信息变动数据库的数据。
如果你是用VFP XML来做中间层的话,那么就有一个现成的函数可以使用了。
XMLUPDATEGRAM函数定义
将 XML 文本转换到 Visual FoxPro 临时表或表中。
代码语言:javascript复制XMLTOCURSOR(eExpression | cXMLFile [, cCursorName [, nFlags ]])
参数 eExpression
指定 XML 文本或计算为有效 XML 数据的表达式。eExpression 参数可以是 Visual FoxPro 内存变量、备注字段内容、从 HTTP 请求返回的内容、从 SOAP 方法调用返回的结果、 XMLDOM 中的 XML,或 ADO 流。注意: 如果没找到 eExpression 或不能将 eExpression 解析为有效的 XML,XMLCURSOR( ) 将会产生错误。
cXMLFile
指定名称,并可选择本地机器或网络上物理 XML 文件所在的路径。如果未指定路径,Visual FoxPro 将会沿着 Visual FoxPro 目录来搜索该 XML 文件。 cCursorName
指定要存储结果的临时表名,并在当前工作区中创建该临时表。如果临时表名已经存在或已被打开,Visual FoxPro 将关闭该临时表并在未使用的工作区中创建一个新的。如果省略或将 cCursorName 传递为空串(""),Visual FoxPro 会为返回结果创建名为“XMLRESULT”的临时表。如果 cCursorName 包含数据,并且 nFlags 被设置为 8192,Visual FoxPro 会把从 XML 文件中导出的数据追加到现有的表或临时表。该表或临时表必须处于打开或使用状态。如果 cCursorName 为空串(""),Visual FoxPro 会将 XML 导出到当前工作区打开的表或临时表中。 nFlags
指定在 XMLTOCURSOR( ) 中如何处理 XMLSource eExpression。下表描述了 nFlags 值。
nFlags | 位 | 说明 |
---|---|---|
0 | 0000 | (默认) 将第一个参数作为包含 XML 数据的串处理。 |
4 | 0100 | 保留数据中的空白空间,并忽略 XML 数据的 xml:space 属性。 |
512 | 01000000000 | 指定第一个参数(eExpression 或 cXMLFile)是包含 XML 数据文件名称和路径的串。 |
1024 | 10000000000 | NOCPTRANS – 在结果临时表中用 NOCPTRANS 选项创建 Character 和 Memo 字段,并将引入元素中的文本或 XML 值以不转换的形式逐字节插入到 Character 或 Memo 字段中。当使用 1024 标记时,XMLTOCURSOR( ) 会返回用实际串长度的追尾空间填充的串,也就是说,是两倍于实际串长度的串。 |
2048 | 100000000000 | 在导入带有 XML 规划定义(XSD)规划(包含有 totalDigits="19" 和 fractionDigits="4" 十进制数据类型限制)的规划时使用。在结果临时表中,XSD 数据类型的值被映射为 Visual FoxPro Currency 数据类型。 |
4096 | 1000000000000 | 废止 base64 解码。在 Visual FoxPro 中,base64 解码只是提供给二进制数据解码使用。 |
8192 | 1100000000 | 指定 cCursorName 是现有表或临时表的别名,并将指定 XML 文件中的数据导入到现有表或预先定义的临时表中。如果 cCursorName 包含数据,从 XML 文件中导出的数据会被追加到现有数据后。如果 cCursorName 是空串(""),XML 文件中的数据被导入到当前工作区打开的表或临时表中。将 nFlags 设置为 8192,对于 XML 规划不可用或不实际使用时是有用的。 |
32768 | 0x8000 | 表示应当要使用的代码页。 |
65536 | 0x10000 | 将 XML Char 字段映像为 Fox 本身的 Varchar 字段。如果不指定,XML Char 将被映射为 Fox Character 字段。 |
131072 | 0x20000 | 将 XML base64Binary 字段映像为 Fox 本身的 Varbinary 字段(小于 255 字节的情况下)或 Blob 字段(大于 255 字节的情况下)。如果不指定,XML base64Binary 字段将被映射为 Fox Memo 字段。 |
如XMLUPDATEGRAM("教师")
代码语言:javascript复制<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<root xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync>
<updg:before>
<教师>
<id>8</id>
<老师编号>555</老师编号>
<老师姓名>张三</老师姓名>
<物理地址>我是我的梦</物理地址>
<ip>不想见你</ip>
<日期/>
</教师>
</updg:before>
<updg:after/>
<updg:before>
<教师>
<id>9</id>
<老师编号>001</老师编号>
<老师姓名>李四</老师姓名>
<物理地址>谁又爱上了谁 11</物理地址>
<ip>不想见你</ip>
<日期/>
</教师>
</updg:before>
<updg:after>
<教师>
<id>9</id>
<老师编号>001</老师编号>
<老师姓名>李四111</老师姓名>
<物理地址>谁又爱上了谁 11</物理地址>
<ip>不想见你</ip>
<日期/>
</教师>
</updg:after>
<updg:before/>
<updg:after>
<教师>
<id>21</id>
<老师编号>5555</老师编号>
<老师姓名>笔芯</老师姓名>
<物理地址/>
<ip/>
<日期/>
</教师>
</updg:after>
</updg:sync>
</root>
修改的xml串
代码语言:javascript复制<updg:before>
<教师>
<id>5</id>
<老师编号>001</老师编号>
<老师姓名>张三</老师姓名>
</教师>
</updg:before>
<updg:after>
<教师>
<id>5</id>
<老师编号>001</老师编号>
<老师姓名>56565</老师姓名>
</教师>
</updg:after>
新增的XML串
代码语言:javascript复制 <updg:after>
<教师>
<id>13</id>
<老师编号>5555</老师编号>
<老师姓名>新增</老师姓名>
<物理地址/>
<ip/>
<日期/>
</教师>
</updg:after>
删除的XML串
代码语言:javascript复制 <updg:before>
<教师>
<id>12</id>
<老师编号/>
<老师姓名>io</老师姓名>
</教师>
</updg:before>
<updg:after/>
根据这样的XML结构,我们就可以通过xmldocmount来处理XML,根据含义生成相应的增删查改的SQL语句来更新数据库的表。
xmldocmount的使用可以查看这篇文章
JSON与XML你不懂就OUT,真相是它们都是字符串
虽然VFP没有提供这样的XML还原到缓冲表,但我们可以开发一个麻。如果懂得了如何开发自己的类库,才是真正的进阶之路。