SqlDataAdapter类常用操作

  SqlDataAdapter常用于从数据库中返回一个结果集时。

  常用操作:

  Fill();

  示例:

        static void Main(string[] args)
{
string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";
SqlConnection conn = new SqlConnection(str);
string strSql = "SELECT * FROM Person";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
da.TableMappings.Add("Table","Person"); //指定原表数据与DataTable的映射关系
da.Fill(ds,"Person"); //将数据填充到指定的DataTable foreach (DataRow dr in ds.Tables["Person"].Rows)
{
Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString());
} //当然也可以直接Fill,DataTable
DataTable dt = new DataTable();
da.Fill(dt); //当然Fill两次这里会有问题
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString());
} Console.ReadKey();
}

  1、多次开启关闭连接的问题

  也许我们已经留意到,使用SqlDataAdapter 不需要打开和关闭数据库连接。如果调用SqlDataAdapter的Fill方法,并且其SelectCommand属性的SqlConnection是关闭状态,则SqlDataAdapter会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用Fill方法前,SqlConnection是打开的,则查询执行完毕后,SqlConnection 还将是打开的,也就是说SqlDataAdapter会保证SqlConnection的状态恢复到原来的情形。
  看来SqlDataAdapter还是非常人性化的。但是这样会产生一个问题。假如数据库连接原本是关闭的,在查询的时候并没有打开,而直接Fill了两次,这样会导致数据库连接被打开和关闭了两次。这样是会影响效率的。在调用Fill时各打开和关闭了一次。
  为了避免多次打开和关闭数据库连接,我们可以这样:

  cn.Open();
  da.Fill(ds,"Person");
  da.Fill(dt);
  cn.Close();

  2、多次调用Fill方法需要注意数据重复和有效更新数据的问题

  假如我们多次调用了Fill方法Fill同一个DataTable

  da.Fill(ds,"Customers");
  …….
  da.Fill(ds,"Customers");

  通过两次调用Fill方法,SqlDataAdapter执行两次查询,并两次将查询结果保存到DataSet中,第一次调用在DataSet中创建了一个名为Customers的新表。第二次调用Fill方法将查询的结果追加到DataSet中的同一个表中,因此,每个客户的信息将在DataSet中出现两次!当然,如果数据库管理员对Customers表定义了主键,则SqlDataAdapter在天成DataTable时,会判断重复行,并自动丢弃掉旧的值。

  考虑一下,假定一个特定客户在第一次调用Fill方法时,存储于数据库中,那么SqlDataAdapter会将其添加到新建的DataTable中。如果后来这个客户被删除了,那么第二次调用Fill方法时,SqlDataAdapter将不会在查询结果中找到该客户信息,但是它也不会将客户信息从DataSet中删除。这就导致了数据更新的问题。

  InsertCommand

       static void Main(string[] args)
{
//INSERT实例,好复杂
string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";
SqlConnection conn = new SqlConnection(str); DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
SqlDataAdapter adapter = new SqlDataAdapter();
//adapter.Fill(dt); dt.Rows.Add(new object[] { "5", "曹操", "29" });
adapter.InsertCommand = new SqlCommand("INSERT INTO Person(Id,Name,Age) values(@ID,@Name,@Age)", conn);
adapter.InsertCommand.Parameters.Add("Id", SqlDbType.Int);
adapter.InsertCommand.Parameters.Add("Name", SqlDbType.VarChar);
adapter.InsertCommand.Parameters.Add("Age", SqlDbType.Int); adapter.InsertCommand.Parameters["Id"].SourceColumn = "Id";
adapter.InsertCommand.Parameters["Name"].SourceColumn = "Name";
adapter.InsertCommand.Parameters["Age"].SourceColumn = "Age"; adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
//adapter.Fill(dt);
if (dt.Rows.Count > 0)
{
adapter.Update(dt);
} Console.ReadKey();
}

  UpdateCommand

        static void Main(string[] args)
{
//Update实例
string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true"; using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
DataSet ds = new DataSet();
string sql = "select * from Person";
SqlDataAdapter adapate = new SqlDataAdapter(sql, conn);
adapate.Fill(ds, "Person"); ds.Tables["Person"].Rows[0]["Name"] = "改改改"; //动态生成的UpdateCommand必须要有主键
SqlCommandBuilder builder = new SqlCommandBuilder(adapate);
adapate.Update(ds, "Person");
}
Console.ReadKey();
}

  DeleteCommand

        static void Main(string[] args)
{
//Delete实例
string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true"; using (SqlConnection conn = new SqlConnection(str))
{
DataSet ds = new DataSet();
string sql = "SELECT * FROM Person";
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(ds, "Person");
adapter.DeleteCommand = new SqlCommand("DELETE FROM Person WHERE Id=@Id", conn);
adapter.DeleteCommand.Parameters.Add("Id", SqlDbType.Int);
adapter.DeleteCommand.Parameters["Id"].SourceColumn = "Id";
//删除第一行
ds.Tables["Person"].Rows[0].Delete();
Console.WriteLine(ds.Tables["Person"].Rows.Count);
adapter.Update(ds.Tables["Person"]);
} Console.ReadKey();
}

SqlDataAdapter类的更多相关文章

  1. c# SQL Server数据库操作-数据适配器类:SqlDataAdapter

    SqlDataAdapter类主要在MSSQL与DataSet之间执行数据传输工具,本节将介绍如何使用SqlDataAdapter类来填充DataSet和MSSQL执行新增.修改..删除等操作. 功能 ...

  2. 数据读取器对象SqlDataReader与数据适配器对象SqlDataAdapter的使用

        一.数据读取器对象SqlDataReader的使用      如何执行有查询结果集的select语句. 1.SqlDataReader对象的作用:当包含select语句的SqlCommad对象 ...

  3. 意外发现的大批量导入数据SqlBulkCopy类

    因为要做一个号码归属地查询小功能,因为要导入外部(文本文件)的电话归属地数据,使用的是SqlDataAdapter类,数据不多,只四万有多条,表也只有一个,phoneBook表,使用的是DataTab ...

  4. 数据库之SqlDataAdapter

    SqlDataAdapter 类 表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接.无法继承此类. 命名空间:System.Data.SqlClient ...

  5. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  6. Java进击C#——语法之ADO.NET

    本章简言 上一章讲到关于C#语法的基础部分.了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的.C#把访问数据库这一部分的知识点叫作ADO.NET.即是JAVA常常讲到的JDBC这一部分 ...

  7. C#数据库操作

    1.常用的T-Sql语句      查询:SELECT * FROM tb_test WHERE ID='1' AND name='xia'                SELECT * FROM ...

  8. C#与数据库访问技术总结(十四)之DataAdapter对象

    DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connectio ...

  9. net 数据库连接详解 相当经典啊

    ADO.NET与抽水的故事 ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写.ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一 ...

随机推荐

  1. LeetCode_Rotate Image

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  2. Vim 默认开启行号、语法显示等设置

      在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进等功能的.为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc. 在启动vim时,当前 ...

  3. UML--核心元素之参与者Actor

    参与者(actor):在系统之外与系统交互的某人或某事物.例如,管理员,用户等等. 参与者位于边界之外,边界之内的都不叫参与者.用一个词来形容更准确,主角.也就是只有主动启动了这个业务的人,才是参与者 ...

  4. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ

    · 学后心得体会与部分习题实现 心得体会: 曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E&g ...

  5. 【jquery插件】-网页下雪效果

        又到了年底,从圣诞节开始,可以发现各大网站的活动是越来越多,都变的银装素裹,本人由于业务需求也需要做这么一个效果,所以就通过google大神找了一下相关资源,结果就出现了N种雪花效果的方式.种 ...

  6. URL重写是实现PHP伪静态

    URL重写是实现PHP伪静态 应该这样说才是,URL重写是实现PHP伪静态的方式之一, 具体如: http://www.plframe.com/?x=1&y=2&z=3 换成 http ...

  7. [置顶] 【cocos2d-x入门实战】微信飞机大战之十二:分数的本地存储

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/12036237 作为一个单机游戏,连分数存储的的功能都没有,让它怎么在单机游戏圈里混 ...

  8. 涂抹Oracle笔记2:数据库的连接-启动-关闭

    一.数据库的连接sqlplus <username>[/<password>][@<connect_idertifier>]|/[as sysdba| as sys ...

  9. [HeadFirst-HTMLCSS学习笔记][第八章扩大你的词汇量]

    字体 font-family,可指定多个候选 body{ font-family:Verdana,Geneva,Arial,sans-serif; } font-size 字体大小 body{ fon ...

  10. 无法登陆mysql服务器

    解决 .#2002 无法登录 MySQL 服务器 将config.sample.inc.php复制成config.inc.php 出现这个错误,表示没有连接到数据库.修改config.inc.php文 ...