因为如今发现做个小项目都是导入n多的依赖包,非常烦琐,仅仅想快点开发完一个个的小需求项目,这个时候真心不想用框架,仅仅能自己写个jdbcutils,尽管网上有非常多有apache的,阿里的,可是感觉用过后都不怎么顺手,然后自己花了点时间写个新的,不喜勿喷

1.我们要写个resultset集合转成bean的回调接口,这个用过spring jdbc的人都知道这玩意

  1. package org.simple.mvc.jdbc.bean;
  2.  
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5.  
  6. public interface RowMapper<T> {
  7.  
  8. public abstract T mapRow(ResultSet rs) throws SQLException;
  9.  
  10. }

2.先来个主要的jdbc操作接口吧,这样好规范点

  1. package org.simple.mvc.jdbc;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. import javax.sql.DataSource;
  12.  
  13. import org.simple.mvc.jdbc.bean.RowMapper;
  14.  
  15. public interface JdbcOperation {
  16.  
  17. /**
  18. * update或delete功能
  19. *
  20. * @param sql
  21. * @param params
  22. * @return 变更记录数
  23. * @throws SQLException
  24. */
  25. public abstract int execute(String sql, Object[] params) throws SQLException;
  26.  
  27. /**
  28. * update或delete功能
  29. *
  30. * @param sql
  31. * @return 变更记录数
  32. * @throws SQLException
  33. */
  34. public abstract int execute(String sql) throws SQLException;
  35.  
  36. /**
  37. * 批处理update或delete功能
  38. *
  39. * @param sql
  40. * @param params
  41. * @return 变更记录数
  42. * @throws SQLException
  43. */
  44. public abstract int executeBatch(String sql, List<Object[]> params) throws SQLException;
  45.  
  46. /**
  47. * 批处理update或delete功能
  48. *
  49. * @param sql
  50. * @param params
  51. * @return 变更记录数
  52. * @throws SQLException
  53. */
  54. public abstract int executeBatch(String sql) throws SQLException;
  55.  
  56. /**
  57. * select功能
  58. *
  59. * @param sql
  60. * @param params
  61. * @return 原生ResultSet数据集合
  62. * @throws SQLException
  63. */
  64. public abstract ResultSet queryForResultSet(String sql, Object[] params) throws SQLException;
  65.  
  66. /**
  67. * select功能
  68. *
  69. * @param sql
  70. * @return 原生ResultSet数据集合
  71. * @throws SQLException
  72. */
  73. public abstract ResultSet queryForResultSet(String sql) throws SQLException;
  74.  
  75. /**
  76. * select功能
  77. *
  78. * @param sql
  79. * @param params
  80. * @return List<?
  81.  
  82. >数据集合
  83. * @throws SQLException
  84. */
  85. public abstract List<?
  86.  
  87. > queryForBean(String sql, Object[] params, RowMapper<?> mapper) throws SQLException;
  88.  
  89. /**
  90. * select功能
  91. *
  92. * @param sql
  93. * @param params
  94. * @return List<?
  95.  
  96. >数据集合
  97. * @throws SQLException
  98. */
  99. public abstract List<?> queryForBean(String sql, RowMapper<?> mapper) throws SQLException;
  100.  
  101. /**
  102. * select功能
  103. *
  104. * @param sql
  105. * @param params
  106. * @return List<Map<String, Object>>数据集合
  107. * @throws SQLException
  108. */
  109. public abstract List<Map<String, Object>> queryForMap(String sql, Object[] params) throws SQLException;
  110.  
  111. /**
  112. * select功能
  113. *
  114. * @param sql
  115. * @param params
  116. * @return List<Map<String, Object>>数据集合
  117. * @throws SQLException
  118. */
  119. public abstract List<Map<String, Object>> queryForMap(String sql) throws SQLException;
  120.  
  121. /**
  122. * select功能
  123. *
  124. * @param sql
  125. * @return 统计单列记录数
  126. * @throws SQLException
  127. */
  128. public abstract int queryForInt(String sql, Object[] params) throws SQLException;
  129.  
  130. /**
  131. * select功能
  132. *
  133. * @param sql
  134. * @return 统计单列记录数
  135. * @throws SQLException
  136. */
  137. public abstract int queryForInt(String sql) throws SQLException;
  138.  
  139. /**
  140. * 释放Connection资源
  141. *
  142. * @param x
  143. */
  144. public abstract void free(Connection x);
  145.  
  146. /**
  147. * 释放Statement资源
  148. *
  149. * @param x
  150. */
  151. public abstract void free(Statement x);
  152.  
  153. /**
  154. * 释放PreparedStatement资源
  155. *
  156. * @param x
  157. */
  158. public abstract void free(PreparedStatement x);
  159.  
  160. /**
  161. * 释放ResultSet资源
  162. *
  163. * @param x
  164. */
  165. public abstract void free(ResultSet x);
  166.  
  167. /**
  168. * 设置数据源
  169. *
  170. * @param dataSource
  171. */
  172. public abstract void setDataSource(DataSource dataSource);
  173.  
  174. /**
  175. * 获取数据库链接
  176. *
  177. * @return Connection
  178. */
  179. public abstract Connection getConnection();
  180.  
  181. /**
  182. * 获取数据库链接
  183. *
  184. * @param autoCommit
  185. * @return Connection
  186. */
  187. public Connection getConnection(boolean autoCommit);
  188.  
  189. }

3.实现我们接口里面的方法

  1. package org.simple.mvc.jdbc.impl;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.ResultSetMetaData;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13.  
  14. import javax.sql.DataSource;
  15.  
  16. import org.simple.mvc.jdbc.JdbcOperation;
  17. import org.simple.mvc.jdbc.bean.RowMapper;
  18.  
  19. /**
  20. * 简易JDBC实现类
  21. *
  22. * @author shadow
  23. *
  24. */
  25. public class SimpleJdbc implements JdbcOperation {
  26.  
  27. private static final boolean AUTO_COMMIT = true;
  28.  
  29. private DataSource dataSource;
  30.  
  31. public SimpleJdbc() {
  32.  
  33. }
  34.  
  35. public SimpleJdbc(DataSource dataSource) {
  36. this.dataSource = dataSource;
  37. }
  38.  
  39. public Connection getConnection() {
  40. return getConnection(AUTO_COMMIT);
  41. }
  42.  
  43. public Connection getConnection(boolean autoCommit) {
  44. try {
  45. Connection conn = dataSource.getConnection();
  46. if (!autoCommit)
  47. conn.setAutoCommit(autoCommit);
  48. return conn;
  49. } catch (SQLException e) {
  50. e.printStackTrace();
  51. }
  52. return null;
  53. }
  54.  
  55. @Override
  56. public int execute(String sql, Object[] params) throws SQLException {
  57. Connection conn = getConnection(false);
  58. PreparedStatement stmt = null;
  59. int result = -1;
  60. try {
  61. stmt = createPreparedStatement(conn, sql, params);
  62. result = stmt.executeUpdate();
  63. conn.commit();
  64. } catch (Exception e) {
  65. conn.rollback();
  66. e.printStackTrace();
  67. } finally {
  68. free(stmt);
  69. free(conn);
  70. }
  71. return result;
  72. }
  73.  
  74. @Override
  75. public int execute(String sql) throws SQLException {
  76. return execute(sql, new Object[] {});
  77. }
  78.  
  79. @Override
  80. public ResultSet queryForResultSet(String sql, Object[] params) throws SQLException {
  81. Connection conn = getConnection();
  82. PreparedStatement stmt = null;
  83. try {
  84. stmt = createPreparedStatement(conn, sql, params);
  85. return stmt.executeQuery();
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. } finally {
  89. free(stmt);
  90. free(conn);
  91. }
  92. return null;
  93. }
  94.  
  95. @Override
  96. public ResultSet queryForResultSet(String sql) throws SQLException {
  97. return queryForResultSet(sql, new Object[] {});
  98. }
  99.  
  100. @Override
  101. public int queryForInt(String sql, Object[] params) throws SQLException {
  102. Connection conn = getConnection();
  103. PreparedStatement stmt = null;
  104. ResultSet rs = null;
  105. try {
  106. stmt = createPreparedStatement(conn, sql, params);
  107. rs = createResultSet(stmt);
  108. while (rs.next()) {
  109. return rs.getInt(1);
  110. }
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. } finally {
  114. free(rs);
  115. free(stmt);
  116. free(conn);
  117. }
  118. return 0;
  119. }
  120.  
  121. @Override
  122. public int queryForInt(String sql) throws SQLException {
  123. return queryForInt(sql, new Object[] {});
  124. }
  125.  
  126. @Override
  127. public List<?> queryForBean(String sql, Object[] params, RowMapper<?> mapper) throws SQLException {
  128. Connection conn = getConnection();
  129. PreparedStatement stmt = null;
  130. ResultSet rs = null;
  131. List<Object> list = null;
  132. try {
  133. stmt = createPreparedStatement(conn, sql, params);
  134. rs = createResultSet(stmt);
  135. list = new ArrayList<Object>();
  136. while (rs.next()) {
  137. list.add(mapper.mapRow(rs));
  138. }
  139. } catch (Exception e) {
  140. e.printStackTrace();
  141. } finally {
  142. free(rs);
  143. free(stmt);
  144. free(conn);
  145. }
  146. return list;
  147. }
  148.  
  149. @Override
  150. public List<?
  151.  
  152. > queryForBean(String sql, RowMapper<?> mapper) throws SQLException {
  153. return queryForBean(sql, new Object[] {}, mapper);
  154. }
  155.  
  156. @Override
  157. public List<Map<String, Object>> queryForMap(String sql, Object[] params) throws SQLException {
  158. Connection conn = getConnection();
  159. PreparedStatement stmt = null;
  160. ResultSet rs = null;
  161. try {
  162. stmt = createPreparedStatement(conn, sql, params);
  163. rs = createResultSet(stmt);
  164.  
  165. List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  166. Map<String, Object> map = null;
  167. ResultSetMetaData rsd = rs.getMetaData();
  168. int columnCount = rsd.getColumnCount();
  169.  
  170. while (rs.next()) {
  171. map = new HashMap<String, Object>(columnCount);
  172. for (int i = 1; i < columnCount; i++) {
  173. map.put(rsd.getColumnName(i), rs.getObject(i));
  174. }
  175. list.add(map);
  176. }
  177.  
  178. return list;
  179. } catch (Exception e) {
  180. e.printStackTrace();
  181. } finally {
  182. free(rs);
  183. free(stmt);
  184. free(conn);
  185. }
  186. return null;
  187. }
  188.  
  189. @Override
  190. public List<Map<String, Object>> queryForMap(String sql) throws SQLException {
  191. return queryForMap(sql, new Object[] {});
  192. }
  193.  
  194. @Override
  195. public int executeBatch(String sql, List<Object[]> params) throws SQLException {
  196. int result = 0;
  197. Connection conn = getConnection(false);
  198. PreparedStatement stmt = null;
  199. try {
  200. stmt = conn.prepareStatement(sql);
  201. for (int i = 0; i < params.size(); i++) {
  202. Object[] param = params.get(i);
  203. for (int j = 0; j < param.length; j++)
  204. stmt.setObject(j + 1, param[j]);
  205. stmt.addBatch();
  206. if (i % 1000 == 0) {
  207. stmt.executeBatch();
  208. stmt.clearBatch();
  209. }
  210. }
  211. stmt.executeBatch();
  212. conn.commit();
  213. result = params.size();
  214. } catch (Exception e) {
  215. conn.rollback();
  216. e.printStackTrace();
  217. } finally {
  218. free(stmt);
  219. free(conn);
  220. }
  221. return result;
  222. }
  223.  
  224. @Override
  225. public int executeBatch(String sql) throws SQLException {
  226. return executeBatch(sql, new ArrayList<Object[]>());
  227. }
  228.  
  229. public DataSource getDataSource() {
  230. return dataSource;
  231. }
  232.  
  233. public void setDataSource(DataSource dataSource) {
  234. this.dataSource = dataSource;
  235. }
  236.  
  237. @Override
  238. public void free(Connection x) {
  239. if (x != null)
  240. try {
  241. x.close();
  242. } catch (SQLException e) {
  243. e.printStackTrace();
  244. }
  245. }
  246.  
  247. @Override
  248. public void free(Statement x) {
  249. if (x != null)
  250. try {
  251. x.close();
  252. } catch (SQLException e) {
  253. e.printStackTrace();
  254. }
  255. }
  256.  
  257. @Override
  258. public void free(PreparedStatement x) {
  259. if (x != null)
  260. try {
  261. x.close();
  262. } catch (SQLException e) {
  263. e.printStackTrace();
  264. }
  265. }
  266.  
  267. @Override
  268. public void free(ResultSet x) {
  269. if (x != null)
  270. try {
  271. x.close();
  272. } catch (SQLException e) {
  273. e.printStackTrace();
  274. }
  275. }
  276.  
  277. public PreparedStatement createPreparedStatement(Connection conn, String sql, Object[] params) throws SQLException {
  278. PreparedStatement stmt = conn.prepareStatement(sql);
  279. for (int i = 0; i < params.length; i++)
  280. stmt.setObject(i + 1, params[i]);
  281. return stmt;
  282. }
  283.  
  284. public ResultSet createResultSet(PreparedStatement stmt) throws SQLException {
  285. return stmt.executeQuery();
  286. }
  287. }

4.然后实现我们一个连接池吧,不喜欢dbcp,c3p0的话,那些要依赖包的导致项目重量上去了

  1. package org.simple.mvc.jdbc.source;
  2.  
  3. import java.io.PrintWriter;
  4. import java.lang.reflect.InvocationHandler;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Proxy;
  7. import java.sql.Connection;
  8. import java.sql.DriverManager;
  9. import java.sql.SQLException;
  10. import java.util.LinkedList;
  11.  
  12. import javax.sql.DataSource;
  13.  
  14. /**
  15. * 简易连接池实现类
  16. *
  17. * @author shadow
  18. *
  19. */
  20. public class SimpleDataSource implements DataSource {
  21.  
  22. private int poolSize = 5;
  23.  
  24. private LinkedList<Connection> pool = new LinkedList<Connection>();
  25.  
  26. public SimpleDataSource(String driver, String url, String name, String pwd) {
  27. this(driver, url, name, pwd, 5);
  28. }
  29.  
  30. public SimpleDataSource(String driver, String url) {
  31. this(driver, url, "", "", 5);
  32. }
  33.  
  34. public SimpleDataSource(String driver, String url, String name, String pwd, int poolSize) {
  35. try {
  36. Class.forName(driver);
  37. this.poolSize = poolSize;
  38. if (poolSize <= 0) {
  39. throw new RuntimeException("初始化池大小失败: " + poolSize);
  40. }
  41.  
  42. for (int i = 0; i < poolSize; i++) {
  43. Connection con = DriverManager.getConnection(url, name, pwd);
  44. con = ConnectionProxy.getProxy(con, pool);// 获取被代理的对象
  45. pool.add(con);// 加入被代理的对象
  46. }
  47. } catch (Exception e) {
  48. throw new RuntimeException(e.getMessage(), e);
  49. }
  50.  
  51. }
  52.  
  53. /** 获取池大小 */
  54. public int getPoolSize() {
  55. return poolSize;
  56.  
  57. }
  58.  
  59. /** 不支持日志操作 */
  60. public PrintWriter getLogWriter() throws SQLException {
  61. throw new RuntimeException("Unsupport Operation.");
  62. }
  63.  
  64. public void setLogWriter(PrintWriter out) throws SQLException {
  65. throw new RuntimeException("Unsupport operation.");
  66. }
  67.  
  68. /** 不支持超时操作 */
  69. public void setLoginTimeout(int seconds) throws SQLException {
  70. throw new RuntimeException("Unsupport operation.");
  71. }
  72.  
  73. public int getLoginTimeout() throws SQLException {
  74. return 0;
  75. }
  76.  
  77. @SuppressWarnings("unchecked")
  78. public <T> T unwrap(Class<T> iface) throws SQLException {
  79. return (T) this;
  80. }
  81.  
  82. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  83. return DataSource.class.equals(iface);
  84. }
  85.  
  86. /** 从池中取一个连接对象,使用了同步和线程调度 */
  87. public Connection getConnection() throws SQLException {
  88. synchronized (pool) {
  89. if (pool.size() == 0) {
  90. try {
  91. pool.wait();
  92. } catch (InterruptedException e) {
  93. throw new RuntimeException(e.getMessage(), e);
  94. }
  95. return getConnection();
  96. } else {
  97. return pool.removeFirst();
  98. }
  99. }
  100. }
  101.  
  102. public Connection getConnection(String username, String password) throws SQLException {
  103. throw new RuntimeException("不支持接收username与password的操作");
  104. }
  105.  
  106. /** 实现对Connection的动态代理 */
  107. static class ConnectionProxy implements InvocationHandler {
  108.  
  109. private Object obj;
  110. private LinkedList<Connection> pool;
  111.  
  112. private ConnectionProxy(Object obj, LinkedList<Connection> pool) {
  113. this.obj = obj;
  114. this.pool = pool;
  115. }
  116.  
  117. public static Connection getProxy(Object o, LinkedList<Connection> pool) {
  118. Object proxed = Proxy.newProxyInstance(o.getClass().getClassLoader(), new Class[] { Connection.class },
  119. new ConnectionProxy(o, pool));
  120. return (Connection) proxed;
  121. }
  122.  
  123. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  124. if (method.getName().equals("close")) {
  125. synchronized (pool) {
  126. pool.add((Connection) proxy);
  127. pool.notify();
  128. }
  129. return null;
  130. } else {
  131. return method.invoke(obj, args);
  132. }
  133. }
  134.  
  135. }
  136.  
  137. }

5.開始測试下我们刚刚写的玩意,simplejdbc主要是有datasource提供给他就能够了,其它的一律无视,測试里面的user对象我就不提供,里面就是两个属性,id和username,然后生成set和get方法就可以,当然这个是演示resultset转成bean的,当然也能够直接使用queryForMap直接查询出map集合,我想接口提供的方法已经足够使用了

  1. public static void main(String[] args) throws SQLException {
  2. SimpleDataSource dataSource = new SimpleDataSource("org.sqlite.JDBC", "jdbc:sqlite:/E:p1010.db");
  3. SimpleJdbc jdbc = new SimpleJdbc(dataSource);
  4. List<User> list = (List<User>) jdbc.queryForBean("select * from t_user", new RowMapper<User>() {
  5. User user = null;
  6.  
  7. @Override
  8. public User mapRow(ResultSet rs) throws SQLException {
  9. user = new User();
  10. user.setId(rs.getInt("id"));
  11. user.setUsername(rs.getString("username"));
  12. return user;
  13. }
  14. });
  15. for (User user : list) {
  16. System.out.println(user.getId() + "---" + user.getUsername());
  17. }
  18. }

简易高重用的jdbcutils工具封装实现类以及简易连接池实现的更多相关文章

  1. DBUtils工具类和DBCP连接池

    今日内容介绍 1.DBUtils2.处理结果集的八种方式3.连接池4.连接池的用法1 PrepareStatement接口预编译SQL语句 1.1 预处理对象 * 使用PreparedStatemen ...

  2. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  3. 通过jdbc完成单表的curd操作以及对JDBCUtils的封装

    概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...

  4. Druid 连接池 JDBCUtils 工具类的使用

    Druid工具介绍 它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. 支持所有JDBC兼容的数据库,包括Oracle.MySQL. ...

  5. day17(JDBC入门&jdbcUtils工具介绍)

    day17 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中url ...

  6. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  7. JavaWeb基础之JdbcUtils工具类final

    JdbcUtils工具类3.0最终版,添加了事务相关功能和释放链接.最终版本可以直接打成jar包,在后面的基本项目都会使用该工具类 1. JdbcUtils代码 /** * 最终版 * @author ...

  8. JavaWeb基础之JdbcUtils工具类2.0

    使用c3p0连接池来改版JdbcUtils工具 1. 使用c3p0连接池获取连接,使代码更加简单 /** * 使用c3p0连接池做小工具 * JdbcUtils v2.0 * @author hui. ...

  9. JavaWeb基础之JdbcUtils工具类1.0

    2016年12月20日,第一次学习JDBC.看的是传智播客崔希凡老师的视频,东北口音很是风趣幽默,技术之牛让人膜拜.2017年9月21日,再次重温web知识,分享JdbcUtils工具类,用以接下来的 ...

随机推荐

  1. CSS 清除浮动的4种方法

    此为未清除浮动源代码,运行代码无法查看到父级元素浅黄色背景.<style type=”text/css”> <!– *{margin:0;padding:0;} body{font: ...

  2. SD卡给MCU升级

    目 录1. 前言2. 初识BootLoader2.1 百度百科的BootLoader2.2 BootLoader的简单理解2.3 BootLoader的作用3. BootLoader预备知识3.1 复 ...

  3. 理想中的SQL语句条件拼接方式

    背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...

  4. 【IDEA】IDEA创建Maven的Web项目并运行以及打包

     0.IDEA集成Maven并设置Maven的配置 idea15之后的版本,都自带了maven插件,idea14貌似需要自己安装,方法也很简单:File->Settings->Plugin ...

  5. 不只是内存分析工具~valgrind

    体系结构:原理介绍·参考好文:应用 Valgrind 发现 Linux 程序的内存问题 简单组一个摘要: Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一 ...

  6. C++虚函数表解析(基础篇)

    原文:http://blog.csdn.net/haoel/article/details/1948051 一.简介  C++中的虚函数的作用主要是实现了多态的机制.虚函数(Virtual Funct ...

  7. 基于UDT connect连接通信以及文件传输--客户端

    上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已.在这里,客户端所进行的主要 ...

  8. 【原创】CMD命令设置IP地址

    问题描述 在实际工作中,尤其是像我们这种BI分析人员,在做项目的时候,时常都需要因客户的不同随时切换不同的网络环境,有时可能需要在公司和客户之间来回的穿梭.交替.问题也就随之而来:每次客户那里都需要设 ...

  9. NetStream配置

    http://support.huawei.com/enterprise/docinforeader!loadDocument1.action?contentId=DOC1000067951& ...

  10. .ner core InvalidOperationException: Cannot find compilation library location for package 'xxx' 和 SqlException: 'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。问题

    原文地址:传送门 1.InvalidOperationException: Cannot find compilation library location for package 'xxx'问题: ...