using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 数据库操作
{
class Program
{
static void Main(string[] args)
{
//通过ado.net连接数据库
/*
连接数据库的步骤:
1)创建连接字符串:被连接的数据的主机地址、用户名和密码
Data Source=服务器名字,表示要连接的服务器
Initial Catelog=默认被连接的某一个数据库的名字
Integrated Security=true;表示使用windows验证方式连接数据库
核心类的使用:SqlConnection
2)创建连接对象
3)打开连接(如果打开数据库连接没有问题,表示连接成功)
4)关闭连接,释放资源
*/
//创建连接字符串
string constr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;Integrated Security=true";
//另外一种写法
string constr1 = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
//创建连接对象
//编译的时候,编译成try{}finally{}
//F12查看当前类的源码
//方法名首字母大写
//CTRL+SHIFT+u:转换成大写字母
//快捷键:shift+F5、F5
using (SqlConnection conn=new SqlConnection(constr1))
{
//测试打开连接
conn.Open();
Console.WriteLine("打印连接成功");
//关闭连接,释放资源,这些代码不用写了,因为代码写在using代码块中了。
//conn.Close();
//conn.Dispose();
}
Console.WriteLine("关闭连接,释放资源!");
}
}
}
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 通过ado.net操作数据库
{
class Program
{
static void Main(string[] args)
{
//核心知识点:SqlConnection .Open()方法 SqlCommand:输送sql语句,获取执行结果 SqlDataReader获取一个数据集,
//练习数据库的增删改查
//关键是记住这个流程
//一、通过ado.net向表中插入一条数据
string conStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****"; ;
using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(conStr))
{
Console.WriteLine("打开连接成功");
//如果手动停止数据库服务,就连接不上了!
//注意要体停止的数ip地址对应的主机上的数据库服务才行;
//通过数据库服务操作数据库文件;
//如果本机上的数据库服务被停止了,就不能访问本机的数据库了。
string sql = "INSERT INTO Teacher VALUES ( N'赵灵' , 1 , 18 , GETDATE() ,N'中国台湾省' , N'[email protected]' , 15555 )";
//创建一个执行sql语句的对象 参数为要执行的sql语句和数据库连接对象(command对象要在哪个连接上执行)
using (System.Data.SqlClient.SqlCommand sqlCom = new System.Data.SqlClient.SqlCommand(sql, conn))
{
//如果构造函数里面没有,写在这里也是可以的。
//sqlCom.CommandText = sql;
//sqlCom.Connection = conn;
//连接对象玩打开,最早关闭,这样就比较节省资源。
conn.Open();
//开始执行sql语句:
//1)当执行insert update delete操作时,调用这个方法;方法的返回值为int类型表示执行sql语句所影响的行数;如果执行的不是insert delete update返回的值为-1.
int r = sqlCom.ExecuteNonQuery();
//2)当查询出多行记录、多列结果时调用这个方法
//sqlCom.ExecuteReader();
//3)当执行单个返回结果的时候(一行记录、一列数据、一个数据时),调用这个方法
//sqlCom.ExecuteScalar();
Console.WriteLine("成功影响了{0}行数据", r);
}
}
//二、通过ado.net删除表中的一条数据
//1)创建连接字符串2)使用using创建连接对象3)编写sql语句4)创建SqlCommand对象5)打开数据库连接6)执行相应的操作
string delStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(delStr))
{
string sql = "delete from Teacher where TeaID=6";
using (SqlCommand sqlCom = new SqlCommand())
{
sqlCom.CommandText = sql;
sqlCom.Connection = conn;
conn.Open();
int r = sqlCom.ExecuteNonQuery();
Console.WriteLine("成功删除了了{0}语句", r);
}
}
//三、通过ado.net修改表中的一条记录
string updStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection sqlConn = new SqlConnection(updStr))
{
string sql = "update Teacher set TeaName=N'陈静',TeaSalary=10000 where TeaID=5";
using (SqlCommand sqlCom = new SqlCommand(sql, sqlConn))
{
sqlConn.Open();
int r = sqlCom.ExecuteNonQuery();
Console.WriteLine("成功修改了一条数据{0}", r);
}
}
//四、通过ado.net查询表中的记录条数
string strConn = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(strConn))
{
string sql = "select count(*) from Teacher";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
//查询结果有可能是null,"select * from Teacher";如果是聚合函数,结果不可能是null;其他的时候就不确定了。
//int count =(int) comm.ExecuteScalar(); 存在拆箱操作
int count = Convert.ToInt32(comm.ExecuteScalar());
Console.WriteLine("表中总共有{0}条数据", count);
}
}
//五,查询所有的记录
/**
SqlDataReader的特点:
1)只能通过read读取数据,不能赋值,不能修改。2)只进,read只能一条一条向前移动,不能后退、跳跃。游标向下移上一条数据就被销毁。
2)使用read时,必保证连接是打开的。因为此时数据存在服务端,需要自己去拿。当read使用完毕后,必须关闭read,同时关闭连接。
3)默认情况下SqlDataReader独占一个连接对象,这个连接对象不能在做其他的事情。
*/
string selectAllStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(selectAllStr))
{
string sql = "select * from Teacher";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
//调用ExecuteReader()方法,将给定的sql语句在服务器端执行。
using (SqlDataReader reader = comm.ExecuteReader())
{
//所有的结果集都在reader中
//查询结果保存在“数据库服务器”的内存当中,并没有直接返回给应用程序结果,只返回给应用程序一个reader。
//应用程序必须通过reader来获取数据,每次只能取一条数据。
//通过reader对象,一条一条获取数据
//先判断是否查询到数据,HasRows row 行 如果有数据就是true没有就是false。
if (reader.HasRows)
{
//调用Read()方法才能取到数据,游标向下移动,
while (reader.Read())
{
//返回结果为真表示能够取到数据,同时游标指向下一行。
//获取当前查询语句查询出的列的个数(几列数据)(由查询语句自己确定)
for (int i = 0; i < reader.FieldCount; i++)
{
//reader[i]结果为object类型,打印出这一行的每一列数据,索引器
Console.Write(reader[i] + " | ");
//还可以通过列名索引器获取值
//Console.Write(reader["TeaName"]);
//在给定列名的情况下,获取列的序号
//int index = reader.GetOrdinal("TeaName");
//第二种方式:GetValue只能通过索引获取值
//Console.Write(reader.GetValue(i) + " | ");
//通过索引器和GetValues方法,实质没区别
//当遇到数据库中的null值的时候,通过reader.GetValues()或者索引器来获取列的值的时候,拿到的是DBNull.Value,不是c#的null,调用ToString()方法,返回的是空字符串,所以并不会报错。
//使用强类型读取列中的数据,这样结果就不是Object类型了,使用起来更方便。
//reader.GetInt();
//获取列中值的两种方式
}
Console.WriteLine();
}
}
else
{
Console.WriteLine("没有查询到任何数据!");
}
}
}
}
//六,打印列对应的值
string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(connStr))
{
string sql = "select * from Teacher";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
SqlDataReader reader = comm.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.Write(reader.GetInt32(0)+"\t");
Console.Write(reader.GetString(1) + "\t");
Console.Write(reader.GetBoolean(2) + "\t");
Console.Write(reader.GetInt32(3) + "\t");
//时间
Console.Write(reader.GetDateTime(4) + "\t");
//地址
Console.Write((reader.IsDBNull(5)) ? "NULL" : reader.GetString(5) + "\t");
//邮箱
//Console.Write((reader.IsDBNull(6)) ? "NULL" : reader.GetString(6) + "\t");
//薪水
Console.Write(reader.GetInt32(7) + "\t");
//换行
Console.WriteLine();
//1)注意:通过reader.GetXxx()方法来获取表中的数据时,如果值为null,就会抛出异常,程序停止执行。此时需要手动判断值是否为null。IsDBNull()方法的使用
//2)通过GetXxx()获取时间类型的数据 reader.GetDateTime(4)
//3)用一个list集合表示一张表中的所有数据
}
}
else
{
Console.WriteLine("未查询到任何数据!!!");
}
}
}
Console.ReadKey();
}
}
}
练习:通过ado.net实现数据库的增删改查
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ado.net练习一
{
class Program
{
static void Main(string[] args)
{
//练习
//经常拼错单词怎么破,两次了: MyFirstData,initial catalog
//你调用哪个查询放哪取决于你想获取什么样的返回结果。
//验证用户登录相当于把user表中的数据全部对比了一遍,登录其实是查询操作。
//登录逻辑判断:select count(*) from User where UserName='陈如水',UserPassword='5555';
//将表中的数据读取到一个List集合里面
//LoadData();
//实现对班级表的增删改查
//1)增加一条用户记录
//AddTeacher();
//2)修改用户的信息
//updateData();
//3)删除用户记录
//deleteData();
//4)获取自动增加的主键值
//GetPrimaryKeyData();
//5)登录练习 需要重新写代码
QueryLogin();
Console.ReadKey();
}
private static void QueryLogin()
{
string connStr = @"data source=;initial catalog=MyFirstData; User ID=;PASSWORD=";
using (SqlConnection conn = new SqlConnection(connStr))
{
//这种sql语句只能校验用户是否登录成功,不能校验是用户名还是密码错误
//string sql = "select count(*) from Teacher where TeaName='陈诗音'";
int row;
string sql = "select * from Teacher where TeaName='陈诗音'";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
row = (int)comm.ExecuteScalar();
//已经为TeaName列设置过唯一性约束了。
}
if (row > 0)
{
//用户名已经存在
string sqlPassword = "select * from Teacher where TeaAge=17";
using (SqlCommand comm2 = new SqlCommand(sqlPassword, conn))
{
int state = (int)comm2.ExecuteScalar();
if (state > 0)
{
Console.WriteLine("登录成功!");
}
else
{
Console.WriteLine("密码错误!");
}
}
}
else
{
Console.WriteLine("用户名不存在!");
}
}
}
//插入数据时,返回自动增长的主键值(获取新纪录的自动编号)
private static void GetPrimaryKeyData()
{
string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(connStr))
{
string sql = "INSERT INTO Teacher output inserted.TeaID values('途虎',1,40,getDate(),'上海','[email protected]',50000)";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
int row = (int)comm.ExecuteScalar();
Console.WriteLine("新插入行的记录是{0}", row);
}
}
}
//删除某一条用户记录
private static void deleteData()
{
string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(connStr))
{
//删除第十三条记录
string sql = "delete from Teacher where TeaID=13";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
int row = comm.ExecuteNonQuery();
if (row > 0)
{
Console.WriteLine("总共有{0}行数据收到影响", row);
}
else
{
Console.WriteLine("删除失败!");
}
}
}
}
//修改学生的信息
private static void updateData()
{
string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(connStr))
{
string sql = "update Teacher set TeaName='张慧慧' where TeaID=12";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
int row = comm.ExecuteNonQuery();
if (row > 0)
{
Console.WriteLine("总共有{0}行收到影响", row);
}
else
{
Console.WriteLine("插入失败!");
}
}
}
}
//添加学生记录,其实是执行插入操作
private static void AddTeacher()
{
string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(connStr))
{
// TeaName,TeaGender, TeaAge,TeaBirthdat,TeaAddress,TeaEmail, TeaSalary
string sql = "INSERT INTO Teacher values('途虎养车',1,40,getDate(),'上海','[email protected]',50000)";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
int row = comm.ExecuteNonQuery();
if (row > 0)
{
Console.WriteLine("添加{0}新的记录成功!", row);
}
else
{
Console.WriteLine("添加记录失败!");
}
}
}
}
private static void LoadData()
{
//声明一个集合,用于存储查询到的所有记录
List list = new List();
string connStr = @"Data Source=255.255.255.1\dev; INITIAL CATALOG=MyFirstData;User ID=****;Password=****";
using (SqlConnection conn = new SqlConnection(connStr))
{
string sql = "select * from Teacher";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
conn.Open();
using (SqlDataReader reader = comm.ExecuteReader())
{
//判断是否查询到了数据
if (reader.HasRows)
{
//每次读取一条记录的数据
while (reader.Read())
{
//每次循环都要创建一个Teacher对象, TeaName,TeaGender, TeaAge,TeaBirthdat,TeaAddress,TeaEmail, TeaSalary
//数据绑定只认属性,不认字段,内部通过反射机制来实现。
Teacher teacher = new Teacher();
teacher.TeaID = reader.GetInt32(0);
teacher.TeaName = reader.GetString(1);
teacher.TeaGender = reader.GetBoolean(2);
teacher.TeaAge = reader.GetInt32(3);
//把日期类型转化成字符串类型
teacher.TeaBirthdat = reader.GetDateTime(4).ToString();
//值可能为空,进行逻辑判断
teacher.TeaAddress = (reader.IsDBNull(5)) ? "NULL" : reader.GetString(5);
teacher.TeaEmail = (reader.IsDBNull(6)) ? "NULL" : reader.GetString(6);
teacher.TeaSalary = reader.GetInt32(7);
//把对象添加到集合
list.Add(teacher);
}
}
else
{
Console.WriteLine("查询不到数据!!!");
}
}
}
}
Console.WriteLine(list.Count);
}
}
}