08.C#连接数据库(ADO.NET)

1.ADO.NET介绍

(1)共享类

System.Data 命名空间

DataSet         表示数据在内存中的缓存

DataTable       表示内存中数据的一个表

DataRow         表示 DataTable 中的一行数据

DataColumn      表示 DataTable 中列的架构

DataRelation    表示两个 DataTable 对象之间的父/子关系

Constraint      表示可在一个或多个 DataColumn 对象上强制的约束

System.Data.Common 命名空间

DataColumnMapping   包含从 DataAdapter 继承的对象的一般列映射

DataTableMapping    包含源表和 DataTable 之间的映射关系的说明

(2)数据库专用类

System.Data.SqlClient 命名空间 

SqlCommand          用作SQL语句或存储过程调用的包装器

SqlCommandBuilder   用于从一条Select语句中生成SQL命令

SqlConnection       用于连接数据库

SqlDataAdapter      用于存储select、insert、update、delete命令

SqlDataReader       用作只向前的连接数据读取器

SqlParameter        用于为存储过程定义一个参数

SqlTransaction      用于数据库事物

System.Data.OleDb 命名空间

OleDbCommand、OleDbCommandBuilder、OleDbConnection、OleDbDataAdapter、OleDbDataReader、OleDbParameter、OleDbTransaction 。

System.Data.Odbc 命名空间

OdbcCommand、OdbcCommandBuilder、OdbcConnection、OdbcDataAdapter、OdbcDataReader、OdbcParameter、OdbcTransaction

System.Data.OracleClient 命名空间

OracleCommand、OracleCommandBuilder、OracleConnection、OracleDataAdapter、OracleParameter、OracleTransaction

注意:ADO.NET附带了3个数据库客户端名称空间,第一个用于SQL Server,第二个用于ODBC数据源,第三个用于通过OLE DB实现的数据库。如果数据库不是SQL Server,就应该使用OLE DB路由,除非还能使用ODBC。

2.使用数据库连接

(1)管理连接字符串

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接Oracle数据库========================================================
  6. OracleConnectionStringBuilder constring00 = new OracleConnectionStringBuilder();
  7. constring00.DataSource = "192.168.88.120/branch";
  8. constring00.UserID = "testbranch";
  9. constring00.Password = "testbranch";
  10. Console.WriteLine(constring00.ToString());//输出连接字符串
  11. OracleConnection con00 = new OracleConnection(constring00.ToString());
  12. con00.Open();//打开数据库
  13. con00.Dispose();//关闭数据库
  14. //连接MySQL,使用“MySql.Data.dll”=========================================
  15. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  16. constring01.Server = "localhost";
  17. constring01.UserID = "root";
  18. constring01.Password = "lizhiwei";
  19. constring01.Database = "test";
  20. constring01.Pooling = false;
  21. constring01.Port = 3306;
  22. Console.WriteLine(constring01.ToString());//输出连接字符串
  23. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  24. //con01.Open();//打开数据库
  25. //con01.Dispose();//关闭数据库
  26. //连接Access数据库(Access 2010级以上)====================================
  27. OleDbConnectionStringBuilder constring02 = new OleDbConnectionStringBuilder();
  28. /*Microsoft.Jet.OleDb.4.0(Access 2007级以下)
  29. * Microsoft.ACE.OLEDB.12.0(Access 2010级以上)*/
  30. constring02.Provider = "Microsoft.ACE.OLEDB.12.0";
  31. /*Access.mdb(Access 2007级以下)
  32. *Access.accdb(Access 2010级以上)*/
  33. constring02.DataSource = @"d:\users\lizw\桌面\Access.accdb";
  34. Console.WriteLine(constring02.ToString());//输出连接字符串
  35. OleDbConnection con02 = new OleDbConnection(constring02.ToString());
  36. con02.Open();//打开数据库
  37. con02.Dispose();//关闭数据库
  38. //连接SQLite数据库========================================================
  39. SQLiteConnectionStringBuilder constring03 = new SQLiteConnectionStringBuilder();
  40. constring03.DataSource = @"d:\users\lizw\桌面\SQLite.db";
  41. Console.WriteLine(constring03.ToString());//输出连接字符串
  42. SQLiteConnection con03 = new SQLiteConnection(constring03.ToString());
  43. con03.Open();//打开数据库
  44. con03.Dispose();//关闭数据库
  45. Console.WriteLine("OK!");
  46. Console.Read();
  47. }
  48. }

注意:对于部分数据库(如:SQLite)的DLL文件有64位于32位版本的,在编译项目时要根据引用的DLL版本选择对应的目标平台,否者会出现无法加载DLL的错误!

(2)高效的使用连接

在使用数据库的连接资源时,要确保每个资源在使用完后立即关闭。因为数据库的连接资源是很“稀缺”的资源,下面的例子提供了两种释放数据库的连接的例子。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. //第一种方式
  15. try
  16. {
  17. con01.Open();//打开数据库
  18. //操作数据库
  19. }
  20. catch (Exception e)
  21. {
  22. //异常处理
  23. }
  24. finally
  25. {
  26. con01.Dispose();//关闭数据库
  27. }
  28. //第二种方式
  29. using (con01)
  30. {
  31. con01.Open();//打开数据库
  32. //操作数据库
  33. }
  34. Console.WriteLine("OK!");
  35. Console.Read();
  36. }
  37. }

注意:当操作数据库发生异常时,第二种方式(使用using语句)可能会失效,不会释放数据库的链接。

(3)事物

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打开数据库
  15. MySqlTransaction tra = con01.BeginTransaction();//开启事物
  16. try
  17. {
  18. //操作数据库
  19. tra.Commit();//提交操作
  20. }
  21. catch (Exception e)
  22. {
  23. tra.Rollback();//回滚数据
  24. }
  25. finally
  26. {
  27. con01.Dispose();//关闭数据库
  28. }
  29. Console.WriteLine("OK!");
  30. Console.Read();
  31. }
  32. }

3.命令

(1)执行命令

ExecuteNonQuery()方法:用于UPDATTE、INSERT、DELETE语句,它的返回值是受影响的记录的个数。但是调用带输出参数的存储过程,该方法就有返回值。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打开数据库
  15. MySqlTransaction tra = con01.BeginTransaction();//开始事物
  16. string select = "delete from test1";
  17. try
  18. {
  19. MySqlCommand cmd = new MySqlCommand(select, con01);
  20. int count = cmd.ExecuteNonQuery();//执行命令返回受影响的数据记录数
  21. tra.Commit();//提交
  22. Console.WriteLine("删除记录数:" + count);
  23. }
  24. catch (Exception e)
  25. {
  26. tra.Rollback();//回滚
  27. Console.WriteLine(e.Message);
  28. }
  29. finally
  30. {
  31. con01.Dispose();//关闭数据库
  32. }
  33. Console.WriteLine("OK!");
  34. Console.Read();
  35. }
  36. }

ExecuteReader()方法:返回结果集,一般用于查询。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打开数据库
  15. string select = "select name,age from test1";
  16. try
  17. {
  18. MySqlCommand cmd = new MySqlCommand(select,con01);
  19. MySqlDataReader reader = cmd.ExecuteReader();//执行命令返回结果集
  20. while (reader.Read())
  21. {
  22. Console.WriteLine(reader[0]+"------"+reader[1]);
  23. }
  24. }
  25. catch (Exception e)
  26. {
  27. Console.WriteLine(e.Message);
  28. }
  29. finally
  30. {
  31. con01.Dispose();//关闭数据库
  32. }
  33. Console.WriteLine("OK!");
  34. Console.Read();
  35. }
  36. }

ExecuteScalar()方法:返回第一行第一列的值,当要得到表中的记录个数或服务器上的当前时间时就可以使用到此方法。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打开数据库
  15. string select = "select count(*) from test1";
  16. try
  17. {
  18. MySqlCommand cmd = new MySqlCommand(select, con01);
  19. object count = cmd.ExecuteScalar();//执行命令返回受影响的数据记录数
  20. Console.WriteLine("记录数:" + count);
  21. }
  22. catch (Exception e)
  23. {
  24. Console.WriteLine(e.Message);
  25. }
  26. finally
  27. {
  28. con01.Dispose();//关闭数据库
  29. }
  30. Console.WriteLine("OK!");
  31. Console.Read();
  32. }
  33. }

(2)向SQL语句中传参数

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打开数据库
  15. MySqlTransaction tra = con01.BeginTransaction();//开始事物
  16. string select = "INSERT INTO test1 (id,name,age) VALUES (@id,@name,@age);";
  17. try
  18. {
  19. MySqlCommand cmd = new MySqlCommand(select, con01);
  20. //设置参数类型
  21. MySqlParameter id = new MySqlParameter("@id", MySqlDbType.Int32);
  22. MySqlParameter name = new MySqlParameter("@name", MySqlDbType.VarChar,20);
  23. MySqlParameter age = new MySqlParameter("@age", MySqlDbType.Int32);
  24. //添加参数
  25. cmd.Parameters.Add(id);
  26. cmd.Parameters.Add(name);
  27. cmd.Parameters.Add(age);
  28. //为参数赋值
  29. for (int i = 0; i < 100; i++)
  30. {
  31. id.Value = i;
  32. name.Value = "李志伟" + i;
  33. age.Value = i + 20;
  34. cmd.ExecuteNonQuery();//插入数据
  35. Console.WriteLine(i);
  36. }
  37. tra.Commit();//提交
  38. }
  39. catch (Exception e)
  40. {
  41. tra.Rollback();//回退
  42. Console.WriteLine(e.Message);
  43. }
  44. finally
  45. {
  46. con01.Dispose();//关闭数据库
  47. }
  48. Console.WriteLine("OK!");
  49. Console.Read();
  50. }
  51. }

4.管理数据和关系:DataSet类

(1)数据集(DataSet)

DataSet类是数据的脱机容器。它不包含数据库连接的概念,实际上存储在DataSet类中的数据不一定来源于数据库,它可以是来自CSV文件、XML文件的记录。除了在DataSet中定义数据外,也可以定义表之间的连接。DataSet类基本上市内存中的数据库,包含了所有表、关系和约束。

(2)数据表(DataTable)

一个DataSet中可以有多个DataTable,DataTable的结构如下图,DataTable对象可以附带任意多个扩展属性,扩展属性并不会保存在数据库中。

Rows集合包含了表中的数据行,通过它可以访问到表中的所有数据。Columns集合包含已经添加到表中的DataColumn实例,它们定义了数据的架构,如数据类型、是否可为空等。Constraints集合可以用唯一约束或主键约束来填充。

(3)数据列(DataColumn)

DataColumn对象也可以附带任意多个扩展属性。DataColumn对象定义了DataTable中某列的属性,如该列的数据类型,该列是否为只读,以及其它属性。其属性如下:

AllowDBNull         是否允许空值

AutoIncrement       是否将列的值自动递增

AutoIncrementSeed   定义AutoIncrement列的起始值

AutoIncrementStep   定义AutoIncrement列使用的增量

Caption             获取或设置列的标题

ColumnMapping       获取或设置列的MappingType

ColumnName          获取或设置 DataColumnCollection 中的列的名称

DataType            获取或设置存储在列中的数据的类型

DateTimeMode        获取或设置列的 DateTimeMode

DefaultValue        在创建新行时获取或设置列的默认值

ReadOnly            是否还允许更改

Unique              是否必须是唯一的

Expression          获取或设置表达式,用于筛选行、计算列中的值或创建聚合列

(4)数据行(DataRow)

DataTable表中的数据是用DataRow对象来访问。还使用DataRowVersion枚举来访问DataRow的不同版本的值,下表是DataRowVersion枚举的成员:

Original    原始值,如果调用DataRow的AcceptChanges()方法,该值就会更新到当前值

Current     列表的当前值,如果没有编辑,该值与初值相同,否者是最后编辑的值

Proposed    建议值,调用BeginEdit方法就会有推荐值,直到调用EndEdit或CancelEdit方法为止。

Default     默认值,列设置的默认值

数据行有一个状态标志RowState属性,它是DataRowState枚举类型,成员如下:

Detached    DataRow在以下情况下立即处于此状态:创建之后添加到集合中之前;从集合中移除之后。

Unchanged   表示该行自上次调用 AcceptChanges 以来尚未更改。

Added       该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。

Deleted     该行已通过 DataRow 的 Delete 方法被删除。

Modified    该行已被修改,AcceptChanges 尚未调用。

一般在成功更新数据源(即把修改的数据持久化到数据库中)之后调用AcceptChanges方法。修改DataRow中的数据常用的是使用索引器,但如果对数据进行了许多修改,就要考虑使用BeginEdit()和EndEdit()方法,因为对DataRow中的数据进行修改会引发ColumnChanging事件,如果在修改前调用BeginEdit()方法就不会引发ColumnChanging事件,修改完成再调用EndEdit()方法持久化修改,如果要回退修改可以调用CancelEdit()方法。DataRow可以以某种方式链接到其它数据行上,在数据之间可建立可导航的链接,使用GetChildRows()方法可以从同一个DataSet的另一个表把一组相关行返回。

程序示例:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连?接óMySQL,使?用?“°MySql.Data.dll”±
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打洙?开a数簓据Y库a
  15. using (con01)
  16. {
  17. string select = "select id,name,age from test1";
  18. MySqlDataAdapter da = new MySqlDataAdapter(select, con01);
  19. DataSet ds = new DataSet();
  20. da.Fill(ds, "test1");
  21. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  22. {
  23. Console.WriteLine(ds.Tables[0].Rows[i]["name"] + " \t" + ds.Tables[0].Rows[i]["age"]);
  24. }
  25. }
  26. Console.WriteLine("OK!");
  27. Console.Read();
  28. }
  29. }

(5)架构的生成

让运行库来完成

  1. MySqlDataAdapter da = new MySqlDataAdapter(select, con01);
  2. DataSet ds = new DataSet();
  3. da.Fill(ds, "test1");

编写代码来创建

  1. //手动写代码生成架构
  2. DataTable table = new DataTable("test1");
  3. table.Columns.Add(new DataColumn("id", typeof(int)));
  4. table.Columns.Add(new DataColumn("name", typeof(string)));
  5. table.Columns.Add(new DataColumn("age", typeof(int)));

使用XML建构生成器:请查看本文档的“XML架构:用XSD”

(6)数据关系(表的主/从关系)

  1. DataSet ds = new DataSet();
  2. //主表(老师信息表)
  3. DataTable teacher = new DataTable("Teacher");
  4. teacher.Columns.Add(new DataColumn("id", typeof(int)));
  5. teacher.Columns.Add(new DataColumn("name", typeof(string)));
  6. teacher.Columns.Add(new DataColumn("age", typeof(int)));
  7. ds.Tables.Add(teacher);
  8. //从表(学生信息表)
  9. DataTable student = new DataTable("Student");
  10. student.Columns.Add(new DataColumn("id", typeof(int)));
  11. student.Columns.Add(new DataColumn("name", typeof(string)));
  12. student.Columns.Add(new DataColumn("age", typeof(int)));
  13. student.Columns.Add(new DataColumn("TeacherID", typeof(int)));//外键
  14. ds.Tables.Add(student);
  15. //建立关系
  16. DataRelation dr = new DataRelation("TeacherStudent",//关系名
  17. ds.Tables["Teacher"].Columns["id"],//主表的主键
  18. ds.Tables["Student"].Columns["TeacherID"]);//从表的外键
  19. ds.Relations.Add(dr);//增加关系
  20. //填充数据
  21. teacher.Rows.Add(1, "teacher1", 20);
  22. student.Rows.Add(1, "student1", 18, 1);
  23. student.Rows.Add(2, "student2", 17, 1);
  24. student.Rows.Add(3, "student3", 16, 1);
  25. //根据主表信息得到所有相应的从表信息
  26. DataRow[] rows = ds.Tables["Teacher"].Rows[0].GetChildRows(dr);
  27. foreach (DataRow temp in rows)
  28. {
  29. Console.WriteLine(temp["id"] + "\t" + temp["name"] + "\t" + temp["age"] + "\t" + temp["TeacherID"]);
  30. }

(7)数据约束

  1. DataSet ds = new DataSet();
  2. //主表(老师信息表)
  3. DataTable teacher = new DataTable("Teacher");
  4. teacher.Columns.Add(new DataColumn("id", typeof(int)));
  5. teacher.Columns.Add(new DataColumn("name", typeof(string)));
  6. teacher.Columns.Add(new DataColumn("age", typeof(int)));
  7. ds.Tables.Add(teacher);
  8. //从表(学生信息表)
  9. DataTable student = new DataTable("Student");
  10. student.Columns.Add(new DataColumn("id", typeof(int)));
  11. student.Columns.Add(new DataColumn("name", typeof(string)));
  12. student.Columns.Add(new DataColumn("age", typeof(int)));
  13. student.Columns.Add(new DataColumn("TeacherID", typeof(int)));//外猘键ü
  14. ds.Tables.Add(student);
  15. //主键约束
  16. DataColumn[] pk = new DataColumn[1];
  17. pk[0] = teacher.Columns["id"];
  18. teacher.PrimaryKey = pk;
  19. //外键约束
  20. ForeignKeyConstraint fk = new ForeignKeyConstraint("FK_Teacher-Student",
  21. teacher.Columns["id"],
  22. student.Columns["TeacherID"]);
  23. fk.UpdateRule = Rule.Cascade;//设置更新约束
  24. fk.DeleteRule = Rule.SetNull;//设置删除约束
  25. ds.Tables["Student"].Constraints.Add(fk);

Rule枚举的值:

None        不对相关的行采取任何操作。

Cascade     删除或更新相关的行。这是默认选项。

SetNull     将相关的行中的值设置为 DBNull。

SetDefault  将相关的行中的值设置为 DefaultValue 属性中包含的值。

5.XML架构:用XSD

(1)XSD

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <xs:schema id="Teacher"
  3. targetNamespace="http://tempuri.org/XMLSchema1.xsd"
  4. elementFormDefault="qualified"
  5. xmlns="http://tempuri.org/XMLSchema1.xsd"
  6. xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
  7. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  8. xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  9. <xs:element name="Teacher">
  10. <xs:complexType>
  11. <xs:sequence>
  12. <xs:element name="id" msdata:ReadOnly="true" msdata:AutoIncrement="true" type="xs:int"/>
  13. <xs:element name="name" type="xs:string"/>
  14. <xs:element name="age" type="xs:int" minOccurs="0"/>
  15. </xs:sequence>
  16. </xs:complexType>
  17. </xs:element>
  18. </xs:schema>

(2)生成代码

在“开始-所有程序-Visual Studio 2010-Visual Studio Tool-命令提示符”中找到命令提示符执行命令“xsd XMLSchema.xsd /d”得到相应的代码文件XMLSchema.cs

(3)用DataSet加载XML架构

  1. DataSet ds = new DataSet();
  2. ds.ReadXmlSchema(@".\XMLSchema.xsd");

6.填充DataSet类

(1)用数据适配器填充DataSet

  1. MySqlDataAdapter da = new MySqlDataAdapter(select, con01);
  2. DataSet ds = new DataSet();
  3. da.Fill(ds, "test1");

(2)从XML中填充DataSet

  1. DataSet ds = new DataSet();
  2. ds.ReadXml(@".\MyData.xml");

7.持久化DataSet类的修改

(1)通过数据适配器进行更新

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打开数据库
  15. using (con01)
  16. {
  17. string sql = "select id,name,age from test1";
  18. DataSet ds = new DataSet();
  19. MySqlDataAdapter da = new MySqlDataAdapter(sql, con01);
  20. MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
  21. da.Fill(ds, "test1");//填充数据集
  22. foreach (DataRow temp in ds.Tables["test1"].Rows)
  23. {
  24. Console.WriteLine(temp["id"] + "\t" + temp["name"] + "\t" + temp["age"]);
  25. }
  26. Console.WriteLine("------------------------------------------------------");
  27. DataRow row = ds.Tables["test1"].NewRow();//新增行
  28. row["id"] = 2014;
  29. row["name"] = "李志伟";
  30. row["age"] = 21;
  31. ds.Tables["test1"].Rows[0]["name"] = "李志伟2014";//更新现有行
  32. ds.Tables["test1"].Rows[1].Delete();//删除行
  33. da.Update(ds, "test1");//提交更新数据
  34. ds.AcceptChanges();//更新数据集DataSet
  35. foreach (DataRow temp in ds.Tables["test1"].Rows)
  36. {
  37. Console.WriteLine(temp["id"] + "\t" + temp["name"] + "\t" + temp["age"]);
  38. }
  39. }
  40. Console.WriteLine("OK!");
  41. Console.Read();
  42. }
  43. }

(2)写入XML输出结果

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //连接MySQL,使用“MySql.Data.dll”
  6. MySqlConnectionStringBuilder constring01 = new MySqlConnectionStringBuilder();
  7. constring01.Server = "localhost";
  8. constring01.UserID = "root";
  9. constring01.Password = "lizhiwei";
  10. constring01.Database = "test";
  11. constring01.Pooling = false;
  12. constring01.Port = 3306;
  13. MySqlConnection con01 = new MySqlConnection(constring01.ToString());
  14. con01.Open();//打开数据库
  15. using (con01)
  16. {
  17. string sql = "select id,name,age from test1";
  18. DataSet ds = new DataSet();
  19. MySqlDataAdapter da = new MySqlDataAdapter(sql, con01);
  20. MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
  21. da.Fill(ds, "test1");
  22. foreach (DataRow temp in ds.Tables["test1"].Rows)
  23. {
  24. Console.WriteLine(temp["id"] + "\t" + temp["name"] + "\t" + temp["age"]);
  25. }
  26. Console.WriteLine("------------------------------------------------------");
  27. ds.WriteXml(@"D:\users\lizw\桌面\DataSet.xml");//得到XML数据
  28. ds.WriteXmlSchema(@"D:\users\lizw\桌面\DataSetSchema.xml");//得到XML架构
  29. }
  30. Console.WriteLine("OK!");
  31. Console.Read();
  32. }
  33. }

8.使用ADO.NET

(1)分层开发

  1. DataSet newds = ds.Copy();//复制当前DataSet的架构和数据
  2. newds = ds.Clone();//只复制当前DataSet的架构
  3. newds = ds.GetChanges();//只返回更改的数据
  4. ds.GetChanges(DataRowState.Added);//只返回某些(这里是新增)更改的数据
  5. ds.Merge(?);//合并数据

-------------------------------------------------------------------------------------------------------------------------------

来自为知笔记(Wiz)

时间: 2024-11-09 03:22:56

08.C#连接数据库(ADO.NET)的相关文章

克同极用后管期果要议向中如极示听适VybVfesyhpR

社保划到税务征收,将大大提升社保费的征管效率.税务的征管能力是目前而言最强的,以后税务征收社保不是代收,属于本职了. 之前税局要把社保信息和交个税的工资比对起来有困难!现在好了,个税是自己的,社保也是自己的,比对困难?不存在的! 这一变革,会给那些不给员工上社保.不全额上社保的企业致命一击! 最新案例 前段时间的发改委关于限制特定严重失信人乘坐民航的一则意见--发改财金[2018]385号,其中还有税务总局的联合署名. http://weibo.com/20180408PP/2309279811

百度哈斯发卡号是减肥哈卡斯加分了卡斯

http://www.ebay.com/cln/ta_ya20/-/167521224015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398283011/2015.02.08 http://www.ebay.com/cln/ta_ya20/-/167521242015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398294011/2015.02.08 http://www.ebay.co

猎豹MFC--CFile类家族介绍ADO连接数据库 打开数据库 关闭数据库 连接字符串

  ODBC最古老,但到今天还在使用.偶尔使用. DAO  和RDO  为旧接口. OLE DB新,复杂  微软 出了ADO. VC++   +  ADO是主流: MySQL  和Oracle都有专用接口. ADO底层是OLE DB实现.ADO是COM组件. ADO 专用文件夹: 要用msADO15.dll 打开stdafx.h头文件:在其内导入该库: 在初始化实例时  初始化ADO: 下面都是COM编程要求做的: windows内部大量使用COM. 异常处理: 然后整个项目就可以使用ADO了.

如何正确获得mysql,access的ADO连接字符串,并使用该连接字符串连接数据库

如何正确获得mysql的ADO连接字符串,摘自网页http://blog.csdn.net/zyq5945/article/details/5486393 首先你正确安装了MYSQL的数据库驱动程序(mysql-connector-odbc-5.1.6-win32.msi ) 1.在桌面上新建一个空的文本文件mysql.txt,重命名为mysql.udl: 2.双击这个mysql.udl文件,打开“数据库连接属性”对话框,在“提供程序”页选择”Micrsoft Ole DB Provider f

C++使用ADO连接数据库及其实例

读写数据库的技术很多,现在多用ADO.ADO以COM方式提供,所以它的很多行为遵循COM规范.首先,要引入ADO的COM文件,它的位置一般在"C:/Program Files/Common Files/System/ado/msado15.dll". 1. 引入ADO 打开预编译头文件StdAfx.h,写上引入声明: #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace

ADO.NET——Connection(连接数据库)

在ADO.NET对象模型中,Connection对象代表了与数据源之间的连接. .NET框架中有两个Connection对象:一个是OleDbConnection,用于大多数的数据库连接,一个是SqlConnection,是MS开发的专门用于针对SQLServer的连接.在创建Connection对象之前,你必须先引用System.Data.OleDb或者System.Data.SqlClient和System.Data三个名空间. 一,基本连接示例 对于连接对象的使用,可以类比VB中ADO的使

c++通过ADO连接数据库

c++通过ADO连接数据库,具体要求步骤如下: 1.要导入连接ADO库文件信息,方法 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")    rename("BOF","adoBOF")//必须要有(换行要有 \),如果是vc6开发,此句最好放在StdAfx.h

ado.net连接数据库的用法

一.简单介绍ADO.NET System.Data:DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint System.Data.Common(各种数据访问类的基类和接口):DataColumnMapping,DataTableMapping System.Data.SqlClient(对Sql Server进行操作的数据访问类): 1)SqlConnection:数据库连接器 2)SqlCommand:数据库命名对象 3)Sq

C#回顾 Ado.Net C#连接数据库进行增、删、改、查

一.简介 1.ado.net是一门数据库访问技术. 他可以通过程序来操作数据库 2.类库 Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令. 与数据库交互的过程意味着必须指明想要执行的操作.这是依靠Command对象执行的.开发人员使用Command对象来发送SQL语句给数据库.Command对象使用Connection