C# 数据库

数据库

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
  1. adapter在调用Fill之后自动调用这个方法,将所有行的状态设置为Unchanged
  2. 一般在成功更新数据源后调用,将每个DataRowRowState属性改为从AddedModified 变为Unchanged
  3. 调用后,在调用Update 方法将不会对数据库做任何更新,因此 Update 应该总是在这个方法之前调用
  4. 调用DataRowdelete实际上没有删除,要调用这个方法后才算删除
Update

adapter.Update(dataSet, "student")将dataSet的变化更新到数据库中

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值