成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MySql+Socket 完成數(shù)據(jù)庫的增查Demo

番茄西紅柿 / 1272人閱讀

摘要:之前沒有試過利用技術(shù)完成請求這次也算是一次嘗試偶爾看到這個程序以防以后需要做個筆記

         需求: 利用MySql數(shù)據(jù)庫結(jié)合前端技術(shù)完成用戶的注冊(要求不使用Web服務(wù)技術(shù)),所以 Demo采用Socket技術(shù)實現(xiàn)Web通信.

第一部分:數(shù)據(jù)庫創(chuàng)建

數(shù)據(jù)庫采用mysql 5.7.18, 數(shù)據(jù)庫名稱為MyUser, 內(nèi)部有一張表 user.字段有 Id,UserName,Psd,Tel

 

第二部分:數(shù)據(jù)庫連接與Socket通信

創(chuàng)建控制臺程序(服務(wù)端程序),添加以下類

1 MySqlHelper

 建立MySqlHelper 類,用于實現(xiàn)數(shù)據(jù)庫操作

public class MysqlHelper
    {
        //數(shù)據(jù)庫連接字符串 
        public static string Conn = "Database=Myuser;Data Source=localhost;User Id=root;Password=;charset=utf8"; //XXX的為修改項
        
        public static   void SetConn(string UserName = "root", string Password="", string IP= "localhost",   string Database="Myuser")
        {
            Conn = "datasource=" + IP + ";username=" + UserName + ";password=" + Password + ";database=" + Database + ";charset=utf8";
           
        }
        ///  
        /// 給定連接的數(shù)據(jù)庫用假設(shè)參數(shù)執(zhí)行一個sql命令(不返回數(shù)據(jù)集) 
        ///  
        /// 一個有效的連接字符串 
        /// 命令類型(存儲過程, 文本, 等等) 
        /// 存儲過程名稱或者sql命令語句 
        /// 執(zhí)行命令所用參數(shù)的集合 
        /// 執(zhí)行命令所影響的行數(shù) 
        public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {

            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection conn = new MySqlConnection(connectionString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }

        ///  
        /// 用現(xiàn)有的數(shù)據(jù)庫連接執(zhí)行一個sql命令(不返回數(shù)據(jù)集) 
        ///  
        /// 一個現(xiàn)有的數(shù)據(jù)庫連接 
        /// 命令類型(存儲過程, 文本, 等等) 
        /// 存儲過程名稱或者sql命令語句 
        /// 執(zhí)行命令所用參數(shù)的集合 
        /// 執(zhí)行命令所影響的行數(shù) 
        public static int ExecuteNonQuery(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {

            MySqlCommand cmd = new MySqlCommand();

            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
            int val = cmd.ExecuteNonQuery();
            //cmd.Parameters.Clear();
            return val;
        }

        ///  
        ///使用現(xiàn)有的SQL事務(wù)執(zhí)行一個sql命令(不返回數(shù)據(jù)集) 
        ///  
        ///  
        ///舉例: 
        /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); 
        ///  
        /// 一個現(xiàn)有的事務(wù) 
        /// 命令類型(存儲過程, 文本, 等等) 
        /// 存儲過程名稱或者sql命令語句 
        /// 執(zhí)行命令所用參數(shù)的集合 
        /// 執(zhí)行命令所影響的行數(shù) 
        public static int ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            MySqlCommand cmd = new MySqlCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
            int val = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            return val;
        }

        ///  
        /// 用執(zhí)行的數(shù)據(jù)庫連接執(zhí)行一個返回數(shù)據(jù)集的sql命令 
        ///  
        ///  
        /// 舉例: 
        /// MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); 
        ///  
        /// 一個有效的連接字符串 
        /// 命令類型(存儲過程, 文本, 等等) 
        /// 存儲過程名稱或者sql命令語句 
        /// 執(zhí)行命令所用參數(shù)的集合 
        /// 包含結(jié)果的讀取器 
        public static MySqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            //創(chuàng)建一個MySqlCommand對象 
            MySqlCommand cmd = new MySqlCommand();
            //創(chuàng)建一個MySqlConnection對象 
            MySqlConnection conn = new MySqlConnection(connectionString);

            //在這里我們用一個try/catch結(jié)構(gòu)執(zhí)行sql文本命令/存儲過程,因為如果這個方法產(chǎn)生一個異常我們要關(guān)閉連接,因為沒有讀取器存在, 
            //因此commandBehaviour.CloseConnection 就不會執(zhí)行 
            try
            {
                //調(diào)用 PrepareCommand 方法,對 MySqlCommand 對象設(shè)置參數(shù) 
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                //調(diào)用 MySqlCommand 的 ExecuteReader 方法 
                MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                //清除參數(shù) 
                cmd.Parameters.Clear();
                return reader;
            }
            catch
            {
                //關(guān)閉連接,拋出異常 
                conn.Close();
                throw;
            }
        }

        ///  
        /// 返回DataSet 
        ///  
        /// 一個有效的連接字符串 
        /// 命令類型(存儲過程, 文本, 等等) 
        /// 存儲過程名稱或者sql命令語句 
        /// 執(zhí)行命令所用參數(shù)的集合 
        ///  
        public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            //創(chuàng)建一個MySqlCommand對象 
            MySqlCommand cmd = new MySqlCommand();
            //創(chuàng)建一個MySqlConnection對象 
            MySqlConnection conn = new MySqlConnection(connectionString);

            //在這里我們用一個try/catch結(jié)構(gòu)執(zhí)行sql文本命令/存儲過程,因為如果這個方法產(chǎn)生一個異常我們要關(guān)閉連接,因為沒有讀取器存在,

            try
            {
                //調(diào)用 PrepareCommand 方法,對 MySqlCommand 對象設(shè)置參數(shù) 
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                //調(diào)用 MySqlCommand 的 ExecuteReader 方法 
                MySqlDataAdapter adapter = new MySqlDataAdapter();
                adapter.SelectCommand = cmd;
                DataSet ds = new DataSet();

                adapter.Fill(ds);
                //清除參數(shù) 
                cmd.Parameters.Clear();
                conn.Close();
                return ds;
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        public static DataTable GetDataTable(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            //創(chuàng)建一個MySqlCommand對象 
            MySqlCommand cmd = new MySqlCommand();
            //創(chuàng)建一個MySqlConnection對象 
            MySqlConnection conn = new MySqlConnection(connectionString);

            //在這里我們用一個try/catch結(jié)構(gòu)執(zhí)行sql文本命令/存儲過程,因為如果這個方法產(chǎn)生一個異常我們要關(guān)閉連接,因為沒有讀取器存在,

            try
            {
                //調(diào)用 PrepareCommand 方法,對 MySqlCommand 對象設(shè)置參數(shù) 
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                //調(diào)用 MySqlCommand 的 ExecuteReader 方法 
                MySqlDataAdapter adapter = new MySqlDataAdapter();
                adapter.SelectCommand = cmd;
                DataTable ds = new DataTable();

                adapter.Fill(ds);
                //清除參數(shù) 
                cmd.Parameters.Clear();
                conn.Close();
                return ds;
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        ///  
        /// 用指定的數(shù)據(jù)庫連接字符串執(zhí)行一個命令并返回一個數(shù)據(jù)集的第一列 
        ///  
        ///  
        ///例如: 
        /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); 
        ///  
        ///一個有效的連接字符串 
        /// 命令類型(存儲過程, 文本, 等等) 
        /// 存儲過程名稱或者sql命令語句 
        /// 執(zhí)行命令所用參數(shù)的集合 
        /// 用 Convert.To{Type}把類型轉(zhuǎn)換為想要的  
        public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
                object val = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return val;
            }
        }

        ///  
        /// 用指定的數(shù)據(jù)庫連接執(zhí)行一個命令并返回一個數(shù)據(jù)集的第一列 
        ///  
        ///  
        /// 例如: 
        /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); 
        ///  
        /// 一個存在的數(shù)據(jù)庫連接 
        /// 命令類型(存儲過程, 文本, 等等) 
        /// 存儲過程名稱或者sql命令語句 
        /// 執(zhí)行命令所用參數(shù)的集合 
        /// 用 Convert.To{Type}把類型轉(zhuǎn)換為想要的  
        public static object ExecuteScalar(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {

            MySqlCommand cmd = new MySqlCommand();

            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;
        }




        ///  
        /// 準備執(zhí)行一個命令 
        ///  
        /// sql命令 
        /// OleDb連接 
        /// OleDb事務(wù) 
        /// 命令類型例如 存儲過程或者文本 
        /// 命令文本,例如:Select * from Products 
        /// 執(zhí)行命令的參數(shù) 
        private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)

            {

                foreach (MySqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }

    }

  

2,User類與UserHelper類

建立用戶類User與用戶操作類UserHelper

User

public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Psd { get; set; }
        public string PhoneNum { get; set; }

     
    }

  

UserHelper

public   class UserHelper
    {


        /// 
        /// 獲取用戶列表
        /// 
        /// 
        /// 
        public static  List GetUsers()
        {
            var cmdText = "select * from Users";
            var data = MysqlHelper.GetDataSet(MysqlHelper.Conn, System.Data.CommandType.Text, cmdText, new MySql.Data.MySqlClient.MySqlParameter());
            List userList = new List();
            foreach (DataRow row in data.Tables[0].Rows)
            {
                User user = new User();
                user.Id = int.Parse(row[0].ToString());
                user.UserName=(row[1].ToString());
                user.Psd=(row[2].ToString());
                user.PhoneNum=(row[3].ToString());
                userList.Add(user);
            }
            return userList;
        }
        /// 
        /// 根據(jù)姓名查找用戶
        /// 
        /// 
        /// 

        public static  User GetUserByName(string name)
        {
            var cmdText = "select * from Users Where UserName=?name";
            var pars = new MySql.Data.MySqlClient.MySqlParameter("?name", name);
            var data = MysqlHelper.GetDataSet(MysqlHelper.Conn, System.Data.CommandType.Text, cmdText, pars);
            User user = new User();
            if (data.Tables.Count == 0)
            {
                return null;
            }
            if (data.Tables[0].Rows.Count != 1)
            {
                return null;
            }
            foreach (DataRow row in data.Tables[0].Rows)
            {               
                user.Id = int.Parse(row[0].ToString());
                user.UserName = (row[1].ToString());
                user.Psd = (row[2].ToString());
                user.PhoneNum = (row[3].ToString());
                ;
            }
            return user;
        }

        /// 
        /// 添加用戶
        /// 
        /// 
        /// 
        public static bool AddUser(User user)
        {
            var sqlInsert = "insert into Users(UserName,Psd,Tel) values" +
               "(" + user.UserName + "," + user.Psd + "," + user.PhoneNum + ")";           
            var parms = new MySqlParameter();

            var data = MysqlHelper.ExecuteNonQuery(MysqlHelper.Conn, System.Data.CommandType.Text, sqlInsert, parms);
           
            return data>0;


        }

    }

  

3 Socket

網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket.socket本質(zhì)是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;

利用Socket技術(shù),可以捕捉Http請求,獲取數(shù)據(jù).構(gòu)建SocketHelper類,獲取前端頁面請求.默認Socket 端口為8086

public class SocketHelper
    {


        static Socket m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        /// 
        /// Socket初始化 
        /// 
        public static bool  Init()
        {
            try
            {
                m_socket.Bind(new IPEndPoint(IPAddress.Any, 8086));
                m_socket.Listen(100);
                m_socket.BeginAccept(new AsyncCallback(OnAccept), m_socket);
                Console.WriteLine("開啟Socket服務(wù)成功!!");
                Console.Read();
                return true;
            }
            catch (Exception )
            {
                Console.WriteLine("開啟Socket服務(wù)失敗!!,請檢查網(wǎng)絡(luò),端口8086是否被占用!!!");
                Console.Read();
                return false;
            }
          
        }
        public static void Route(string path, Dictionary param, Socket response)
        {
            if (param.Count == 1)
            {
                try
                {
                    var userName = param["userName"];
                    var searUser = UserHelper.GetUserByName(userName);
                    if (searUser != null)
                    {
                        HomePage(response, "該用戶名已經(jīng)被占用!!");
                        Console.WriteLine("** - **");
                        Console.WriteLine("用戶名" + userName + "被占用");
                        Console.WriteLine("");
                        HomePage(response, "no");
                    }
                    else
                    {
                        HomePage(response, "ok");
                    }
                }
                catch (Exception e)
                {

                    HomePage(response, e.Message);
                    Console.WriteLine("** - **");
                    Console.WriteLine("發(fā)生錯誤,錯誤原因為" + e.Message);
                    Console.WriteLine("");
                }
               

                return;

            }
            else if (param.Count == 3) {
                try
                {
                    User user = new User();
                    user.UserName = param["userName"];
                    user.Psd = param["psd"];
                    user.PhoneNum = param["phoneNum"];
                    var isSuccess = UserHelper.AddUser(user);
                    if (isSuccess)
                    {
                        HomePage(response, "ok");
                        Console.WriteLine("** - **");
                        Console.WriteLine("用戶名為" + user.UserName + "已添加到數(shù)據(jù)庫!!");
                        Console.WriteLine("");
                    }
                    else
                    {
                        HomePage(response, "no");
                        Console.WriteLine("** - **");
                        Console.WriteLine("用戶名為" + user.UserName + "添加到數(shù)據(jù)庫失敗!!");
                        Console.WriteLine("");
                    }
                }
                catch (Exception e)
                {

                    HomePage(response, e.Message);
                    Console.WriteLine("** - **");
                    Console.WriteLine("發(fā)生錯誤,錯誤原因為" + e.Message);
                    Console.WriteLine("");
                }
            }
            else
            {
                HomePage(response, "參數(shù)錯誤!!");
                Console.WriteLine("** - **");
                Console.WriteLine("參數(shù)錯誤" );
                Console.WriteLine("");


            }
           

            return;
            
        }

        public static void OnAccept(IAsyncResult ar)
        {
            try
            {
                Socket socket = ar.AsyncState as Socket;
                Socket new_client = socket.EndAccept(ar);
                socket.BeginAccept(new AsyncCallback(OnAccept), socket);
                byte[] recv_buffer = new byte[1024 * 640];
                int real_recv = new_client.Receive(recv_buffer);

                string recv_request = Encoding.UTF8.GetString(recv_buffer, 0, real_recv);
                Console.WriteLine(recv_request);

                Resolve(recv_request, new_client);
            }
            catch
            {

            }
        }

        public static void Resolve(string request, Socket response)
        {
            string[] strs = request.Split(new string[] { "rn" }, StringSplitOptions.None);
            if (strs.Length > 0)
            {
                string[] items = strs[0].Split( );
                Dictionary param = new Dictionary();

                if (strs.Contains(""))
                {
                    string post_data = strs[strs.Length - 1];
                    if (post_data != "")
                    {
                        string[] post_datas = post_data.Split(&);
                        foreach (string s in post_datas)
                        {
                            param.Add(s.Split(=)[0], s.Split(=)[1]);
                        }
                    }
                }
                Route(items[1], param, response);
            }
        }

        public static void HomePage(Socket response,string result)
        {
            string statusline = "HTTP/1.1 200 OKrn";
            byte[] statusline_to_bytes = Encoding.UTF8.GetBytes(statusline);

            string content = result;
            byte[] content_to_bytes = Encoding.UTF8.GetBytes(content);

            string header = string.Format("Access-Control-Allow-Origin:*rnContent-Type:text/html;charset=UTF-8rnContent-Length:{0}rn", content_to_bytes.Length);
            byte[] header_to_bytes = Encoding.UTF8.GetBytes(header);

            response.Send(statusline_to_bytes);
            response.Send(header_to_bytes);
            response.Send(new byte[] { (byte)r, (byte)n });
            response.Send(content_to_bytes);
            response.Close();
        }
    }

  

第三部分 前端頁面與Ajax請求

 前端頁面設(shè)計為:

ajax請求代碼:

$(.red_button).click(function () {
  if (user_Boolean && password_Boolean && varconfirm_Boolean && Mobile_Boolean == true) {
    $.ajax({
      type: POST,
      url: http://127.0.0.1:8086/,
      data: {
        userName:$(#userName).val(),
        psd: $(#psd).val(),
        phoneNum: $(#phoneNum).val()
      },
      success: function (data) {
        if (data == "ok") {
          alert("注冊成功!!")
        } else {
          alert("data");
        }
        
      }

    });
  } 
  else {
    alert("請完善信息");
  }
});

 

至此,程序完成.運行程序進行驗證.

1:啟動服務(wù)端程序

 

 

2:啟動前端頁面,進行數(shù)據(jù)填寫

3 添加結(jié)果

 

    至此 ,Demo功能完成。之前沒有試過利用Socket技術(shù)完成Ajax請求,這次也算是一次嘗試,偶爾看到這個程序,以防以后需要 做個筆記..

 

 

 

 

 

 

 

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/1856.html

相關(guān)文章

  • 邁出全棧第一步,vue+node+mysql獨立完成前后端分離的增刪改查流程

    摘要:本使用創(chuàng)建本地服務(wù)器,在就能完成全部流程,并不需要線上服務(wù)器。路徑要與后端接口一致。后端返回成功后,前端數(shù)據(jù)中對應(yīng)的元素也要刪掉,更新視圖??刂破骼锬靡粋€方法出來說一下吧,完整的代碼都在。讀取操作完成后調(diào)用釋放連接。 寫在前面 本文只是本人學(xué)習(xí)過程的一個記錄,并不是什么非常嚴謹?shù)慕坛蹋M痛蠹乙黄鸸餐M步。也希望大家能指出我的問題。適合有一定基礎(chǔ),志在全棧的前端初學(xué)者學(xué)習(xí),從點擊按鈕...

    fsmStudy 評論0 收藏0
  • 數(shù)據(jù)庫相關(guān)異常分析

    摘要:起因最近一段時間,生產(chǎn)系統(tǒng)持續(xù)碰到一些數(shù)據(jù)庫異常,導(dǎo)致執(zhí)行失敗。綜上,若發(fā)生異常,為數(shù)據(jù)庫連接失效,但是失效的原因可能會有多種,大致都與各種參數(shù)相關(guān)。當時數(shù)據(jù)量大概多條,然后在批量插入時拋出該異常。 起因 最近一段時間,生產(chǎn)系統(tǒng)持續(xù)碰到一些數(shù)據(jù)庫異常,導(dǎo)致 sql 執(zhí)行失敗。 應(yīng)用環(huán)境 Java 1.7 + Mysql 5.6 + spring + ibatis 問題排查 將各種失敗的...

    IamDLY 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<