C# 数据库

  • Post author:
  • Post category:其他




数据库



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. 一般在成功更新数据源后调用,将每个

    DataRow



    RowState

    属性改为从

    Added



    Modified

    变为

    Unchanged
  3. 调用后,在调用

    Update

    方法将不会对数据库做任何更新,因此

    Update

    应该总是在这个方法之前调用
  4. 调用

    DataRow



    delete

    实际上没有删除,要调用这个方法后才算删除


Update


adapter.Update(dataSet, "student")

将dataSet的变化更新到数据库中



版权声明:本文为Inuyasha__原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。