第十三周作业

    xiaoxiao2025-04-20  9

    目录

    一、数据库操作技术、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)