前言:ADO.NET是一种C#的操作数据库的一组类库和API,
使用它们能够有效的方便的使用数据库,
因为新建的项目并没有各个数据库的连接类(数据库驱动),需手动的安装.
这里列出几种不同的驱动,它们各自使用于不同类型的数据库
- SQL Server数据库----------------------System.Data.SqlClient
- Mysql数据库------------------------------MySql.Data
- Oracle数据库-----------------------------System.Data.OracleClient
在项目右键NuGet包管理
(感觉很像Maven仓库,同样也是需要什么包就去上面Down就行了)
从nuget.oracle的库中搜索包名下载安装即可,
在System.Data.SqlClient中提供了
SqlConncetion对象,可以很方便的连接数据库(特别对多数据源的使用比较方便)
public sealed class SqlConnection : DbConnection, ICloneable
{
//sqlConnection是一个sealed类,它提供了三个构造方法
public SqlConnection();
//这个构造方法只需要提供URL即可
public SqlConnection(string connectionString);
//这个构造方法中的SqlCredential对象只是对数据库连接的账号和密码进行了封装而已
public SqlConnection(string connectionString, SqlCredential credential);
.........
}
连接URL
1. server={IP};database={数据库名};uid={数据库角色名};pwd={数据库角色的密码}
(如果Sql Server的服务就在本机的话则直接在IP位置设置一个.即可)
对比Java连接SqlServer的URL来说的话,确实是更加简洁一点
(对比新版的mysql的url在后面加一堆的&useXXX还是更简单一点的)
driver = com.microsoft.sqlserver.jdbc.SQLServerDriver url = jdbc:sqlserver://localhost:1433;DatabaseName=XXX
接下来连接是很简单的的
只需要调用SqlConnection的Open方法即可
SqlConnection conn = new SqlConnection("server=.;database=XXX;uid=XXX;pwd=XXX");
conn.Open();
而Java的连接则需要使用ManageDriver类
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=XX",username,password);
接下来直接进行连接;
static void main(String[] args){
String URL = "server=.;database=Fortest;uid=sa;pwd=LiHan199968";
SqlConnection conn = new SqlConnection(URL);
conn.Open(); //创建连接.开启连接
if (conn.State == ConnectionState.Open) //查看连接状态
{
Console.WriteLine("數據庫連接成功!");
}
Console.ReadLine();
}
运行结果:
數據庫連接成功!3.创建SqlCommand对象执行SQL语句
ADO.NET使用SqlCommand对象来执行SQL语句,
先看看其构造方法:
public sealed class SqlCommand : DbCommand, ICloneable
{
public SqlCommand();
//参数cmdText就是索要执行的SQL语句
public SqlCommand(string cmdText);
//SqlConnection形参就是数据库连接对象,也就是说它需要绑定一个数据库连接
public SqlCommand(string cmdText, SqlConnection connection);
//SqlTranscation对象则可以在执行中给操作添加事物
public SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction);
}
再看看执行Sql语句所提供的基礎方法,(那些異步執行方法以後再做研究)
public override int ExecuteNonQuery(); //顧名思義,就是执行非查询语句的方法,返回一个受影响记录的行数 public SqlDataReader ExecuteReader(); //返回一个SqlDataReader,其中包含了查询结果,可以取出 public override object ExecuteScalar(); //返回查询结果集的第一行,
测试用表:
create table Student( S_ID int primary key identity(1,1), S_Name varchar(30), S_Address varchar(100), S-Date date, )
现有记录:
1 张三 吳興 2021-11-02 2 李四 skd 2021-11-02 3 李四 skd 2021-11-02 4 王五 HSdaneLee 2021-11-02
测试代码:
static void main()
{
String URL = "server=.;database=Fortest;uid=sa;pwd=LiHan199968";
SqlConnection conn = new SqlConnection(URL);
conn.Open();
SqlCommand cmd = new SqlCommand();
//设置cmd对应的Connection对象
cmd.Connection = conn;
//设定要执行的SQL语句
cmd.CommandText = "delete from Student where S_Name = '李四'";
//执行SQL
int Count = cmd.ExecuteNonQuery();
//打印执行的结果
Console.WriteLine("執行了" + cmd.CommandText+
"這條修改影響到了"+Count+"條記錄n----------------------------------");
Console.ReadLine();
}
结果:
執行了delete from Student where S_Name = '李四'這條修改影響到了2條記錄 --------------------------------
现在再回去看看数据库
1 張三 吳興 2021-11-02 4 王五 HSdaneLee 2021-11-22
接下来再看一看用sqlCommand执行查询操作
String URL = "server=.;database=Fortest;uid=sa;pwd=LiHan199968";
SqlConnection conn = new SqlConnection(URL);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from Student";
SqlDataReader reader = cmd.ExecuteReader();
//连接和操作设置SQL语句的代码不变,只需要将SqlDataReader对象进行遍历即可
while (reader.Read())
{
Console.WriteLine("學號:" + reader[0] + "姓名:" + reader[1] + "地址:" + reader[2] + "日期:"+reader[3]+"n");
}
Console.ReadLine();
结果:
學號:1姓名:張三地址:吳興日期:2021/11/2 00:00:00 學號:4姓名:王五地址:HSdaneLee日期:2021/11/22 00:00:004.DataAdapter与DataSet的使用
DataAdapter可以视为一种数据层操作的适配器,需要配合一个SqlCommand
它需要设定一个Command属性,分别对应增删改查
- SelectCommand 查询
- DeleteCommand 删除
- InsertCommand新增
- UpdateCommand更新
看一看它的源码:
public sealed class SqlDataAdapter : DbDataAdapter, IDataAdapter, IDbDataAdapter, ICloneable
{
public SqlDataAdapter();
//通过SqlCommand初始化SqlDataAdapter
public SqlDataAdapter(SqlCommand selectCommand);
//通过SQLCommandText属性和Connection对象进行初始化
public SqlDataAdapter(string selectCommandText, SqlConnection selectConnection);
//通过SQLCommandText属性和连接UROL
public SqlDataAdapter(string selectCommandText, string selectConnectionString);
//四种Command属性
public SqlCommand DeleteCommand { get; set; }
public SqlCommand InsertCommand { get; set; }
public SqlCommand SelectCommand { get; set; }
public override int UpdateBatchSize { get; set; }
public SqlCommand UpdateCommand { get; set; }
}
DataSet是用于保存查询数据的一种结构,
他很像JDBC中的ResultSet,这里先不去看其源码,只需知道从它的Tables属性里取数据即可
现在完成SqlAdapter的测试;
String URL = "server=.;database=Fortest;uid=sa;pwd=LiHan199968";
SqlConnection conn = new SqlConnection(URL);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
//指定查询语句
cmd.CommandText = "select * from Student";
//创建DataSet实例
DataSet ds = new DataSet();
//执行Adapter关联的SqlCommand语句,并将其填充到DataSet中
adapter.Fill(ds);
//取出DataTable
DataTable dt = ds.Tables[0];
for(int i = 0; i < dt.Rows.Count; i++)
{
//遍历取出DataTable中的值
Console.WriteLine("No:"+dt.Rows[i][0]+"Name:"+dt.Rows[i][1]+"Address:"+dt.Rows[i] [2]+"Date;"+dt.Rows[i][3]);
}
Console.Read();
}
结果:
No:1Name:張三Address:吳興Date;2021/11/2 00:00:00 No:4Name:王五Address:HSdaneLeeDate;2021/11/22 00:00:00
由此用它提供的API实现了基本的数据库操作,接下要掌握,SqlParameter的使用,并将其封装,
写一个数据库工具类



