3-25 练习
ADO.NET
- 进行数据库连接
- 执行数据库SQL命令
- 数据查询
1. 建立数据库连接
DbConnection类,是数据库连接的基类,不同的数据库,会继承该类型,创建他们自己的连接类。
比如:
- SQLSERVER -> SQLConnection
- MySQL -> MySqlConnection
1.1. MySQL数据库连接
Server 服务器地址
Port 数据库的连接端口
Database 要连接的数据库名
User Id 用户名
Password 密码
Server=127.0.0.1;Port=3306;Database=northwindcn;User Id=root;Password=1234;
//1. 创建MySQL数据库连接实例,并且设定数据库连接字符串
MySqlConnection conn = new MySqlConnection();
conn.ConnectionString = "Server=127.0.0.1;Port=3306;Database=northwindcn;User Id=root;Password=12345;";
//2. 打开数据库连接
conn.Open();
//...其他数据库操作
//3.关闭数据库连接
conn.Close();
Server=127.0.0.1;Port=3306;Database=northwindcn2;User Id=root;Password=1234;
数据库不存在错误提示:Unknown database 'northwindcn2'
Server=177.0.0.1;Port=3306;Database=northwindcn2;User Id=root;Password=1234;
服务器连接失败错误提示:Unable to connect to any of the specified MySQL hosts
Server=127.0.0.1;Port=3306;Database=northwindcn;User Id=root;Password=12345;
账号或密码错误的错误提示:Access denied for user 'root'@'localhost' (using password: YES)
SqlServer数据库连接
//1. 创建SQLServer数据库连接实例,并且设定数据库连接字符串
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Server=127.0.0.1;Database=Test;User Id=sa;Password=lh1234;";
//2. 打开数据库连接
conn.Open();
//3.关闭数据库连接
conn.Close();
想要更换到另一款数据库,改动比较少,连接的数据类型换成其他的数据库连接类型就可以了。
2. 执行SQL命令
2.1 对于增删改语句,下面的方式执行。
调用的是命令的ExecuteNonQuery方法去执行SQL语句并且返回受影响的行数。
public JsonResult Index()
{
//1. 创建MySQL数据库连接实例,并且设定数据库连接字符串
DbConnection conn = new MySqlConnection();
conn.ConnectionString = "Server=127.0.0.1;Port=3306;Database=abc;User Id=root;Password=1234;";
//2. 建立SQL命令并且设置要执行的SQL语句和连接通道
//MySqlCommand cmd = new MySqlCommand("insert into log (UserId,LoginTime,Ip,Result) values (3,'2020-1-1','128.8.8.8',1)", conn);
DbCommand cmd = new MySqlCommand();
cmd.CommandText = "insert into log (UserId,LoginTime,Ip,Result) values (3,'2020-1-1','128.8.8.8',1)";
cmd.Connection = conn;
// 3. 打开连接
conn.Open();
// 4. 执行SQL命令
int count= cmd.ExecuteNonQuery(); // 会返回受影响的行数
// 5. 关闭连接
conn.Close();
return Json(count,JsonRequestBehavior.AllowGet);
}
其他增删改语句只需要更换SQL命令即可。
2.2. ExecuteScalar返回查询结果第一行第一列值
//1. 创建MySQL数据库连接实例,并且设定数据库连接字符串
DbConnection conn = new MySqlConnection();
conn.ConnectionString = "Server=127.0.0.1;Port=3306;Database=abc;User Id=root;Password=1234;";
//2. 建立SQL命令并且设置要执行的SQL语句和连接通道
//MySqlCommand cmd = new MySqlCommand("insert into log (UserId,LoginTime,Ip,Result) values (3,'2020-1-1','128.8.8.8',1)", conn);
DbCommand cmd = new MySqlCommand();
cmd.CommandText = "SELECT sum(ip) FROM abc.log;";
cmd.Connection = conn;
// 3. 打开连接
conn.Open();
// 4. 执行SQL命令
int count= Convert.ToInt32(cmd.ExecuteScalar()); // 返回查询结果的第一行第一列数据
// 5. 关闭连接
conn.Close();
return Json(count,JsonRequestBehavior.AllowGet);
3. 查询表格
使用数据适配器去获取SQL语句执行之后查询到的表。
//1. 创建MySQL数据库连接实例,并且设定数据库连接字符串
DbConnection conn = new MySqlConnection();
conn.ConnectionString = "Server=127.0.0.1;Port=3306;Database=abc;User Id=root;Password=1234;";
// 2. 建立数据适配器,设定执行的查询语句,设定使用的数据库连接
DbDataAdapter adp = new MySqlDataAdapter("select * from log", (MySqlConnection)conn);
// 3.执行查询,将查询到的表填充到DataTable中
DataTable table = new DataTable();
//数据适配器执行命令时会自动检测连接是否开启,没有开启会自动打开,查询完毕后还原会原始状态。
adp.Fill(table);
要遍历查询到的表格,或者取具体某个单元格的值:
foreach (DataRow row in table.Rows)
{
var id= row["Id"];
}
for (int i = 0; i < table.Rows.Count; i++)
{
var id = table.Rows[i]["Id"];
}
return Json(table.Rows[2]["Id"], JsonRequestBehavior.AllowGet);
关于SQL注入攻击问题: https://www.cnblogs.com/zhangyuanbo12358/p/3959924.html
练习
- 能够根据Id,读取用户数据,显示到界面上
public JsonResult GetUserInfo(int id)
{
MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Port=3306;Database=abc;User Id=root;Password=1234;");
MySqlDataAdapter adp = new MySqlDataAdapter("select * from `user` where id= " + id,conn);
DataTable table = new DataTable();
adp.Fill(table);
if (table.Rows.Count == 0)
{
return Json(new {
success=false,
message="用户未找到"
},JsonRequestBehavior.AllowGet);
}
else
{
return Json(new
{
success=true,
mesage="请求成功",
data= TableToList(table)
}, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 将Table转为List
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
private List<Dictionary<string,object>> TableToList(DataTable table)
{
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (DataRow row in table.Rows)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
foreach (DataColumn column in table.Columns)
{
dic.Add(column.ColumnName, row[column.ColumnName]);
}
list.Add(dic);
}
return list;
}
填写Name,点击添加,根据Name加一条新的用户数据,并且弹框显示是否添加成功
填写Id,执行删除按钮功能,根据Id删除数据,返回受影响的函数
填写Id和Name,根据Id去修改Name,返回受影响函数
public JsonResult AddUserInfo(string name)
{
var count = ExecuteSQL("insert into `user` (`Name`) values ('" + name + "')");
if (count == 1)
{
return Json(new
{
success = true,
mesage = "请求成功"
}, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new
{
success = false,
mesage = "插入失败"
}, JsonRequestBehavior.AllowGet);
}
}
public JsonResult RemoveUserInfo(int id) {
var count = ExecuteSQL("delete from `user` where id="+id);
if (count == 1)
{
return Json(new
{
success = true,
mesage = "请求成功"
}, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new
{
success = false,
mesage = "没有找到用户"
}, JsonRequestBehavior.AllowGet);
}
}
public JsonResult EditUserInfo(int id ,string name)
{
var count = ExecuteSQL("update `user` set Name='"+name+"' where id=" + id);
if (count == 1)
{
return Json(new
{
success = true,
mesage = "请求成功"
}, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new
{
success = false,
mesage = "更新失败,没有找到用户"
}, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 执行SQL增删改,返回受影响行数
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
private int ExecuteSQL(string sql) {
MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Port=3306;Database=abc;User Id=root;Password=1234;");
conn.Open();
var count = 0;
try
{
MySqlCommand cmd = new MySqlCommand(sql, conn);
count = cmd.ExecuteNonQuery();
}
catch (Exception)
{
}
finally {
conn.Close();
}
return count;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="Scripts/jquery-3.4.1.min.js"></script>
</head>
<body>
<p>
<label>ID:<input id="inputId" value="" /></label>
</p>
<p>
<label>Name:<input id="inputName" value="" /></label>
</p>
<button onclick="search1()"> 查询</button>
<button onclick="add()"> 添加</button>
<button onclick="del()"> 删除</button>
<button onclick="edit()"> 修改</button>
<script>
function search1() {
$.post('/user/getuserinfo', { id: inputId.value }, function (data) {
if (data.success) {
inputName.value = data.data[0].Name
} else {
alert(data.message)
}
})
}
function add() {
$.post('/user/adduserinfo', { name: inputName.value }, function (data) {
alert(data.message)
})
}
function edit() {
$.post('/user/edituserinfo', { name: inputName.value, id: inputId.value }, function (data) {
alert(data.message)
})
}
function del() {
$.post('/user/removeuserinfo', { id: inputId.value }, function (data) {
alert(data.message)
})
}
</script>
</body>
</html>