数据库
ADO.NET
主要特点
- 使用数据命令执行数据库交互
- 使用数据集缓存数据
- 数据保持为XML
- 通过架构定义数据结构
模型结构
- Connection
表示个与数据源的物理连接
- DataAdapter
Connection与DataSet的桥梁,管理四个Command对象来处理后端数据集和数据源的通信
- Command
SQL命令的载体
- DataReader
从数据源中或许仅向前的只读的数据流
- DataSet
数据集中的数据可能来自多个数据源,支持外键和唯一约束
连接对象的创建
string str = "server=localhost;uid=root;pwd=123456;database=mydb";
var conn = new sqlConnection(str);
try {
conn.Open();
} finally {
conn.Close();
}
执行数据命令的方法
- ExecuteNonQuery
public void Update() {
string sql = "update student set age = 28 where name = 'John'";
var cmd = new SqlCommand(sql, conn);
int r = cmd.ExecuteNonQuery();
Console.WriteLine("更新了{0}行", r);
}
- ExecuteReader
var cmd = conn.CreateCommand();
cmd.CommandText = "select name, age from student";
var reader = cmd.ExecuteReader();
while (reader.Read()) {
Console.WriteLine("{0}, {1}", reader["name"], reader["age"]);
}
reader.Close();
- ExecuteScalar
var sql = "select count(*) from student";
var cmd = new SqlCommand(sql, conn);
var count = cmd.ExecuteScalar();
Console.WriteLine("行数为:{0}", count);
DataSet的主要属性
- Tables 数据集中数据表的集合
DataTable的主要属性
- Columns 表的列的集合
- Rows 表的行的集合
- PrimaryKey 表的主键列数组
SqlDataAdapter
查询
var adapter = new SqlDataAdapter("select * from student", conn);
var dataSet = new DataSet();
adapter.Fill(dataSet);
foreach(var row in dataSet.Tables["student"].Rows) {
Console.WriteLine(row["name"] + "\t" + row["age"]);
}
添加
var adapter = new SqlDataAdapter("select * from student", conn);
var dataSet = new DataSet();
adapter.Fill(dataSet);
var newRow = dataSet.Tables["student"].newRow();
newRow["name"] = "huro";
newRow["age"] = 20;
dataSet.Tables["student"].Rows.Add(newRow);
adapter.Update(dataSet, "student");
更新
var adapter = new SqlDataAdapter("select * from student", conn);
var dataSet = new DataSet();
adapter.Fill(dataSet, "student");
dataSet.Tables["student"].Rows[0]["age"] = 100;
adapter.Update(dataSet, "student");
删除
var adapter = new SqlDataAdaper("select * from student", conn);
var dataSet = new DataSet();
adapter.Fill(dataSet, "student");
var keys = new DataColumn[1];
keys[0] = dataSet.Tables["student"].Columns["name"];
dataSet.Tables["student"].PrimaryKey = keys;
var findRow = dataSet.Tables["student"].Rows.Find("huro");
if (findRow != null) {
findRow.Delete();
adapter.Update(dataSet, "student");
}
在ADO.NET中访问多个表
var adapter = new SqlDataAdpter("select * from student", conn);
DataSet dataSet = new DataSet();
adapter.Fill(dataSet, "student");
adapter = new SqlDataAdapte("select * from course", conn);
adapter.Fill(dataSet, "course");
// 设置主键
var keys1 = new DataColumn[1];
keys1[0] = dataSet.Tables["student"].Column["姓名"];
dataSet.Table["student"].PrimaryKey = keys1;
// 添加关系
dataSet.Relations.Add("stugrdrel", dataSet.Tables["student"].Columns["name"], dataSet.Tables["course"].Columns["name"]);
UpdateRowSource
是数据库到DataSet的映射
UpdateRowSource | 效果 |
---|---|
Both | 输出参数和返回结果的第一行都可以映射到DataSet中更改的行 |
FirstReturnedRecord | 只有返回的结果集中的第一行才能映射到DataSet中更改的行 |
None | 丢弃所有数据 |
OutputParameters | 只有输出参数才可以映射到DataRow中更改的行 |
使用SqlCommand执行带输出参数的存储过程
var cmd = new SqlCommand("InsertAndMax", coon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@name", sqlDbType.VarChar, 30));
cmd.Parameters.Add(new SqlParameter("@sage", sqlDbType.Int));
cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;
cmd.Parameters["@sname"].value = "huro";
cmd.Parameters["@sage"].value = 20;
cmd.ExecuteNonQuery();
// ....
DataRow
DataRow的属性
DataRowState
DataRowState | 说明 |
---|---|
Added | 已添加 |
Deleted | 已删除 |
Detached | 已创建 |
Modified | 已修改 |
Unchanged | 未更改 |
DataRowVersion
DataRowVersion | 说明 |
---|---|
Current | 当前值 |
Original | 原始值 |
Proposed | 建议值 |
Default | 默认···某个上面的值 |
AcceptChanges / Update
AcceptChanged
-
adapter在调用Fill之后自动调用这个方法,将所有行的状态设置为
Unchanged
-
一般在成功更新数据源后调用,将每个
DataRow
的
RowState
属性改为从
Added
和
Modified
变为
Unchanged
-
调用后,在调用
Update
方法将不会对数据库做任何更新,因此
Update
应该总是在这个方法之前调用 -
调用
DataRow
的
delete
实际上没有删除,要调用这个方法后才算删除
Update
adapter.Update(dataSet, "student")
将dataSet的变化更新到数据库中
版权声明:本文为Inuyasha__原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。