原来一个 ADODB.RECORDSET 对象能够完成的事情现在在 ADO.NET 中是否一定要很多个对象才能完成?

changechange 2006-07-03 05:27:53
原来一个 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();




}
...全文
139 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
billmo1986 2006-07-09
  • 打赏
  • 举报
回复
mark
changechange 2006-07-09
  • 打赏
  • 举报
回复
?

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧