问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c#连接好数据库后,如何用SqlDataAdapter类对象来查找符合条件的表数据?

发布网友 发布时间:2022-04-07 20:03

我来回答

2个回答

懂视网 时间:2022-04-08 00:25

  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类

标签:

热心网友 时间:2022-04-07 21:33

SqlDataAdapter是
DataSet和
SQL
Server之间的桥接器,用于检索和保存数据;所以应该用Fill
方法填充到
Dataset
之后
再做判断
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
门?049期父母欲其改娶五字金口决,开是什么特号生肖 支付宝怎么把银行卡的钱转到余额里呢? 下载wampserver5,安装并启动后不能启用apache、mysql的功能,请问这是怎... wampserver安装多个版本phpmysqlapache 四季豆有哪些吃法值得推荐? 四季豆牛肉馅饼的家常做法是什么? 香煎四季豆豆腐饼怎么做好吃 腾讯会议没声音怎么修复-腾讯会议没有声音修复办法 西安市高新区所有幼儿园 西安高新第二初级中学学区有哪些小区 直流电焊机电流不稳定,电流显示要比正常焊机电流大熄弧时有短暂的滋滋声? 应急物资的应急物资分类 怎么在QQ群里在资源 是百度云 可以给我 云百度的,资源分享QQ群吗?要免费人多的。谢谢 我想建一个网盘资源分享群,我有很多资源。想看看有多少人要加入的。 腾讯企业aip和个人微信功能作用有什么区别? 可以用钢丝球洗电压力锅内胆吗?为什么? 企业版是什么?都有哪些什么功能介绍? 在转转买手机被骗怎么办? 转转买手机被骗怎么办? 电饭煲内胆不能用钢丝球洗吗? 在转转被骗了咋办 在转转上被骗了1900元,应该如何维权? 什么是企业版?都有哪些什么功能介绍? 转转上被骗,怎么办? 转转上被骗了,客服能帮你做什么? 每个扩展名为.C的C源程序都应包含一个main函数 设计模式一般用来解决什么样的问题? 一个C语言语句应至少包括一个 号。 微网站提供整套的商业模式解决方案? 电焊机电流大,怎么调都调不小,换了几台机子都一样,是什么情况 电焊机送上电噪音大电流也很大怎么回事? 采购计划与采购物资分类明细表的先后顺序? 扫描二维码会危及手机支付安全吗? 南京玄武湖公园晚上几点关门?在线等 梦见我认识的一个和尚和一个喇嘛为了我搬家的事情吵架,出家师傅说心疼我还哭了? 南京周一哪些景点闭馆 WPS演示如何设置动画序列? 南京公交车和景点最晚开到几点 南京夫子庙几点关门? 焊接过程中电流忽大忽小的原因及解决办法 南京红山动物园门票价格,几点开门几点关们 使用发电机时,电焊机冲击电流大如何解决? 直流电焊机发现焊机电流忽大忽小如何处理? 焊机电流大了是什么原因 交流电焊机焊接电流过大是怎么回事? 30a点焊机出现大电流怎么办 为什么电焊机一开机使用就是大电流? 南京紫峰大厦观光层几点关门? 彩带球怎么系上去