目录

​一、数据库操作技术、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体系结构和相关类库非常重要!特别重要!非常无比特别的重要!

第十三周作业_数据库

二、本章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;"

第十三周作业_sql_02

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

第十三周作业_数据库_03

           

①、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中的所有记录。

第十三周作业_数据库连接_04

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应用程序,演示如何动态获取与数据库连接相关的信息,并进行数据库连接。

第十三周作业_sql_05

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】进行升级,演示如何利用【操作员表】中的用户信息进行登录验证。

第十三周作业_数据库连接_06

项目中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、在解决方案资源管理器的引用项上右键菜单“添加引用”:

第十三周作业_数据库连接_07

   

第十三周作业_sql_08

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​