第十三周作业

28 篇文章 1 订阅

目录

一、数据库操作技术、ADO.NET技术讲解

二、本章DEMO所需用到的MS SQL Server数据库、数据表、及相关信息

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

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

②、改进上述①中的程序,自定义数据库操作类文件--XyfdDB.cs:

③、使用改进过的、分离出来的数据库操作类连接数据库:

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

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

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

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

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


一、数据库操作技术、ADO.NET技术讲解

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;"

三、创建一个控制台程序,演示如何连接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 void LinkDbSrv()
        {
            string connStr = "Server=172.18.4.13;Database=xscj_db;User Id=xscjgl_sa;Password=abcd@1234;";
            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)
        {
            //真实的项目开发中,应该从配置文件中获取数据库的各种连接信息

            Console.WriteLine("\r\n\r\n=========直接使用本类的数据库操作函数的方式连接数据库============\r\n\r\n");
            LinkDbSrv();

            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 "Server="+_datasource+";Database="+_database+";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;
        }
    }
}

③、使用改进过的、分离出来的数据库操作类连接数据库:

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 "Server=" + datasource + ";Database=" + database + ";User Id=" + loginUser + ";Password=" + loginPwd;
        }

        private static void LinkDbSrv(string dbSrv, string dbName, string loginUser, string loginPwd)
        {
            //string connStr = "Server=172.18.4.13;Database=xscj_db;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";     //登录密码

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

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


            Console.ReadKey();
        }
    }
}

四、创建一个控制台程序,演示如何读取【操作员表】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();
        }
    }
}

五、创建一个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();
        }

    }
}

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

项目中app.config文件内容为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="Demo_LoginForm.Properties.Settings.MyConnectionString"
            connectionString="Server=172.18.4.13;Database=xscj_db;User Id=xscjgl_sa;Password=abcd@1234;"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

 LoginForm.cs文件:

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)//从数据库中验证用户和密码
        {
            //从.net 2.0开始VS不再建议使用Properties方式操作app.config文件,推荐使用ConfigurationManager方式
            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);
        }
    }
}

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

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

要点:

1、在app.config中配置好数据库连接字符串

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--第1种配置方式  name命名方式-->
  <connectionStrings>
    <add name="connStr" connectionString="Server=172.18.4.13;User Id=xscjgl_sa; Password=abcd@1234; Database=xscj_db;"/>
  </connectionStrings>
  <!--第2种配置方式  key/value命名方式-->
  <appSettings>
    <add key="connStr" value="Server=172.18.4.13;User Id=xscjgl_sa; Password=abcd@1234; Database=xscj_db;"/>
    <add key="ConStringEncrypt" value="true"/>
  </appSettings>
</configuration>

2、在解决方案资源管理器的引用项上右键菜单“添加引用”:

   

3、在程序中读取数据库连接字符串: 

using System;
using System.Configuration;

namespace ConfigurationTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //---读取第1种配置方法配置的信息----//
            Console.WriteLine(ConfigurationManager.ConnectionStrings["connStr"].connectionString);

            //---读取第2种配置方法配置的信息----//
            Console.WriteLine(ConfigurationManager.AppSettings["connStr"].toString());

            Console.ReadKey();
        }
    }
}

 

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值