一:优势

1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.

2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。

3,Dapper支持什么数据库。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongo db

4,Dapper的r支持多表并联的对象。支持一对多 多对多的关系。并且没侵入性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。 5,Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能实在高高高。

6,Dapper支持net2.0,3.0,3.5,4.0。【如果想在Net2.0下使用,可以去网上找一下Net2.0下如何配置运行Net3.5即可。】 7,Dapper语法十分简单。并且无须迁就数据库的设计。

二:ASP .Net Core 中使用dapper可以很方便的操作mysql数据

  1. 需要安装如下类库
  2. "Dapper": "1.50.2",
  3. "NETStandard.Library": "1.6.0",
  4. "SapientGuardian.MySql.Data": "6.9.813"

三:基于dapper的操作mysql的封装类

  1. /// <summary>
  2. ///作者: 逍遥帝君
  3. /// 2016-10-26
  4. /// </summary>
  5. public class DapperMySQLHelp
  6. {
  7.  
  8. #region +ExcuteNonQuery 增、删、改同步操作
  9. /// <summary>
  10. /// 增、删、改同步操作
  11. /// 作者: 逍遥帝君
  12. /// 2016-10-26
  13. /// </summary>
  14. /// <typeparam name="T">实体</typeparam>
  15. /// <param name="connection">链接字符串</param>
  16. /// <param name="cmd">sql语句</param>
  17. /// <param name="param">参数</param>
  18. /// <param name="flag">true存储过程,false sql语句</param>
  19. /// <returns>int</returns>
  20. public int ExcuteNonQuery<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  21. {
  22. int result = ;
  23. using (MySqlConnection con = new MySqlConnection(connection))
  24. {
  25. if (flag)
  26. {
  27. result = con.Execute(cmd, param, null, null, CommandType.StoredProcedure);
  28. }
  29. else
  30. {
  31. result = con.Execute(cmd, param, null, null, CommandType.Text);
  32. }
  33. }
  34. return result;
  35. }
  36. #endregion
  37.  
  38. #region +ExcuteNonQueryAsync 增、删、改异步操作
  39. /// <summary>
  40. /// 增、删、改异步操作
  41. /// 作者: 逍遥帝君
  42. /// 2016-10-26
  43. /// </summary>
  44. /// <typeparam name="T">实体</typeparam>
  45. /// <param name="connection">链接字符串</param>
  46. /// <param name="cmd">sql语句</param>
  47. /// <param name="param">参数</param>
  48. /// <param name="flag">true存储过程,false sql语句</param>
  49. /// <returns>int</returns>
  50. public async Task<int> ExcuteNonQueryAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  51. {
  52. int result = ;
  53. using (MySqlConnection con = new MySqlConnection(connection))
  54. {
  55. if (flag)
  56. {
  57. result = await con.ExecuteAsync(cmd, param, null, null, CommandType.StoredProcedure);
  58. }
  59. else
  60. {
  61. result = await con.ExecuteAsync(cmd, param, null, null, CommandType.Text);
  62. }
  63. }
  64. return result;
  65. }
  66. #endregion
  67.  
  68. #region +ExecuteScalar 同步查询操作
  69. /// <summary>
  70. /// 同步查询操作
  71. /// 作者: 逍遥帝君
  72. /// 2016-10-26
  73. /// </summary>
  74. /// <typeparam name="T">实体</typeparam>
  75. /// <param name="connection">连接字符串</param>
  76. /// <param name="cmd">sql语句</param>
  77. /// <param name="param">参数</param>
  78. /// <param name="flag">true存储过程,false sql语句</param>
  79. /// <returns>object</returns>
  80. public object ExecuteScalar<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  81. {
  82. object result = null;
  83. using (MySqlConnection con = new MySqlConnection(connection))
  84. {
  85. if (flag)
  86. {
  87. result = con.ExecuteScalar(cmd, param, null, null, CommandType.StoredProcedure);
  88. }
  89. else
  90. {
  91. result = con.ExecuteScalar(cmd, param, null, null, CommandType.Text);
  92. }
  93. }
  94. return result;
  95. }
  96. #endregion
  97.  
  98. #region +ExecuteScalarAsync 异步查询操作
  99. /// <summary>
  100. /// 异步查询操作
  101. /// 作者: 逍遥帝君
  102. /// 2016-10-26
  103. /// </summary>
  104. /// <typeparam name="T">实体</typeparam>
  105. /// <param name="connection">连接字符串</param>
  106. /// <param name="cmd">sql语句</param>
  107. /// <param name="param">参数</param>
  108. /// <param name="flag">true存储过程,false sql语句</param>
  109. /// <returns>object</returns>
  110. public async Task<object> ExecuteScalarAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  111. {
  112. object result = null;
  113. using (MySqlConnection con = new MySqlConnection(connection))
  114. {
  115. if (flag)
  116. {
  117. result = await con.ExecuteScalarAsync(cmd, param, null, null, CommandType.StoredProcedure);
  118. }
  119. else
  120. {
  121. result = con.ExecuteScalarAsync(cmd, param, null, null, CommandType.Text);
  122. }
  123. }
  124. return result;
  125. }
  126. #endregion
  127.  
  128. #region +FindOne 同步查询一条数据
  129. /// <summary>
  130. /// 同步查询一条数据
  131. /// 作者: 逍遥帝君
  132. /// 2016-10-26
  133. /// </summary>
  134. /// <typeparam name="T">实体</typeparam>
  135. /// <param name="connection">连接字符串</param>
  136. /// <param name="cmd">sql语句</param>
  137. /// <param name="param">参数</param>
  138. /// <param name="flag">true存储过程,false sql语句</param>
  139. /// <returns>t</returns>
  140. public T FindOne<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  141. {
  142. IDataReader dataReader = null;
  143. using (MySqlConnection con = new MySqlConnection(connection))
  144. {
  145. if (flag)
  146. {
  147. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure);
  148. }
  149. else
  150. {
  151. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text);
  152. }
  153. if (dataReader == null || !dataReader.Read()) return null;
  154. Type type = typeof(T);
  155. T t = new T();
  156. foreach (var item in type.GetProperties())
  157. {
  158. for (int i = ; i < dataReader.FieldCount; i++)
  159. {
  160. //属性名与查询出来的列名比较
  161. if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
  162. var kvalue = dataReader[item.Name];
  163. if (kvalue == DBNull.Value) continue;
  164. item.SetValue(t, kvalue, null);
  165. break;
  166. }
  167. }
  168. return t;
  169. }
  170. }
  171. #endregion
  172.  
  173. #region +FindOne 异步查询一条数据
  174. /// <summary>
  175. /// 异步查询一条数据
  176. /// 作者: 逍遥帝君
  177. /// 2016-10-26
  178. /// </summary>
  179. /// <typeparam name="T">实体</typeparam>
  180. /// <param name="connection">连接字符串</param>
  181. /// <param name="cmd">sql语句</param>
  182. /// <param name="param">参数</param>
  183. /// <param name="flag">true存储过程,false sql语句</param>
  184. /// <returns>t</returns>
  185. public async Task<T> FindOneAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  186. {
  187. IDataReader dataReader = null;
  188. using (MySqlConnection con = new MySqlConnection(connection))
  189. {
  190. if (flag)
  191. {
  192. dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.StoredProcedure);
  193. }
  194. else
  195. {
  196. dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.Text);
  197. }
  198. if (dataReader == null || !dataReader.Read()) return null;
  199. Type type = typeof(T);
  200. T t = new T();
  201. foreach (var item in type.GetProperties())
  202. {
  203. for (int i = ; i < dataReader.FieldCount; i++)
  204. {
  205. //属性名与查询出来的列名比较
  206. if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
  207. var kvalue = dataReader[item.Name];
  208. if (kvalue == DBNull.Value) continue;
  209. item.SetValue(t, kvalue, null);
  210. break;
  211. }
  212. }
  213. return t;
  214. }
  215. }
  216. #endregion
  217.  
  218. #region +FindToList 同步查询数据集合
  219. /// <summary>
  220. /// 同步查询数据集合
  221. /// 作者: 逍遥帝君
  222. /// 2016-10-26
  223. /// </summary>
  224. /// <typeparam name="T">实体</typeparam>
  225. /// <param name="connection">连接字符串</param>
  226. /// <param name="cmd">sql语句</param>
  227. /// <param name="param">参数</param>
  228. /// <param name="flag">true存储过程,false sql语句</param>
  229. /// <returns>t</returns>
  230. public IList<T> FindToList<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  231. {
  232. IDataReader dataReader = null;
  233. using (MySqlConnection con = new MySqlConnection(connection))
  234. {
  235. if (flag)
  236. {
  237. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure);
  238. }
  239. else
  240. {
  241. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text);
  242. }
  243. if (dataReader == null || !dataReader.Read()) return null;
  244. Type type = typeof(T);
  245. List<T> tlist = new List<T>();
  246. while (dataReader.Read())
  247. {
  248. T t = new T();
  249. foreach (var item in type.GetProperties())
  250. {
  251. for (int i = ; i < dataReader.FieldCount; i++)
  252. {
  253. //属性名与查询出来的列名比较
  254. if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
  255. var kvalue = dataReader[item.Name];
  256. if (kvalue == DBNull.Value) continue;
  257. item.SetValue(t, kvalue, null);
  258. break;
  259. }
  260. }
  261. if (tlist != null) tlist.Add(t);
  262. }
  263. return tlist;
  264. }
  265. }
  266. #endregion
  267.  
  268. #region +FindToListAsync 异步查询数据集合
  269. /// <summary>
  270. /// 异步查询数据集合
  271. /// 作者: 逍遥帝君
  272. /// 2016-10-26
  273. /// </summary>
  274. /// <typeparam name="T">实体</typeparam>
  275. /// <param name="connection">连接字符串</param>
  276. /// <param name="cmd">sql语句</param>
  277. /// <param name="param">参数</param>
  278. /// <param name="flag">true存储过程,false sql语句</param>
  279. /// <returns>t</returns>
  280. public async Task<IList<T>> FindToListAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  281. {
  282. IDataReader dataReader = null;
  283. using (MySqlConnection con = new MySqlConnection(connection))
  284. {
  285. if (flag)
  286. {
  287. dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.StoredProcedure);
  288. }
  289. else
  290. {
  291. dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.Text);
  292. }
  293. if (dataReader == null || !dataReader.Read()) return null;
  294. Type type = typeof(T);
  295. List<T> tlist = new List<T>();
  296. while (dataReader.Read())
  297. {
  298. T t = new T();
  299. foreach (var item in type.GetProperties())
  300. {
  301. for (int i = ; i < dataReader.FieldCount; i++)
  302. {
  303. //属性名与查询出来的列名比较
  304. if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
  305. var kvalue = dataReader[item.Name];
  306. if (kvalue == DBNull.Value) continue;
  307. item.SetValue(t, kvalue, null);
  308. break;
  309. }
  310. }
  311. if (tlist != null) tlist.Add(t);
  312. }
  313. return tlist;
  314. }
  315. }
  316. #endregion
  317.  
  318. #region +FindToList 同步查询数据集合
  319. /// <summary>
  320. /// 同步查询数据集合
  321. /// 作者: 逍遥帝君
  322. /// 2016-10-26
  323. /// </summary>
  324. /// <typeparam name="T">实体</typeparam>
  325. /// <param name="connection">连接字符串</param>
  326. /// <param name="cmd">sql语句</param>
  327. /// <param name="param">参数</param>
  328. /// <param name="flag">true存储过程,false sql语句</param>
  329. /// <returns>t</returns>
  330. public IList<T> FindToListAsPage<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  331. {
  332. IDataReader dataReader = null;
  333. using (MySqlConnection con = new MySqlConnection(connection))
  334. {
  335. if (flag)
  336. {
  337. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure);
  338. }
  339. else
  340. {
  341. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text);
  342. }
  343. if (dataReader == null || !dataReader.Read()) return null;
  344. Type type = typeof(T);
  345. List<T> tlist = new List<T>();
  346. while (dataReader.Read())
  347. {
  348. T t = new T();
  349. foreach (var item in type.GetProperties())
  350. {
  351. for (int i = ; i < dataReader.FieldCount; i++)
  352. {
  353. //属性名与查询出来的列名比较
  354. if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
  355. var kvalue = dataReader[item.Name];
  356. if (kvalue == DBNull.Value) continue;
  357. item.SetValue(t, kvalue, null);
  358. break;
  359. }
  360. }
  361. if (tlist != null) tlist.Add(t);
  362. }
  363. return tlist;
  364. }
  365. }
  366. #endregion
  367.  
  368. #region +FindToListByPage 同步分页查询数据集合
  369. /// <summary>
  370. /// 同步分页查询数据集合
  371. /// 作者: 逍遥帝君
  372. /// 2016-10-26
  373. /// </summary>
  374. /// <typeparam name="T">实体</typeparam>
  375. /// <param name="connection">连接字符串</param>
  376. /// <param name="cmd">sql语句</param>
  377. /// <param name="param">参数</param>
  378. /// <param name="flag">true存储过程,false sql语句</param>
  379. /// <returns>t</returns>
  380. public IList<T> FindToListByPage<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  381. {
  382. IDataReader dataReader = null;
  383. using (MySqlConnection con = new MySqlConnection(connection))
  384. {
  385. if (flag)
  386. {
  387. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.StoredProcedure);
  388. }
  389. else
  390. {
  391. dataReader = con.ExecuteReader(cmd, param, null, null, CommandType.Text);
  392. }
  393. if (dataReader == null || !dataReader.Read()) return null;
  394. Type type = typeof(T);
  395. List<T> tlist = new List<T>();
  396. while (dataReader.Read())
  397. {
  398. T t = new T();
  399. foreach (var item in type.GetProperties())
  400. {
  401. for (int i = ; i < dataReader.FieldCount; i++)
  402. {
  403. //属性名与查询出来的列名比较
  404. if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
  405. var kvalue = dataReader[item.Name];
  406. if (kvalue == DBNull.Value) continue;
  407. item.SetValue(t, kvalue, null);
  408. break;
  409. }
  410. }
  411. if (tlist != null) tlist.Add(t);
  412. }
  413. return tlist;
  414. }
  415. }
  416. #endregion
  417.  
  418. #region +FindToListByPageAsync 异步分页查询数据集合
  419. /// <summary>
  420. /// 异步分页查询数据集合
  421. /// 作者: 逍遥帝君
  422. /// 2016-10-26
  423. /// </summary>
  424. /// <typeparam name="T">实体</typeparam>
  425. /// <param name="connection">连接字符串</param>
  426. /// <param name="cmd">sql语句</param>
  427. /// <param name="param">参数</param>
  428. /// <param name="flag">true存储过程,false sql语句</param>
  429. /// <returns>t</returns>
  430. public async Task<IList<T>> FindToListByPageAsync<T>(string connection, string cmd, DynamicParameters param, bool flag = true) where T : class, new()
  431. {
  432. IDataReader dataReader = null;
  433. using (MySqlConnection con = new MySqlConnection(connection))
  434. {
  435. if (flag)
  436. {
  437. dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.StoredProcedure);
  438. }
  439. else
  440. {
  441. dataReader = await con.ExecuteReaderAsync(cmd, param, null, null, CommandType.Text);
  442. }
  443. if (dataReader == null || !dataReader.Read()) return null;
  444. Type type = typeof(T);
  445. List<T> tlist = new List<T>();
  446. while (dataReader.Read())
  447. {
  448. T t = new T();
  449. foreach (var item in type.GetProperties())
  450. {
  451. for (int i = ; i < dataReader.FieldCount; i++)
  452. {
  453. //属性名与查询出来的列名比较
  454. if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
  455. var kvalue = dataReader[item.Name];
  456. if (kvalue == DBNull.Value) continue;
  457. item.SetValue(t, kvalue, null);
  458. break;
  459. }
  460. }
  461. if (tlist != null) tlist.Add(t);
  462. }
  463. return tlist;
  464. }
  465. }
  466. #endregion
  467.  
  468. }

四:分页查询存储过程

  1. 存储过程
  2. CREATE PROCEDURE page_getperson

  3. _pageIndex INT,
  4. _pageSize INT,
  5. out _pagecount int

  6. BEGIN
  7. DECLARE startIndex int DEFAULT ;
  8. DECLARE tcount int DEFAULT ;
  9. set startIndex=(_pageIndex-)*_pageSize;
  10. SELECT * from Person LIMIT startIndex,_pageSize;
  11. SELECT COUNT(id) into tcount from Person;
  12. set _pagecount=tcount;
  13.  
  14. END

五:参数写法

  1. DynamicParameters param = new DynamicParameters();
  2. param.Add("_pageIndex", );
  3. param.Add("_pageSize", );
  4. param.Add("_pagecount", dbType: DbType.Int32, direction: ParameterDirection.Output);
  5. var result = mysql.FindToListByPage<Person>(connection, "page_getperson", param);
    //总条数
  6. var count = param.Get<int>("_pagecount");
  7. var kk = result;

ASP .Net Core 使用 Dapper 轻型ORM框架的更多相关文章

  1. ASP.NET Core API ——Dapper的使用

    ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l  创建一个IDBConnection的接口对象 l  编 ...

  2. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  3. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...

  4. Orchard Core Framework:ASP.NET Core 模块化,多租户框架

    Orchard Core Framework:ASP.NET Core 模块化,多租户框架 上一篇编写Orchard Core一分钟搭建ASP.NET Core CMS ,介绍ASP.NET Core ...

  5. Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作

    ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper ...

  6. ASP.NET Core微服务+Tabler前端框架搭建个人博客1--开始前想说的话

    写在前面 本人为在读研究生,特别喜欢.NET,觉得.NET的编程方式.语法都特别友好,学习.NET Core已经差不多有一年半了,从一开始不知道如何入门到现在终于可以编写一些小的应用程序,想一想还是非 ...

  7. C#轻型ORM框架PetaPoco试水

    近端时间从推酷app上了解到C#轻微型的ORM框架--PetaPoco.从github Dapper 开源项目可以看到PetaPoco排第四 以下是网友根据官方介绍翻译,这里贴出来. PetaPoco ...

  8. Asp.net Core 3.1 引用ORM工具包 yrjw.ORM.Chimp(EF + dapper + Autofac)使用教程

    yrjw.ORM.Chimp 介绍 It is not the encapsulation of ORM,a based on EF + dapper + Autofac, is repository ...

  9. ASP.NET Core微服务+Tabler前端框架搭建个人博客2--系统架构

    功能分析 在整个微服务架构的搭建过程中,我们需要做的第一步就是对服务进行拆分,将一个完整的系统模块化,通过对各个模块互联,共同完成一个系统的工作.既然要做到模块化,那么必须明白你的系统的需求到底是什么 ...

随机推荐

  1. Oracle 11g完全卸载(Windows)(转)

    Oracle 11g完全卸载(Windows) 1.关闭oracle所有的服务.可以在windows的服务管理器中关闭:    一般有以下服务:   (1)Oracle SID VSS Writer ...

  2. Python爬虫实战(4):豆瓣小组话题数据采集—动态网页

    1, 引言 注释:上一篇<Python爬虫实战(3):安居客房产经纪人信息采集>,访问的网页是静态网页,有朋友模仿那个实战来采集动态加载豆瓣小组的网页,结果不成功.本篇是针对动态网页的数据 ...

  3. 期末考试--nyoj-757

    期末考试 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 马上就要考试了,小T有许多作业要做,而且每个老师都给出来了作业要交的期限,如果在规定的期限内没 交作业就会扣期末 ...

  4. KNN(k-nearest neighbor的缩写)又叫最近邻算法

    KNN(k-nearest neighbor的缩写)又叫最近邻算法 机器学习笔记--KNN算法1 前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的 ...

  5. MYSQL 加密的 3 类方法

    背景: 若你想要储存一些由可能包含任意字节值的加密函数返回的结果,使用BLOB列而不是 CHAR 或VARCHAR 列,从而避免由于结尾空格的删除而改变一些数据值的潜在问题. 这一句话来自官方文件,记 ...

  6. NFC-P2P MODE

    今日看见有关国内电信业者要合组TSM (Trusted Service Manager)提供NFC 服务的新闻, 这是属于NFC 所能提供的3种Mode中的Card emulation mode (就 ...

  7. linux scp ssh命令不用输入密码

    把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中 假设本地主机linux100,远程主机linux200 一,在linux100主机里的用户 运 ...

  8. 77个常用Linux命令和工具

    77个常用Linux命令和工具 Linux管理员不能单靠GUI图形界面吃饭.这就是我们编辑这篇最实用Linux命令手册的原因.这个指南是特别为Linux管理员和系统管理员 设计的,汇集了最有用的一些工 ...

  9. C语言的本质(19)——预处理之一:宏定义

    我们在写代码时已多次使用过以"#"号开头的预处理命令.如包含命令#include,宏定义命令#define等.在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为 ...

  10. wordpress参考网站

    wordpress大学http://www.wpdaxue.com/post-tags-and-categories-for-pages.html