原来一个 ADODB.RECORDSET 对象能够完成的事情现在在 ADO.NET 中是否一定要很多个对象才能完成?
大家帮我看一下,我是不是搞错了?根本不需要用那么多对象的?
//检索数据的步骤
            //打开 SQLConnection 对象,建立 SQLCommand 对象,赋值 SQLCommand.CommandText 属性
            //用 DataAdapter 对象的 SelectCommand 方法绑定 SQLCommand 对象执行的结果
            //将 DataAdapter 填充到 DataSet 对象中,成为指定名称的 DataTable 对象
            //用 DataRow 变量来获取 DataTable 对象中的某一行
            //用 DataRow[index].ToString() 来获取某个字段的文本值,如果要直接获取值用 DataRow[index]
            //而且好像 DataTable 自己并不能进行排序或者检索(Adodb.Recordset.sort 或者 filter 方法的功能),
            //而是要使用 DataTable.DefaultView 来获取 DataView 来实现        public static void DBOpreate()
        {
            SqlConnection conn = new SqlConnection();
            SqlConnectionStringBuilder bui = new SqlConnectionStringBuilder();
            SqlCommand cmd = new SqlCommand();
            SqlDataReader rd;
            
            DateTime dteD2 = DateTime.Now;
            //DateTime 作为一种对象已经不需要 DateAdd 或者 DateDiff DatePart 等函数了
            DateTime dteD1 = dteD2.AddDays(-30);     //30天内没有进出的商品无需生成限价表
            //格式化日期的方法请参考帮助中的:自定义 DateTime 格式字符串
            //Console.WriteLine("日期:" + dteD1.ToString("yyyy-MM-dd"));
            //Console.WriteLine("两个日期:{0,-20:yyyy-MM-dd}{1,-20:yyyy-MM-dd}",dteD1,dteD2);            
            //新增的可以简便生成连接字串的类,既然最终总要用组织字符串的方法来写入密码,干脆直接用这个类
            bui.UserID = "webroot";
            bui.Password = "23784842222";
            bui.DataSource = "dkek.net";
            bui.ConnectTimeout = 30;
            bui.InitialCatalog = "ddped";
            Debug.Print(bui.ConnectionString);            conn.ConnectionString = bui.ConnectionString ;
            conn.Open();
            cmd.CommandText = "cg_p_Comm_StockChangeRep_LimitPrice '00001','"+ dteD1.ToString("yyyy-MM-dd") +"','"+ dteD2.ToString("yyyy-MM-dd") + "','','','','A',0,'','','',14,1,1,'one'";
            Debug.Print(cmd.CommandText);
            cmd.Connection = conn;            #region 以下代码用 adapter 进行数据读取
            SqlDataAdapter adapter = new SqlDataAdapter();
            DataSet ds =new DataSet();
            DataTable dtb = new DataTable();
            DataRow row;
            //检索数据的步骤
            //打开 SQLConnection 对象,建立 SQLCommand 对象,赋值 SQLCommand.CommandText 属性
            //用 DataAdapter 对象的 SelectCommand 方法绑定 SQLCommand 对象执行的结果
            //将 DataAdapter 填充到 DataSet 对象中,成为指定名称的 DataTable 对象
            //用 DataRow 变量来获取 DataTable 对象中的某一行
            //用 DataRow[index].ToString() 来获取某个字段的文本值,如果要直接获取值用 DataRow[index]
            //而且好像 DataTable 自己并不能进行排序或者检索(Adodb.Recordset.sort 或者 filter 方法的功能),
            //而是要使用 DataTable.DefaultView 来获取 DataView 来实现
            
            adapter.SelectCommand = cmd;
            adapter.Fill(ds, "LimitPrice");
            dtb = ds.Tables["LimitPrice"];
            Debug.Print("总记录数:" + dtb.Rows.Count.ToString());
            Debug.Print("总字段数:" + dtb.Columns.Count.ToString());            foreach(DataRow r in dtb.Rows){
                Console.WriteLine("{0,-50:G}{1,-50:G}{2,-50:G}", r[0], r[1], r[2]);
                //Debug.Print(r[0].ToString());
            }
            //dtb.Rows.Count;
            
                        #endregion
            #region 以下代码用 SQLReader 进行读取
            // // 以下代码用 SQLReader 进行读取            //rd = cmd.ExecuteReader();
            //try
            //{
            //    Debug.Print("是否有记录:" + rd.HasRows.ToString());
            //    Debug.Print("字段总数:" + rd.FieldCount.ToString());
            //    Debug.Print("已经修改过的记录总数:" + rd.RecordsAffected);
            //    /* 
 
            //      DataReaders 初用体会
            //      注意下面这段语句,DataReaders 无法做 MoveFirst MoveLast 等操作,因为它和 ADODB.Recordset.Open 
            //      的一个参数设定的向前只读集类型相似,所以只用来读取记录,而且在没有循环结束前不知道记录总数,
            //      只能用 HasRows 属性确定是否有记录。但是相对来说速度更快。
            //      以下为网络上摘录的文章的全文索引
            //      -----------------------------------------
            //      当你处理大量数据的时候,大量内存的占用会导致性能上的问题。例如,一个连接(connection)用传统
            //      的ADO Recordset对象去读1000行数据库的记录,就必须为这1000行记录将内存分配给这个连接直至这
            //      个连接的生命周期结束。如果有1000用户在同一时间对同一计算机进行同样的操作,内存被过度的使
            //      用就会成为关键性的问题。 
            //      为了解决这些问题,.NET框架包括了DataReaders对象,而这个对象仅仅从数据库返回一个只读的,仅
            //      向前数据流。而且当前内存中每次仅存在一条记录。 
            //      DataReader接口支持各种数据源,比如关系数据和分级数据。DataReader可以适用于在运行完一条命令
            //      仅需要返回一个简单的只读记录集。 
            //    */
            //    while (rd.Read())
            //    {
            //        Console.WriteLine(String.Format("{0,-40:G}{1,-50:G}{2,-90:G}", rd.GetString(0),
            //                 rd.GetString(1), rd.GetString(2)));
            //    }
            //}
            //finally
            //{
            //    // Always call Close when done reading.
            //    rd.Close();
            //}            #endregion          
            conn.Close();            
                    }