第十三周作业

目录

0、数据库操作技术、ADO.NET技术讲解【重要!非常重要!特别重要!非常无比特别的重要!】

1、创建一个控制台程序,演示如何连接MS-SQL数据库(为了简化程序功能,我们使用了固定连接字符串信息连接数据库)。

2、创建一个控制台程序,演示如何读取【操作员表】Table_czy中的所有记录。

3、创建一个WinForm应用程序,演示如何动态获取与数据库连接相关的信息,并进行数据库连接。

4、对之前【week07】中的登录认证演示程序【Demo_LoginForm】进行升级,演示如何利用【操作员表】中的用户信息进行登录验证。

5、课后拓展练习,优化并改造上述第2、3、4、5中的Demo程序,把数据库操作相关的功能独立出来,形成一个单独的数据库操作类。


0、数据库操作技术、ADO.NET技术讲解【重要!非常重要!特别重要!非常无比特别的重要!】

详见:https://blog.csdn.net/xieyunc/article/details/90441902

以下DEMO所需用到的MS SQL Server数据库、数据表、及相关信息如下:

数据库服务器:172.18.4.13,【如果本机就是数据库服务器的话,可直接写成:(local) ,因动漫学院机房中的MS SQL Server 2014安装时选择了多实例安装方式,故动漫学院机房中的本机数据库服务器名为:(local)\sqlexpress】。

认证模式:SQL Server 和 Windows 身份验证模式,即混合认证模式,可以以Windows身份验证方式,以administrator的身份登录MS SQL Server管理器,通过鼠标右键单击“对象资源管理器|数据库服务器|属性”,在服务器属性对话框的“安全性”页面中更改登录验证模式,更改了登录验证模式后,必须重启MS SQL Server服务,配置才能生效。

数据库名称:xscj_db           

SQL登录用户名:xscjgl_sa           

登录密码:abcd@1234

Demo中的远程数据库连接字符串为:

_sqlConn.ConnectionString = "Data Source=172.18.4.13;DataBase=xscj_db;User ID=xscjgl_sa;Password=abcd@123;"

动漫学院机房的本机数据库连接字符串为:

_sqlConn.ConnectionString = @"Data Source=(local)\sqlexpress;DataBase=xscj_db;User ID=xscjgl_sa;Password=abcd@123;"

1、创建一个控制台程序,演示如何连接MS-SQL数据库(为了简化程序功能,我们使用了固定连接字符串信息连接数据库)。

           

 

①、Console程序主类文件--Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace Demo_SqlConnByConsole
{
    class Program
    {
        private static string GetConnStr(string datasource, string database, string loginUser, string loginPwd)
        {
            //真实的项目开发时,应该从配置文件中获取数据库连接信息
            return "Data Source=" + datasource + ";Initial Catalog=" + database + ";Persist Security Info=True;User ID=" + loginUser + ";Password=" + loginPwd;
        }

        private static void LinkDbSrv(string dbSrv, string dbName, string loginUser, string loginPwd)
        {
            //string connStr = "Data Source=172.18.4.13;Initial Catalog=xscj_db;Persist Security Info=True;User ID=xscjgl_sa;Password=abcd@1234;";
            string connStr = GetConnStr(dbSrv, dbName, loginUser, loginPwd);
            SqlConnection sqlConn = new SqlConnection();
            sqlConn.ConnectionString = connStr;
            try
            {
                sqlConn.Open();
            }
            catch (Exception e)
            {
                Console.WriteLine("数据库连接失败!请检查配置文件信息!"+e.Message);
                Console.WriteLine(connStr);
                return;
            }

            if (sqlConn.State == System.Data.ConnectionState.Open)
                Console.WriteLine("数据库连接成功!当前连接信息为:");
            else
                Console.WriteLine("数据库连接失败!当前连接信息为:");

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("数据库服务器:{0}", sqlConn.DataSource);
            Console.WriteLine("登录数据库名:{0}", sqlConn.Database);
            Console.WriteLine("登录用户名为:{0}", loginUser);
            Console.WriteLine("登录用户密码:{0}", loginPwd);
            Console.WriteLine("--------------------------------------");

            sqlConn.Close();//后面的代码不再需要对数据库的操作了,直接断开与数据库的连接
            return;
        }

        static void Main(string[] args)
        {
            //真实的项目开发中,应该从配置文件中获取数据库的各种连接信息
            string dbSrv = "172.18.4.13";     //数据库服务器IP
            string dbName = "xscj_db";         //数据库名称
            string loginUser = "xscjgl_sa";       //登录名
            string loginPwd = "abcd@1234";       //登录密码

            LinkDbSrv(dbSrv, dbName, loginUser, loginPwd);


            Console.WriteLine("\r\n\r\n=========下面使用外部自定义数据库操作类的方式连接数据库============\r\n\r\n");

            XyfdDB myDb = new XyfdDB(dbSrv, dbName, loginUser, loginPwd);
            myDb.LinkDbSrv();
            myDb.Close();


            Console.ReadKey();
        }
    }
}

 

②、自定义数据库操作类文件--XyfdDB.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace Demo_SqlConnByConsole
{
    class XyfdDB
    {
        private string _datasource = "";
        private string _database = "";
        private string _loginUser = "";
        private string _loginPwd = "";

        private SqlConnection _sqlConn;
        private string GetConnStr(string datasource,string database,string loginUser,string loginPwd)
        {
            _datasource = datasource;
            _database = database;
            _loginUser = loginUser;
            _loginPwd = loginPwd;

            return "Data Source="+_datasource+";Initial Catalog="+_database+";Persist Security Info=True;User ID=" + _loginUser + ";Password=" + _loginPwd;
        }

        public XyfdDB(string datasource, string database, string loginUser, string loginPwd)
        {
            string connStr = GetConnStr(datasource,database,loginUser,loginPwd);
            _sqlConn = new SqlConnection();
            _sqlConn.ConnectionString = connStr;
        }

        public void Close()
        {
            _sqlConn.Close();//后面的代码不再需要对数据库的操作了,直接断开与数据库的连接
        }

        public bool LinkDbSrv()
        {
            try
            {
                _sqlConn.Open();
            }
            catch (Exception e)
            {
                Console.WriteLine("数据库连接失败!请检查配置文件信息!");
                Console.WriteLine(_sqlConn.ConnectionString);
            }

            if (_sqlConn.State == System.Data.ConnectionState.Open)
                Console.WriteLine("数据库连接成功!当前连接信息为:");
            else
                Console.WriteLine("数据库连接失败!当前连接信息为:");

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("数据库服务器:{0}", _sqlConn.DataSource);
            Console.WriteLine("登录数据库名:{0}", _sqlConn.Database);
            Console.WriteLine("登录用户名为:{0}", _loginUser);
            Console.WriteLine("登录用户密码:{0}", _loginPwd);
            Console.WriteLine("--------------------------------------");

            return _sqlConn.State == System.Data.ConnectionState.Open;
        }
    }
}

2、创建一个控制台程序,演示如何读取【操作员表】Table_czy中的所有记录。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace Demo_DataReader
{
    /// <summary>
    /// 程序功能:数据库的连接和数据表的读取操作演示DEMO
    /// 注意事项:须引入System.Data.SqlClient命名空间
    /// 设计作者:小宇飞刀(xieyunc) 2019-05-26
    /// </summary>
    class Program
    {
        private static void ReadCzyTableInfo()
        {
            string connStr = "Data Source=172.18.4.13;Initial Catalog=xscj_db;Persist Security Info=True;User ID=xscjgl_sa;Password=abcd@1234";
            SqlConnection sqlConn = new SqlConnection();
            sqlConn.ConnectionString = connStr;
            try
            {
                sqlConn.Open();
            }
            catch (Exception e)
            {
                Console.WriteLine("数据库连接失败!请检查配置文件信息!");
                Console.WriteLine(connStr);
                return;
            }

            //查询操作员表的所有记录
            string sqlStr = "select * from Table_Czy";

            SqlCommand sqlCmd = sqlConn.CreateCommand();
            sqlCmd.CommandType = System.Data.CommandType.Text;
            sqlCmd.CommandText = sqlStr;

            SqlDataReader sdr = sqlCmd.ExecuteReader();//ExecuteReader()方法可返回单向的、只读的数据记录集

            //在一行中迭代输出操作员表的字段名信息
            for (int i = 0; i < sdr.FieldCount; i++)
            {
                Console.Write("{0,-10}\t", sdr.GetName(i).Trim());//输出字段名列表,{0,-10}表示输出内容时占用10字符位置,左对齐输出,以TAB字符分隔各字段
            }

            Console.WriteLine();
            Console.WriteLine("---------------------------------------------------------------------------------------------------");
            while (sdr.Read())
            {
                for (int i = 0; i < sdr.FieldCount; i++)
                {
                    Console.Write("{0,-10}\t", sdr[i]);//输出字段内容
                    //Console.Write("{0}\t", sdr.GetValue(i));//与上一语句等价
                }
                Console.WriteLine();
            }
            Console.WriteLine("---------------------------------------------------------------------------------------------------");
            sqlConn.Close();//后面的代码不再需要对数据库的操作了,直接断开与数据库的连接
            return;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("开始读取操作员表中的数据:");
            ReadCzyTableInfo();
            Console.WriteLine("数据读取完成!");
            Console.ReadKey();
        }
    }
}

3、创建一个WinForm应用程序,演示如何动态获取与数据库连接相关的信息,并进行数据库连接。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Demo_SqlConn
{
    public partial class SqlConnForm : Form
    {
        public SqlConnForm()
        {
            InitializeComponent();
            UpdateDbStatus();
            textBox_Config.Text = "";
        }

        private void UpdateDbStatus()//更新数据库的状态
        {
            if (sqlConn.State == ConnectionState.Open)
            {
                statusBar_Msg.Text = "数据库连接已打开!";
                btn_Start.Enabled = false;
                btn_Start2.Enabled = false;
                btn_Stop.Enabled = true;
                btn_Stop2.Enabled = true;
            }
            else if (sqlConn.State == ConnectionState.Closed)
            {
                statusBar_Msg.Text = "数据库连接已断开!";
                btn_Start.Enabled = true;
                btn_Start2.Enabled = textBox_Config.Text.Trim() != "";
                btn_Stop.Enabled = false;
                btn_Stop2.Enabled = false;
            }
            return;
        }

        private void LinkDbSrv(string connStr)
        {
            sqlConn.ConnectionString = connStr;
            try
            {
                sqlConn.Close();
                sqlConn.Open();
                UpdateDbStatus();
            }
            catch (Exception er)
            {
                MessageBox.Show(string.Format("数据库连接失败!{0}", er.Message), "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                UpdateDbStatus();
                //throw er;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string connStr = "Data Source="+txtBox_Srv.Text+";Initial Catalog="+textBox_DbName.Text+";Persist Security Info=True;User ID="+textBox_User.Text+";Password="+textBox_Pwd.Text;
            LinkDbSrv(connStr);
        }

        private void sqlConn_StateChange(object sender, StateChangeEventArgs e)
        {
            if (e.CurrentState == ConnectionState.Open)
            {
                statusBar_Msg.Text = "数据库连接已打开!";
                btn_Start.Enabled = false;
                btn_Stop.Enabled = true;
            }
            else if (e.CurrentState == ConnectionState.Closed)
            {
                statusBar_Msg.Text = "数据库连接已断开!";
                btn_Start.Enabled = true;
                btn_Stop.Enabled = false;
            }
        }

        private void btn_Start2_Click(object sender, EventArgs e)
        {
            LinkDbSrv(textBox_Config.Text);
        }

        private void btn_ReadConfig_Click(object sender, EventArgs e)
        {
            textBox_Config.Text = Demo_SqlConn.Properties.Settings.Default.MyConnectionString;
        }

        private void btn_Stop_Click(object sender, EventArgs e)
        {
            sqlConn.Close();
            UpdateDbStatus();
        }

        private void textBox_Config_TextChanged(object sender, EventArgs e)
        {
            UpdateDbStatus();
        }

    }
}

4、对之前【week07】中的登录认证演示程序【Demo_LoginForm】进行升级,演示如何利用【操作员表】中的用户信息进行登录验证。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Demo_LoginForm
{
    public partial class LoginForm : Form
    {
        //private string _UserName = "admin";
        //private string _UserPwd = "123456";
        public LoginForm()
        {
            InitializeComponent();
        }

        private bool CheckUserInfo(string userName,string userPwd)//从数据库中验证用户和密码
        {
            string connStr = Properties.Settings.Default.MyConnectionString;
            SqlConnection sqlConn = new SqlConnection();
            sqlConn.ConnectionString = connStr;
            try
            {
                sqlConn.Open();
            }
            catch (Exception e)
            {
                MessageBox.Show("数据库连接失败!请检查配置文件信息!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return false;
            }

            //查询满足该条件(用户名+密码+帐号是否停止)的记录有多少条
            string sqlStr = string.Format("select count(*) from Table_Czy where UserId='{0}' and UserPwd='{1}' and UserIsStoped=0",userName,userPwd);

            SqlCommand sqlCmd = sqlConn.CreateCommand();
            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.CommandText = sqlStr;

            int iResult = Convert.ToInt32(sqlCmd.ExecuteScalar());//ExecuteScalar()方法可返回SqlCommand执行后的首行首列的结果

            sqlConn.Close();//后面的代码不再需要对数据库的操作了,直接断开与数据库的连接
            if (iResult > 0)
                return true;
            else
                return false;

        }
        private void btn_Cancel_Click(object sender, EventArgs e)
        {
            txt_UserName.Text = "";
            txt_UserPwd.Text = "";
            this.Close();
        }

        private void btn_Login_Click(object sender, EventArgs e)
        {
            string userName = txt_UserName.Text;
            string userPwd = txt_UserPwd.Text;

            //if ((userName==_UserName) && (userPwd ==_UserPwd))
            if (CheckUserInfo(userName, userPwd))
            {
                MessageBox.Show(this, "用户名和密码验证通过,登录成功!", "登录提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show(this, "用户名和密码验证失败,请检查后重试!", "登录提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txt_UserName.Focus();//控件获取焦点
            }
        }

        private void txt_UserName_TextChanged(object sender, EventArgs e)
        {
            btn_Login.Enabled = (txt_UserName.Text != "") && (txt_UserPwd.Text != "");
        }

        private void txt_UserPwd_KeyDown(object sender, KeyEventArgs e)
        {
            //此事件与KeyPress事件只需其一即可,不可两者均写
            if (e.KeyCode == Keys.Enter) //回车键
                btn_Login_Click(sender, e);
            else if (e.KeyCode == Keys.Cancel) //ESC键
                btn_Cancel_Click(sender, e);
        }
    }
}

5、课后拓展练习,优化并改造上述第2、3、4、5中的Demo程序,把数据库操作相关的功能独立出来,形成一个单独的数据库操作类。

仿照第1题中XyfdDM.cs类定义,优化并改造上述第2、3、4、5中的Demo程序,把数据库操作相关的功能独立出来,形成一个单独的数据库操作类,并在以后的实践中引用此类并扩展此类型的功能。

 

6、演示DEMO源代码在github上的仓库地址:

https://github.com/xieyunc/csharp_teach.git

展开阅读全文

没有更多推荐了,返回首页