【017】◀▶ C#学习(九) - ADO.NET

《C#入门经典(中文第四版)》在程序中访问数据库学习笔记

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

●·● 目录:

A0 ………… System.Data.SqlClient 命名空间

A1 ………… SqlConnection 类
A2 ………… SqlCommand 类(增、删、改、查代码)
A3 ………… SqlDataReader 类
A4 ………… SqlParameter 类
  ※ 参考:SQLHelper 语句 
A5 ………… SqlDataAdapter 类
A6 ………… System.Data 命名空间
A7 ………… DataTable 类
A8 ………… DataSet 类
A9 ………… DataTableCollection 类
G1 ………… DataRow 类

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

            ╔════════╗
╠════╣    第A0个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● System.Data.SqlClient 命名空间

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

            ╔════════╗
╠════╣    第A1个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● SqlConnection 类

1. 表示 SQL Server 数据库的一个打开的连接。无法继承此类。

2.SqlConnection 属性:

  • ConnectionString:获取或设置用于打开 SQL Server 数据库的字符串。
  • ConnectionTimeout:获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。 
  • Database:获取当前数据库或连接打开后要使用的数据库的名称。
  • DataSource:获取要连接的 SQL Server 实例的名称。 

3. SqlConnection 方法:

  • ChangePassword:将连接字符串中指示的用户的 SQL Server 密码更改为提供的新密码。
  • Close:关闭与数据库的连接。这是关闭任何打开连接的首选方法。
  • Open:使用 ConnectionString 所指定的属性设置打开数据库连接。 
  • CreateCommand:创建并返回一个与 SqlConnection 关联的 SqlCommand 对象。
using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
{conn.Open();conn.Close();
}

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

            ╔════════╗
╠════╣    第A2个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● SqlCommand 类

1. 表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。无法继承此类。

2. SqlCommand 构造函数:

  • SqlCommand():初始化 SqlCommand 类的新实例。
  • SqlCommand(String):用查询文本初始化 SqlCommand 类的新实例。
  • SqlCommand(String, SqlConnection):初始化具有查询文本和 SqlConnection 的 SqlCommand 类的新实例。
  • SqlCommand(String, SqlConnection, SqlTransaction):使用查询文本、一个 SqlConnection 以及 SqlTransaction 来初始化 SqlCommand 类的新实例。

3. SqlCommand 属性:

  • CommandText: 获取或设置要对数据源执行的 Transact-SQL 语句或存储过程。
  • CommandTimeout:获取或设置在终止执行命令的尝试并生成错误之前的等待时间。 
  • CommandType:获取或设置一个值,该值指示如何解释 CommandText 属性。
       CommandType 枚举
    • StoredProcedure:存储过程的名称。
    • TableDirect:表的名称。
    • Text:SQL 文本命令。
                  SqlCommand cmd = new SqlCommand("login", conn);cmd.CommandType = CommandType.StoredProcedure; //这里采用存储过程
      
  • Connection:获取或设置 SqlCommand 的此实例使用的 SqlConnection。
  • Transaction:获取或设置将在其中执行 SqlCommand 的 SqlTransaction。
  • Parameters:获取 SqlParameterCollection。(SQL中的参数集合)
    • SqlParameterCollection 类
              Count:返回一个整数,其中包含 SqlParameterCollection 中元素的数目。 只读。
              Item[Int32]:获取指定索引处的 SqlParameter。
              Item[String]:获取具有指定名称的 SqlParameter。
              Add (SqlParameter):将指定的 SqlParameter 对象添加到 SqlParameterCollection 中。
              AddWithValue (String parameterName, Object value):将一个值添加到 SqlParameterCollection 的末尾。在执行此方法的时候,会直接将参数传递!
              Insert - 增(使用 Parameters & 直接利用文本
      cmd.CommandText = "Insert Into Table1(UserName, PassWord) Values(@UN, @PW)";
      cmd.Parameters.AddWithValue("UN", textBox1.Text.Trim());
      cmd.Parameters.AddWithValue("PW", textBox2.Text.Trim());
      
      cmd.CommandText =String.Format("Insert into Table1(UserName, PassWord) Values('{0}', '{1}')",textBox1.Text.Trim(), textBox2.Text.Trim());        
      

              Delete - 删(使用 Parameters & 直接利用文本

      cmd.CommandText = "Delete From Table1 Where UserName = @UN";
      cmd.Parameters.AddWithValue("UN", textBox3.Text.Trim());
      
      cmd.CommandText = String.Format("Delete From Table1 Where UserName = '{0}'",textBox3.Text.Trim());
      

              Update - 改(使用 Parameters & 直接利用文本

      cmd.CommandText = "Update Table1 Set PassWord = @PW Where UserName = @UN";
      cmd.Parameters.AddWithValue("PW", textBox5.Text.Trim());
      cmd.Parameters.AddWithValue("UN", textBox4.Text.Trim());
      
      cmd.CommandText = String.Format("Update Table1 Set PassWord = '{0}' Where UserName = '{1}'",textBox5.Text.Trim(), textBox4.Text.Trim());
      

              Select - 查(使用 Parameters & 直接利用文本

      cmd.CommandText = "Select * From Table1 Where UserName = @UN";
      cmd.Parameters.AddWithValue("UN", textBox6.Text.Trim());
      
      cmd.CommandText = String.Format("Select * From Table1 Where UserName = '{0}'", textBox6.Text.Trim());
      
    • Clear:从 SqlParameterCollection 中移除所有 SqlParameter 对象。遍历的时候要注意清理!
      private static void UpdateDemographics(Int32 customerID,string demoXml, string connectionString)
      {// Update the demographics for a store, which is stored in an xml column. string commandText = "UPDATE Sales.Store SET Demographics = @demographics "+ "WHERE CustomerID = @ID;";using (SqlConnection connection = new SqlConnection(connectionString)){SqlCommand command = new SqlCommand(commandText, connection);command.Parameters.Add("@ID", SqlDbType.Int);command.Parameters["@ID"].Value = customerID;// Use AddWithValue to assign Demographics.// SQL Server will implicitly convert strings into XML.command.Parameters.AddWithValue("@demographics", demoXml);}
      }
      

4. SqlCommand 方法:

  • Cancel: 尝试取消 SqlCommand 的执行。
  • CreatParameter:创建 SqlParameter 对象的新实例。
  • EndExecuteNonQuery:完成 Transact-SQL 语句的异步执行。
  • ExecuteNonQuery:对连接执行 Transact-SQL 语句并返回受影响的行数。主要执行 Insert、Update、Delete 语句。
    Console.WriteLine("请输入用户名:");
    string username = Console.ReadLine();
    Console.WriteLine("请输入密码:");
    string password = Console.ReadLine();
    using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
    AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True"))
    {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = 
    "Insert into T_Users3(UserName,PassWord) values('" + username + "','" + password + "')";//等同于下面的表述cmd.CommandText =
    String.Format("Insert into T_Users3(UserName,PassWord) values('{0}','{1}')", username, password);cmd.ExecuteNonQuery();Console.WriteLine("插入成功!");Console.WriteLine("影响行数为:{0}行!",cmd.ExecuteNonQuery());         //返回值为int}
    }
    
  • ExecuteReader:将 CommandText 发送到 Connection 并生成一个 SqlDataReader。主要执行 Select 语句。
    • SqlDataReader:提供一种从 SQL Server 数据库读取行的只进流的方式。 此类不能被继承。
              FieldCount:获取当前行中的列数。
             Item[Int32]:在给定列序号的情况下,获取指定列的以本机格式表示的值。例如:reader[0]
             Item[String]:在给定列名称的情况下,获取指定列的以本机格式表示的值。例如:reader["ID"]
             HasRows:获取一个值,该值指示 SqlDataReader 是否包含一行或多行。
      using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
      AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
      {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = "Select * From Table1";SqlDataReader reader = cmd.ExecuteReader();string str = "用户名\t密码\r\n";while(reader.Read()){str = String.Format("{0}{1}\t\t{2}\r\n", str, reader["UserName"], reader["PassWord"]);}richTextBox1.Text = str;}conn.Close();
      }
      
  • ExecuteScalar:执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
    using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
    AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True"))
    {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){//加入了 output inserted.Id 之后会返回最后插入的Idcmd.CommandText = 
    "Insert into T_Users3(UserName,PassWord) output inserted.Id values('admin','888888')";           int i = Convert.ToInt32(cmd.ExecuteScalar());Console.WriteLine("插入成功!");Console.WriteLine("刚插入的为第{0}行!",i);}
    }
    

※ 参考:http://hi.baidu.com/asdfhxc/blog/item/3f0d95ad5d3966004a36d6bd.html

※ 参考:http://hi.baidu.com/asdfhxc/blog/item/c5ddcf6060eb974deaf8f8bf.html

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

            ╔════════╗
╠════╣    第A3个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● SqlDataReader 类

1. 提供一种从 SQL Server 数据库读取行的只进流的方式。无法继承此类。【适合大数据量,每次传入一行数据】

2. SqlDataReader 属性:

  • Depth:获取一个值,用于指示当前行的嵌套深度。
  • FieldCount: 获取当前行中的列数。
  • HasRows:获取一个值,该值指示 SqlDataReader 是否包含一行或多行。
  • IsClosed:检索一个布尔值,该值指示是否已关闭指定的 SqlDataReader 实例。
  • Item:获取以本机格式表示的列的值。
  • RecordsAffected:获取执行 Transact-SQL 语句所更改、插入或删除的行数。
  • VisibleFieldCount:获取 SqlDataReader 中未隐藏的字段的数目。

3. SqlDataReader 方法:

  • GetInt32(int i):获取指定列的 32 位有符号整数形式的值。
  • GetString(int i):获取指定列的字符串形式的值。
       0 为第一列,1 为第二列,2 为第三列......
  • GetOrdinal(String name):在给定列名称的情况下获取列序号。
       获得的值即为上面的0,1,2......
  • Read():使 SqlDataReader 前进到下一条记录。
    using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
    AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True"))
    {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = "select * from T_Users3";using (SqlDataReader reader = cmd.ExecuteReader()){while (reader.Read())        //一条条地往下执行{//简单判断以字母开头的UserName    if (reader.GetString(1)[0] < 'z' && reader.GetString(1)[0] > 'A')              {//通过PadRight,用空格将右侧补齐Console.WriteLine(reader.GetInt32(reader.GetOrdinal("Id")).ToString().PadRight(5) + reader.GetString(reader.GetOrdinal("UserName")).Trim().PadRight(15) + reader.GetString(reader.GetOrdinal("PassWord")).PadRight(20));           } }}}
    }
    

    效果如下图所示:

    //通过上面四个类,建立了一个验证密码的控制台程序!Check it out!!!using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;namespace ConsoleApplication1
    {class Program{static void Main(string[] args){//vs内嵌数据库,需加入此语句!string dataDir = AppDomain.CurrentDomain.BaseDirectory;          if (dataDir.EndsWith(@"\bin\Debug\") ||dataDir.EndsWith(@"\bin\Release\")){dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;AppDomain.CurrentDomain.SetData("DataDirectory",dataDir);}//先建立数据库,并加入测试的UserName和PassWord列!Console.WriteLine("请输入用户名:");               string username = Console.ReadLine();Console.WriteLine("请输入密码:");           string password = Console.ReadLine();using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True")){conn.Open();using (SqlCommand cmd = conn.CreateCommand()){//注意这个地方的单引号,很容易出错的!cmd.CommandText = "select * from T_Users where UserName = '" + username + "'";           using (SqlDataReader reader = cmd.ExecuteReader())        //查找上面的username!{if (reader.Read())              //存在则为true{//用户名存在//在PassWord列中遍历string dbpassword = reader.GetString(reader.GetOrdinal("PassWord"));      //注意要去掉数据库中字符串的空格,默认有空格的!      if (password == dbpassword.Trim())         {Console.WriteLine("登陆成功!");}else{Console.WriteLine("登录失败!");}}else{Console.WriteLine("用户名错误!");}}}}Console.ReadKey();}}
    }
    

     

    //简单变形,达到上面的效果!
    Console.WriteLine("输入用户名:");
    string username = Console.ReadLine();
    Console.WriteLine("输入密码:");
    string password = Console.ReadLine();using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
    AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True"))
    {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){//用户名正确,密码可以用:”3' or '1' = '1“,也可以登录成功!cmd.CommandText = 
    "select count(*) from T_Users3 where UserName = '" + username + "' and PassWord = '" + password + "'";int i = Convert.ToInt32(cmd.ExecuteScalar());if (i > 0)Console.WriteLine("Login Succeed!");elseConsole.WriteLine("Login Failed!");}
    }
    

     

    //用 SqlCommand 类的 Parameters 属性改写!
    Console.WriteLine("输入用户名:");
    string username = Console.ReadLine();
    Console.WriteLine("输入密码:");
    string password = Console.ReadLine();using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
    AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True"))
    {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = 
    "select count(*) from T_Users3 where UserName = @UserName and PassWord = @PassWord";cmd.Parameters.AddWithValue("UserName", username);cmd.Parameters.AddWithValue("PassWord", password);int i = Convert.ToInt32(cmd.ExecuteScalar());if (i > 0)Console.WriteLine("Login Succeed!");elseConsole.WriteLine("Login Failed!");}
    }
    

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

            ╔════════╗
╠════╣    第A4个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● SqlParameter 类

1. 表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。
2. SqlParameter 构造函数:

  • SqlParameter (String, Object):用参数名称和新 SqlParameter 的一个值初始化 SqlParameter 类的新实例。
  • SqlParameter (String, SqlDbType):用参数名称和数据类型初始化 SqlParameter 类的新实例。
       SqlDbType 枚举:指定要用于 SqlParameter 中的字段和属性的 SQL Server 特定的数据类型。
    • BigInt:Int64。
    • Binary:Byte 类型的 Array。

※ 建立通用的 SQL 查询语句!

首先,新建一个 SQLHelper 类:

    class SQLHelper{//执行查询public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)  {using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")){conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;foreach(SqlParameter parameter in parameters){cmd.Parameters.Add(parameter);}return cmd.ExecuteNonQuery();}}}//执行返回第一行第一列的内容public static object ExecuteScalar(string sql, params SqlParameter[] parameters)  {using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")){conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;foreach (SqlParameter parameter in parameters){cmd.Parameters.Add(parameter);}return cmd.ExecuteScalar();}}}//执行返回内存中的表格public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)  {using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")){conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;foreach (SqlParameter parameter in parameters){cmd.Parameters.Add(parameter);}DataSet dataset = new DataSet();SqlDataAdapter adapter = new SqlDataAdapter(cmd);adapter.Fill(dataset);DataTable table = dataset.Tables[0];return table;}}}}

然后,在程序中可以按照如下来调用,参数的个数可以从1个到无数个!

        private void button2_Click(object sender, EventArgs e){SQLHelper.ExecuteNonQuery("insert into Table1(UserName,PassWord) values(@UserName,@PassWord)",new SqlParameter("UserName", textBox1.Text), new SqlParameter("PassWord", textBox2.Text));//实现数据的插入}private void button3_Click(object sender, EventArgs e){SQLHelper.ExecuteNonQuery("update Table1 set UserName = 'Mike',PassWord = 'love' where UserName = @UserName",new SqlParameter("UserName",textBox1.Text));//实现数据的更新}private void button4_Click(object sender, EventArgs e){DataTable table = SQLHelper.ExecuteDataTable("select * from Table1");for (int i = 0; i < table.Rows.Count;i++ ){DataRow row = table.Rows[i];MessageBox.Show(row["UserName"].ToString());//实现表格存储到内存}}    

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

            ╔════════╗
╠════╣    第A5个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● SqlDataAdapter 类

1. 表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。无法继承此类。

2. SqlDataAdapter 构造函数:

  • SqlDataAdapter (SqlCommand):初始化 SqlDataAdapter 类的新实例,用指定的 SqlCommand 作为 SelectCommand 的属性。

3. SqlDataAdapter 属性:

  • DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
  • InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
  • SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。 
  • UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。

4. SqlDataAdapter 方法:

  • Fill:填充 DataSet 或 DataTable。
    • Fill (DataSet):在 DataSet 中添加或刷新行以匹配使用 DataSet 名称的数据源中的行,并创建一个名为“Table”的 DataTable
    • Fill (DataTable):在 DataSet 的指定范围中添加或刷新行以匹配使用 DataSetDataTable 和 IDataReader 名称的数据源中的行。
  • Update:为 DataSet 中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。
    • Update (DataRow[]):为指定的 DataRow 对象数组中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。 
    • Update (DataSet):为指定 DataSet 中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。
    • Update (DataTable):为指定 DataTable 中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。

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

            ╔════════╗
╠════╣    第A6个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● SqlCommandBuilder 类

1. 自动生成单表命令,用于将对 DataSet 所做的更改与关联的 SQL Server 数据库的更改相协调。无法继承此类。

2. SqlCommandBuilder 构造函数:

  • SqlCommandBuilder ():初始化 SqlCommandBuilder 类的新实例。
  • SqlCommandBuilder (SqlDataAdapter):使用关联的 SqlDataAdapter 对象初始化 SqlCommandBuilder 类的新实例。
            using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")){conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = "select * from Table1";SqlDataAdapter adapter = new SqlDataAdapter(cmd);DataSet dataset = new DataSet();adapter.Fill(dataset);DataTable table = dataset.Tables[0];DataRow row = table.Rows[0];row["Name"] = "Matthew";SqlCommandBuilder builder = new SqlCommandBuilder(adapter);         //传入数据库adapter.Update(dataset);MessageBox.Show("修改成功!");}}

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

            ╔════════╗
╠════╣    第A7个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● System.Data 命名空间

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

            ╔════════╗
╠════╣    第A7个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● DataTable 类

1. 表示一个内存中数据表

2. DataTable 属性:

  • Columns:获取属于该表的列的集合。≡ DataColumnCollection
    • DataColumnCollection 类表示 DataTable 的 DataColumn 对象的集合。
      • Count、Item、List。
      • Add、Clear、IndexOf、InsertAt、Remove、RemoveAt。
    • DataColumn 类:表示 DataTable 中的列的架构。
  • DataSet:获取此表所属的 DataSet。
  • Rows:获取属于该表的行的集合。≡ DataRowCollection
    • DataRowCollection表示 DataTable 的行的集合。
      • Count:获取该集合中 DataRow 对象的总数。
      • Item:作为列表获取集合的项。(可以获取每一个表的值,对应 DataRow 对象)
      • List:作为列表获取集合的项。
      • Add(DataRow):将指定的 DataRow 添加到 DataRowCollection 对象中。
      • Clear:清除所有行的集合。
      • IndexOf:获取指定 DataRow 对象的索引。
      • InsertAt:将新行插入到集合中的指定位置。
      • Remove:从集合中移除指定的 DataRow。
      • RemoveAt:从集合中移除指定索引处的行。
    • DataRow 类:表示 DataTable 中的一行数据。
  • TableName:获取或设置 DataTable 的名称。

3. DataTable 方法:

  • Clear:清除所有数据的 DataTable。
  • Copy:复制该 DataTable 的结构和数据。
  • NewRow:创建与该表具有相同架构的新 DataRow。(并不是在数据表中添加了新行)
    DataRow myRow = dt.NewRow();
    myRow["学生"] = "小蟹";
    myRow["英语"] = 82;
    myRow["数学"] = 93;
    myRow["自然"] = 39;
    myRow["美术"] = 39;
    dt.Rows.Add(myRow);
    

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

            ╔════════╗
╠════╣    第A8个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● DataSet 类

1. 表示数据的内存中缓存。【适合小数据量的适合用,一次将所有放入内存】

2. DataSet 属性:

  • Tables:获取包含在 DataSet 中的表的集合。≡ DataTableCollection
    • DataTableCollection 类:表示 DataSet 的表的集合。
      • Count获取集合中的元素的总数。
      • Item[Int32]获取位于指定索引位置的 DataTable 对象。
      • Item[String]获取具有指定名称的 DataTable 对象。

3. DataSet 方法:

  • Clear:通过移除所有表中的所有行来清除任何数据的 DataSet。
  • Copy:复制该 DataSet 的结构和数据。
  • Merge (DataRow ()):将 DataRow 对象数组合并到当前的 DataSet 中。
  • GetChanges:获取 DataSet 的副本,该副本包含自上次加载以来或自调用 AcceptChanges 以来对该数据集进行的所有更改。
            using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")){conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = "select * from Table1";DataSet dataset = new DataSet();                     //相当于容器SqlDataAdapter adapter = new SqlDataAdapter(cmd);    //执行SQL语句adapter.Fill(dataset);                               //传入数据DataTable table = dataset.Tables[0];                 //传给Tablefor (int i = 0; i < table.Rows.Count;i++ )           //遍历Table的Row{DataRow row = table.Rows[i];                     //传递给每个Rowstring name = Convert.ToString(row["UserName"]); //取值MessageBox.Show(name);}}}

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

            ╔════════╗
╠════╣    第A9个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● DataTableCollection 类

1. 表示 DataSet 的表的集合。

2. DataTableCollection 属性:

  • Count:获取集合中的元素的总数。
  • Item (Int32):获取位于指定索引位置的 DataTable 对象。
  • Item (String):获取具有指定名称的 DataTable 对象。
  • Item (String dataTableName, String dataTableNamespace):获取指定命名空间中具有指定名称的 DataTable 对象。
  • List:作为列表获取集合的项。≡ ArrayList

3. DataTableCollection 方法:

  • Add:使用默认名称创建一个新的 DataTable 对象,并将其添加到集合中。
  • Add (DataTable):将指定的 DataTable 添加到集合。
  • Add (String):使用指定名称创建一个 DataTable 对象,并将其添加到集合中。
  • AddRange:将指定的 DataTable 数组的元素复制到集合末尾。
  • Clear:清除所有 DataTable 对象的集合。
  • Contains (String):获取一个值,该值指示集合中是否存在具有指定名称的 DataTable 对象。
  • CopyTo (DataTable(), Int32):将当前 DataTableCollection 的所有元素复制到一维 Array,从指定目标数组索引处开始。
  • IndexOf (DataTable):获取指定 DataTable 对象的索引。
  • IndexOf (String):获取具有指定名称的 DataTable 对象的集合中的索引。
  • Remove (DataTable):从集合中移除指定的 DataTable 对象。
  • Remove (String):从集合中删除具有指定名称的 DataTable 对象。
  • RemoveAt:从集合中删除具有指定名称的 DataTable 对象。

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

            ╔════════╗
╠════╣    第G1个    ╠══════════════════════════════════════════════════╣
            ╚════════╝

●·● DataRow 类

1. 表示 DataTable 中的一行数据。

2. DataRow 属性:

  • Item (DataColumn):获取或设置存储在指定的 DataColumn 中的数据。
  • Item (Int32):获取或设置存储在由索引指定的列中的数据。
    ※ 使用:
    • row [0] 直接引用索引!
  • Item (String):获取或设置存储在由名称指定的列中的数据。
    ※ 使用:
    • row ["UserName"] 直接引用列名称!
  • Table:获取该行拥有其架构的 DataTable。
  • RowState:获取与该行和 DataRowCollection 的关系相关的当前状态。
       RowState 枚举获取 DataRow 对象的状态。
    • Detached:该行已被创建,但不属于任何 DataRowCollection。
    • Unchanged:该行自上次调用 AcceptChanges 以来尚未更改。
    • Added:该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。
    • Deleted:该行已通过 DataRow 的 Delete 方法被删除。
    • Modified:该行已被修改,AcceptChanges 尚未调用。

3. DataRow 方法:

  • Delete:删除 DataRow
  • IsNull (DataColumn):获取一个值,该值指示指定的 DataColumn 是否包含 null 值。
  • IsNull (Int32):获取一个值,该值指示位于指定索引处的列是否包含 null 值。
  • IsNull (String):获取一个值,该值指示指定的列是否包含 null 值。
  • SetNull:将指定的 DataColumn 的值设置为 null 值。

 

转载于:https://www.cnblogs.com/alex-bn-lee/archive/2012/03/09/2387960.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 浏览器为什么无法直接JSX?怎么解决呢?

[react] 浏览器为什么无法直接JSX&#xff1f;怎么解决呢&#xff1f; 因为浏览器只能解决原生的JS代码&#xff0c;jsx不属于原生的js&#xff0c;它是类似于html的语法&#xff0c;然后转化成一个js对象。 这个转化的过程就是通过Babel的babel/plugin-transform-react-jsx插…

vim 基础学习之文件跳转

1. -当前文件上次跳转之前的位置2. .-当前文件上次修改的位置,只要是发生了可能导致变化的命令操作就会被标记&#xff0c;哪怕实际结果没有变化3. ^-当前文件上次插入的位置,只要是发生了插入操作命令就会被标记&#xff0c;哪怕实际结果没有变化4. [-当前文件上次修改或者复制…

[react] react声明组件有哪几种方法,各有什么不同?

[react] react声明组件有哪几种方法&#xff0c;各有什么不同&#xff1f; 1、无状态组件 2、有状态组件 3、高阶组件 4、容器组件 5、回调组件 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

【转】主流PHP框架间的比较(Zend Framework,CakePHP,CodeIgnit...

2019独角兽企业重金招聘Python工程师标准>>> 【转】主流PHP框架间的比较&#xff08;Zend Framework&#xff0c;CakePHP&#xff0c;CodeIgniter&#xff0c;Symfony&#xff0c;ThinkPHP&#xff0c;FleaPHP&#xff09; 2011年08月14日 星期日 12:51 转载自 leol…

[react] createElement与cloneElement两者有什么区别?

[react] createElement与cloneElement两者有什么区别&#xff1f; createElement是创建一个React元素&#xff0c;jsx即是这个函数的语法糖&#xff1b;它的函数签命是React.createElement(type, [props], [...children])cloneElement是拷贝一个React元素&#xff0c;可选择在…

第8章 Service基础Activity与Service绑定

要知道如果调用函数startService方法&#xff0c;那么即使你的程序退出了&#xff0c;但是Service依然运行在后台;也就是说此时想要停止service必须调用stopService方法。 现在我们把Activity与Service绑定在一起&#xff0c;那就是Service要随着程序的退出而终止&#xff0c;此…

[react-router] React-Router 4的switch有什么用?

[react-router] React-Router 4的switch有什么用&#xff1f; Switch的 子组件只能是Route或者Switch组件&#xff0c;它的作用是匹配到下面的第一个路由组件&#xff0c;下面的路由组件就不再进行匹配展示了 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。…

linux_shell_根据网站来源分桶

应用场景&#xff1a; 3kw行url\thtml记录 【网站混合】 需要&#xff1a;按照网站来源分桶输出 执行shell cat */*pack.html|awk -F \t {split($1,arr,"/");sitearr[3];print $0 > site} 转载于:https://www.cnblogs.com/cphmvp/p/5139994.html

[react] 你知道Virtual DOM的工作原理吗?

[react] 你知道Virtual DOM的工作原理吗&#xff1f; Virtual DOM是什么&#xff1a;虚拟DOM是真实DOM的javascript对象的映射Virtual DOM的工作原理&#xff1a;数据驱动视图更新这个过程中&#xff0c;首先会改变虚拟DOM对象&#xff0c;一个视图的更新周期&#xff0c;首先…

C#正则表达式积累

感谢&#xff1a;侧身向南边 http://www.cnblogs.com/kissknife/archive/2008/03/23/1118423.html的分享给了自己学习的机会 -------------------------------------C#的正则表达式-------------------------------------------的作用&#xff1a;string x"D:\\My Huang…

如何利用业务时间提升自我

转载于:https://www.cnblogs.com/helloIT/articles/5140273.html

[react] react兄弟组件如何通信?

[react] react兄弟组件如何通信&#xff1f; 状态提升&#xff0c;通过父组件的state和方法传递到两个子组件 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

'800a0005' 图片上传出现写入文件失败的错误 -- 修改pload_5xsoft.inc

一、基本问题 一般是文件写入的路径不对&#xff0c;或者是目录的权限没有设置好&#xff08;必须对everyone或者来宾用户IIS_IUSRS设置为完全访问&#xff09; 二、特殊问题 1、错误提示&#xff1a; ADODB.Stream 错误 800a0bbc 写入文件失败。 /code/zhaosheng1/ADMIN/uplo…

AutoMapper用法一瞥

前段时候做个小项目用到了autoMapper&#xff08;参考了NOP里的用法&#xff09;&#xff0c;感觉还行&#xff0c;用起来挺方便的。首先复杂的东西我就不说了&#xff0c;至于详细的教程我也就不写了&#xff0c;比较园子里有很多这样的文章&#xff0c;我就分享下&#xff0c…

ping得通外网,上得了QQ,游戏,却打不开网页。

操作系统&#xff1a;win7_64bit 下午帮我小艾优化电脑&#xff0c;不知道把什么插件给卸载了。 她回来以上就上不了网&#xff0c;我首先ping网关&#xff0c;DNS&#xff0c;外网&#xff0c;都通。 登QQ正常。 我的思路&#xff1a; 先把Socket套字结相关的卸载掉就是&#…

WebGIS中一种根据网格索引判断点面关系的方法

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.背景 判断点面关系的算法有很多&#xff0c;在我之前的博文中有一篇专门对其进行了描述&#xff1a;判断点是否落在面中的Oracle存储过程描述。其中提…

[react] 怎样在react中创建一个事件?

[react] 怎样在react中创建一个事件&#xff1f; var EventEmitter require(events).EventEmitter; class App extends Component{ constructor(props){ super(props); } componentDidMount(){ this.itemChange emitter.addListener(ItemChange, (msg,data)>console.log(…

重写Checkbox 改写选择框的大小

/* 作者&#xff1a;Starts_2000* 日期&#xff1a;2009-07-30* 网站&#xff1a;http://www.csharpwin.com CS 程序员之窗。* 你可以免费使用或修改以下代码&#xff0c;但请保留版权信息。* 具体请查看 CS程序员之窗开源协议&#xff08;http://www.csharpwin.com/csol.html&…

HDU4349--Xiao Ming's Hope(数论)

输入一个n(1<n<108)&#xff0c;求C(n,0),C(n,1),C(n,2)...C(n,n)有多少个奇数。 Lacus定理 http://blog.csdn.net/acm_cxlove/article/details/7844973 A、B是非负整数&#xff0c;p是质数。AB写成p进制&#xff1a;Aa[n]a[n-1]...a[0]&#xff0c;Bb[n]b[n-1]...b[0]。…

[react] react中可以在render访问refs吗?为什么?

[react] react中可以在render访问refs吗&#xff1f;为什么&#xff1f; <><span id"name" ref{this.spanRef}>{this.state.title}</span><span >{this.spanRef.current ? 有值 : 无值}</span></> 不可以&#xff0c;render …