博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SqlDataAdapter类
阅读量:6235 次
发布时间:2019-06-22

本文共 5177 字,大约阅读时间需要 17 分钟。

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();        }

 

转载地址:http://szqna.baihongyu.com/

你可能感兴趣的文章
Java反射机制的适用场景及其利与弊 ***
查看>>
wine 运行Call of Duty Modern Warfare 2以及starcraft2方法
查看>>
找出表的记录数
查看>>
实现WCF和Unity 的集成
查看>>
Java 和 C#在重写上的区别
查看>>
基础才是重中之重——对var的误会,对不起,我愿望(冤枉)你了
查看>>
集合类型的装配
查看>>
【Linux开发技术之工具使用】配置VIM下编程和代码阅读环境
查看>>
【读书笔记】测试驱动开发(中文版)
查看>>
ExtAspNet v3.0.1
查看>>
javascript 构造函数和方法
查看>>
使用VB.net Express 2010开发AutoCAD.net插件调试时出现很多错误的解决办法
查看>>
.net服务使用笔记(原创)
查看>>
使用Tomcat配置域名
查看>>
[转]Oracle/Altibase数据库中Sequence的用法
查看>>
URAL 1009 K-based Numbers
查看>>
android 知识点汇总
查看>>
android之Notification通知
查看>>
C# 生成等比缩略图的类
查看>>
安利 : プログラミングで彼女をつくる 全攻略~
查看>>