• SqlDataAdapter类


    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();
            }
  • 相关阅读:
    Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件EasyRTMPAndroid如何修改分辨率和码率
    高稳定性、低延时的网络全终端播放器H5播放器网页直播/点播播放器EasyPlayer.js播放flv格式视频显示跨域问题解决方案
    RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayerRTSP实现支持H265编码格式过程介绍
    简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)web实现RTMP推送组件EasyRTMPAndroid如何开启悬浮窗
    模板学习实践一 accumulationtraits
    模板学习实践二 pointer
    黑客屏保 代码来自网络搜索 做了部分改动
    设计模式之模板模式 template
    CMAKE 教程前两章节学习
    cmake 及make 实践记录
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3392593.html
Copyright © 2020-2023  润新知