资讯专栏INFORMATION COLUMN

MySql+Socket 完成数据库的增查Demo

番茄西红柿 / 1325人阅读

摘要:之前没有试过利用技术完成请求这次也算是一次尝试偶尔看到这个程序以防以后需要做个笔记

         需求: 利用MySql数据库结合前端技术完成用户的注册(要求不使用Web服务技术),所以 Demo采用Socket技术实现Web通信.

第一部分:数据库创建

数据库采用mysql 5.7.18, 数据库名称为MyUser, 内部有一张表 user.字段有 Id,UserName,Psd,Tel

 

第二部分:数据库连接与Socket通信

创建控制台程序(服务端程序),添加以下类

1 MySqlHelper

 建立MySqlHelper 类,用于实现数据库操作

</>复制代码

  1. public class MysqlHelper
  2. {
  3. //数据库连接字符串
  4. public static string Conn = "Database=Myuser;Data Source=localhost;User Id=root;Password=;charset=utf8"; //XXX的为修改项
  5. public static void SetConn(string UserName = "root", string Password="", string IP= "localhost", string Database="Myuser")
  6. {
  7. Conn = "datasource=" + IP + ";username=" + UserName + ";password=" + Password + ";database=" + Database + ";charset=utf8";
  8. }
  9. ///
  10. /// 给定连接的数据库用假设参数执行一个sql命令(不返回数据集)
  11. ///
  12. /// 一个有效的连接字符串
  13. /// 命令类型(存储过程, 文本, 等等)
  14. /// 存储过程名称或者sql命令语句
  15. /// 执行命令所用参数的集合
  16. /// 执行命令所影响的行数
  17. public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  18. {
  19. MySqlCommand cmd = new MySqlCommand();
  20. using (MySqlConnection conn = new MySqlConnection(connectionString))
  21. {
  22. PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
  23. int val = cmd.ExecuteNonQuery();
  24. cmd.Parameters.Clear();
  25. return val;
  26. }
  27. }
  28. ///
  29. /// 用现有的数据库连接执行一个sql命令(不返回数据集)
  30. ///
  31. /// 一个现有的数据库连接
  32. /// 命令类型(存储过程, 文本, 等等)
  33. /// 存储过程名称或者sql命令语句
  34. /// 执行命令所用参数的集合
  35. /// 执行命令所影响的行数
  36. public static int ExecuteNonQuery(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  37. {
  38. MySqlCommand cmd = new MySqlCommand();
  39. PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
  40. int val = cmd.ExecuteNonQuery();
  41. //cmd.Parameters.Clear();
  42. return val;
  43. }
  44. ///
  45. ///使用现有的SQL事务执行一个sql命令(不返回数据集)
  46. ///
  47. ///
  48. ///举例:
  49. /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
  50. ///
  51. /// 一个现有的事务
  52. /// 命令类型(存储过程, 文本, 等等)
  53. /// 存储过程名称或者sql命令语句
  54. /// 执行命令所用参数的集合
  55. /// 执行命令所影响的行数
  56. public static int ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  57. {
  58. MySqlCommand cmd = new MySqlCommand();
  59. PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
  60. int val = cmd.ExecuteNonQuery();
  61. cmd.Parameters.Clear();
  62. return val;
  63. }
  64. ///
  65. /// 用执行的数据库连接执行一个返回数据集的sql命令
  66. ///
  67. ///
  68. /// 举例:
  69. /// MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
  70. ///
  71. /// 一个有效的连接字符串
  72. /// 命令类型(存储过程, 文本, 等等)
  73. /// 存储过程名称或者sql命令语句
  74. /// 执行命令所用参数的集合
  75. /// 包含结果的读取器
  76. public static MySqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  77. {
  78. //创建一个MySqlCommand对象
  79. MySqlCommand cmd = new MySqlCommand();
  80. //创建一个MySqlConnection对象
  81. MySqlConnection conn = new MySqlConnection(connectionString);
  82. //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在,
  83. //因此commandBehaviour.CloseConnection 就不会执行
  84. try
  85. {
  86. //调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数
  87. PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
  88. //调用 MySqlCommand 的 ExecuteReader 方法
  89. MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  90. //清除参数
  91. cmd.Parameters.Clear();
  92. return reader;
  93. }
  94. catch
  95. {
  96. //关闭连接,抛出异常
  97. conn.Close();
  98. throw;
  99. }
  100. }
  101. ///
  102. /// 返回DataSet
  103. ///
  104. /// 一个有效的连接字符串
  105. /// 命令类型(存储过程, 文本, 等等)
  106. /// 存储过程名称或者sql命令语句
  107. /// 执行命令所用参数的集合
  108. ///
  109. public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  110. {
  111. //创建一个MySqlCommand对象
  112. MySqlCommand cmd = new MySqlCommand();
  113. //创建一个MySqlConnection对象
  114. MySqlConnection conn = new MySqlConnection(connectionString);
  115. //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在,
  116. try
  117. {
  118. //调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数
  119. PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
  120. //调用 MySqlCommand 的 ExecuteReader 方法
  121. MySqlDataAdapter adapter = new MySqlDataAdapter();
  122. adapter.SelectCommand = cmd;
  123. DataSet ds = new DataSet();
  124. adapter.Fill(ds);
  125. //清除参数
  126. cmd.Parameters.Clear();
  127. conn.Close();
  128. return ds;
  129. }
  130. catch (Exception e)
  131. {
  132. throw e;
  133. }
  134. }
  135. public static DataTable GetDataTable(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  136. {
  137. //创建一个MySqlCommand对象
  138. MySqlCommand cmd = new MySqlCommand();
  139. //创建一个MySqlConnection对象
  140. MySqlConnection conn = new MySqlConnection(connectionString);
  141. //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在,
  142. try
  143. {
  144. //调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数
  145. PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
  146. //调用 MySqlCommand 的 ExecuteReader 方法
  147. MySqlDataAdapter adapter = new MySqlDataAdapter();
  148. adapter.SelectCommand = cmd;
  149. DataTable ds = new DataTable();
  150. adapter.Fill(ds);
  151. //清除参数
  152. cmd.Parameters.Clear();
  153. conn.Close();
  154. return ds;
  155. }
  156. catch (Exception e)
  157. {
  158. throw e;
  159. }
  160. }
  161. ///
  162. /// 用指定的数据库连接字符串执行一个命令并返回一个数据集的第一列
  163. ///
  164. ///
  165. ///例如:
  166. /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
  167. ///
  168. ///一个有效的连接字符串
  169. /// 命令类型(存储过程, 文本, 等等)
  170. /// 存储过程名称或者sql命令语句
  171. /// 执行命令所用参数的集合
  172. /// 用 Convert.To{Type}把类型转换为想要的
  173. public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  174. {
  175. MySqlCommand cmd = new MySqlCommand();
  176. using (MySqlConnection connection = new MySqlConnection(connectionString))
  177. {
  178. PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
  179. object val = cmd.ExecuteScalar();
  180. cmd.Parameters.Clear();
  181. return val;
  182. }
  183. }
  184. ///
  185. /// 用指定的数据库连接执行一个命令并返回一个数据集的第一列
  186. ///
  187. ///
  188. /// 例如:
  189. /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
  190. ///
  191. /// 一个存在的数据库连接
  192. /// 命令类型(存储过程, 文本, 等等)
  193. /// 存储过程名称或者sql命令语句
  194. /// 执行命令所用参数的集合
  195. /// 用 Convert.To{Type}把类型转换为想要的
  196. public static object ExecuteScalar(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
  197. {
  198. MySqlCommand cmd = new MySqlCommand();
  199. PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
  200. object val = cmd.ExecuteScalar();
  201. cmd.Parameters.Clear();
  202. return val;
  203. }
  204. ///
  205. /// 准备执行一个命令
  206. ///
  207. /// sql命令
  208. /// OleDb连接
  209. /// OleDb事务
  210. /// 命令类型例如 存储过程或者文本
  211. /// 命令文本,例如:Select * from Products
  212. /// 执行命令的参数
  213. private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
  214. {
  215. if (conn.State != ConnectionState.Open)
  216. conn.Open();
  217. cmd.Connection = conn;
  218. cmd.CommandText = cmdText;
  219. if (trans != null)
  220. cmd.Transaction = trans;
  221. cmd.CommandType = cmdType;
  222. if (cmdParms != null)
  223. {
  224. foreach (MySqlParameter parm in cmdParms)
  225. cmd.Parameters.Add(parm);
  226. }
  227. }
  228. }

  

2,User类与UserHelper类

建立用户类User与用户操作类UserHelper

User

</>复制代码

  1. public class User
  2. {
  3. public int Id { get; set; }
  4. public string UserName { get; set; }
  5. public string Psd { get; set; }
  6. public string PhoneNum { get; set; }
  7. }

  

UserHelper

</>复制代码

  1. public class UserHelper
  2. {
  3. ///
  4. /// 获取用户列表
  5. ///
  6. ///
  7. ///
  8. public static List GetUsers()
  9. {
  10. var cmdText = "select * from Users";
  11. var data = MysqlHelper.GetDataSet(MysqlHelper.Conn, System.Data.CommandType.Text, cmdText, new MySql.Data.MySqlClient.MySqlParameter());
  12. List userList = new List();
  13. foreach (DataRow row in data.Tables[0].Rows)
  14. {
  15. User user = new User();
  16. user.Id = int.Parse(row[0].ToString());
  17. user.UserName=(row[1].ToString());
  18. user.Psd=(row[2].ToString());
  19. user.PhoneNum=(row[3].ToString());
  20. userList.Add(user);
  21. }
  22. return userList;
  23. }
  24. ///
  25. /// 根据姓名查找用户
  26. ///
  27. ///
  28. ///
  29. public static User GetUserByName(string name)
  30. {
  31. var cmdText = "select * from Users Where UserName=?name";
  32. var pars = new MySql.Data.MySqlClient.MySqlParameter("?name", name);
  33. var data = MysqlHelper.GetDataSet(MysqlHelper.Conn, System.Data.CommandType.Text, cmdText, pars);
  34. User user = new User();
  35. if (data.Tables.Count == 0)
  36. {
  37. return null;
  38. }
  39. if (data.Tables[0].Rows.Count != 1)
  40. {
  41. return null;
  42. }
  43. foreach (DataRow row in data.Tables[0].Rows)
  44. {
  45. user.Id = int.Parse(row[0].ToString());
  46. user.UserName = (row[1].ToString());
  47. user.Psd = (row[2].ToString());
  48. user.PhoneNum = (row[3].ToString());
  49. ;
  50. }
  51. return user;
  52. }
  53. ///
  54. /// 添加用户
  55. ///
  56. ///
  57. ///
  58. public static bool AddUser(User user)
  59. {
  60. var sqlInsert = "insert into Users(UserName,Psd,Tel) values" +
  61. "(" + user.UserName + "," + user.Psd + "," + user.PhoneNum + ")";
  62. var parms = new MySqlParameter();
  63. var data = MysqlHelper.ExecuteNonQuery(MysqlHelper.Conn, System.Data.CommandType.Text, sqlInsert, parms);
  64. return data>0;
  65. }
  66. }

  

3 Socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;

利用Socket技术,可以捕捉Http请求,获取数据.构建SocketHelper类,获取前端页面请求.默认Socket 端口为8086

</>复制代码

  1. public class SocketHelper
  2. {
  3. static Socket m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  4. ///
  5. /// Socket初始化
  6. ///
  7. public static bool Init()
  8. {
  9. try
  10. {
  11. m_socket.Bind(new IPEndPoint(IPAddress.Any, 8086));
  12. m_socket.Listen(100);
  13. m_socket.BeginAccept(new AsyncCallback(OnAccept), m_socket);
  14. Console.WriteLine("开启Socket服务成功!!");
  15. Console.Read();
  16. return true;
  17. }
  18. catch (Exception )
  19. {
  20. Console.WriteLine("开启Socket服务失败!!,请检查网络,端口8086是否被占用!!!");
  21. Console.Read();
  22. return false;
  23. }
  24. }
  25. public static void Route(string path, Dictionary param, Socket response)
  26. {
  27. if (param.Count == 1)
  28. {
  29. try
  30. {
  31. var userName = param["userName"];
  32. var searUser = UserHelper.GetUserByName(userName);
  33. if (searUser != null)
  34. {
  35. HomePage(response, "该用户名已经被占用!!");
  36. Console.WriteLine("** - **");
  37. Console.WriteLine("用户名" + userName + "被占用");
  38. Console.WriteLine("");
  39. HomePage(response, "no");
  40. }
  41. else
  42. {
  43. HomePage(response, "ok");
  44. }
  45. }
  46. catch (Exception e)
  47. {
  48. HomePage(response, e.Message);
  49. Console.WriteLine("** - **");
  50. Console.WriteLine("发生错误,错误原因为" + e.Message);
  51. Console.WriteLine("");
  52. }
  53. return;
  54. }
  55. else if (param.Count == 3) {
  56. try
  57. {
  58. User user = new User();
  59. user.UserName = param["userName"];
  60. user.Psd = param["psd"];
  61. user.PhoneNum = param["phoneNum"];
  62. var isSuccess = UserHelper.AddUser(user);
  63. if (isSuccess)
  64. {
  65. HomePage(response, "ok");
  66. Console.WriteLine("** - **");
  67. Console.WriteLine("用户名为" + user.UserName + "已添加到数据库!!");
  68. Console.WriteLine("");
  69. }
  70. else
  71. {
  72. HomePage(response, "no");
  73. Console.WriteLine("** - **");
  74. Console.WriteLine("用户名为" + user.UserName + "添加到数据库失败!!");
  75. Console.WriteLine("");
  76. }
  77. }
  78. catch (Exception e)
  79. {
  80. HomePage(response, e.Message);
  81. Console.WriteLine("** - **");
  82. Console.WriteLine("发生错误,错误原因为" + e.Message);
  83. Console.WriteLine("");
  84. }
  85. }
  86. else
  87. {
  88. HomePage(response, "参数错误!!");
  89. Console.WriteLine("** - **");
  90. Console.WriteLine("参数错误" );
  91. Console.WriteLine("");
  92. }
  93. return;
  94. }
  95. public static void OnAccept(IAsyncResult ar)
  96. {
  97. try
  98. {
  99. Socket socket = ar.AsyncState as Socket;
  100. Socket new_client = socket.EndAccept(ar);
  101. socket.BeginAccept(new AsyncCallback(OnAccept), socket);
  102. byte[] recv_buffer = new byte[1024 * 640];
  103. int real_recv = new_client.Receive(recv_buffer);
  104. string recv_request = Encoding.UTF8.GetString(recv_buffer, 0, real_recv);
  105. Console.WriteLine(recv_request);
  106. Resolve(recv_request, new_client);
  107. }
  108. catch
  109. {
  110. }
  111. }
  112. public static void Resolve(string request, Socket response)
  113. {
  114. string[] strs = request.Split(new string[] { "rn" }, StringSplitOptions.None);
  115. if (strs.Length > 0)
  116. {
  117. string[] items = strs[0].Split( );
  118. Dictionary param = new Dictionary();
  119. if (strs.Contains(""))
  120. {
  121. string post_data = strs[strs.Length - 1];
  122. if (post_data != "")
  123. {
  124. string[] post_datas = post_data.Split(&);
  125. foreach (string s in post_datas)
  126. {
  127. param.Add(s.Split(=)[0], s.Split(=)[1]);
  128. }
  129. }
  130. }
  131. Route(items[1], param, response);
  132. }
  133. }
  134. public static void HomePage(Socket response,string result)
  135. {
  136. string statusline = "HTTP/1.1 200 OKrn";
  137. byte[] statusline_to_bytes = Encoding.UTF8.GetBytes(statusline);
  138. string content = result;
  139. byte[] content_to_bytes = Encoding.UTF8.GetBytes(content);
  140. string header = string.Format("Access-Control-Allow-Origin:*rnContent-Type:text/html;charset=UTF-8rnContent-Length:{0}rn", content_to_bytes.Length);
  141. byte[] header_to_bytes = Encoding.UTF8.GetBytes(header);
  142. response.Send(statusline_to_bytes);
  143. response.Send(header_to_bytes);
  144. response.Send(new byte[] { (byte)r, (byte)n });
  145. response.Send(content_to_bytes);
  146. response.Close();
  147. }
  148. }

  

第三部分 前端页面与Ajax请求

 前端页面设计为:

ajax请求代码:

</>复制代码

  1. $(.red_button).click(function () {
  2. if (user_Boolean && password_Boolean && varconfirm_Boolean && Mobile_Boolean == true) {
  3. $.ajax({
  4. type: POST,
  5. url: http://127.0.0.1:8086/,
  6. data: {
  7. userName:$(#userName).val(),
  8. psd: $(#psd).val(),
  9. phoneNum: $(#phoneNum).val()
  10. },
  11. success: function (data) {
  12. if (data == "ok") {
  13. alert("注册成功!!")
  14. } else {
  15. alert("data");
  16. }
  17. }
  18. });
  19. }
  20. else {
  21. alert("请完善信息");
  22. }
  23. });

 

至此,程序完成.运行程序进行验证.

1:启动服务端程序

 

 

2:启动前端页面,进行数据填写

3 添加结果

 

    至此 ,Demo功能完成。之前没有试过利用Socket技术完成Ajax请求,这次也算是一次尝试,偶尔看到这个程序,以防以后需要 做个笔记..

 

 

 

 

 

 

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/1856.html

相关文章

  • 迈出全栈第一步,vue+node+mysql独立完成前后端分离的增删改查流程

    摘要:本使用创建本地服务器,在就能完成全部流程,并不需要线上服务器。路径要与后端接口一致。后端返回成功后,前端数据中对应的元素也要删掉,更新视图。控制器里拿一个方法出来说一下吧,完整的代码都在。读取操作完成后调用释放连接。 写在前面 本文只是本人学习过程的一个记录,并不是什么非常严谨的教程,希望和大家一起共同进步。也希望大家能指出我的问题。适合有一定基础,志在全栈的前端初学者学习,从点击按钮...

    fsmStudy 评论0 收藏0
  • 据库相关异常分析

    摘要:起因最近一段时间,生产系统持续碰到一些数据库异常,导致执行失败。综上,若发生异常,为数据库连接失效,但是失效的原因可能会有多种,大致都与各种参数相关。当时数据量大概多条,然后在批量插入时抛出该异常。 起因 最近一段时间,生产系统持续碰到一些数据库异常,导致 sql 执行失败。 应用环境 Java 1.7 + Mysql 5.6 + spring + ibatis 问题排查 将各种失败的...

    IamDLY 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<