总结一下我的问题(代码比较长,先看我的总结吧!)
1.只读一条记录的时候DataSet和DataReader那个好!(个人认为,在一条记录的时候,DataReader快)
2.返回一条记录的方法,具我常用的是DataSet(返回数据集);返回类的包装就是例一的方法,数据库存中有多少个列,就包装多少个(有点像结构体);返回ArrayList(返回数组),然后用下标引用;返回的类属性,通过类的属性取值!{请问那种方法的执行效率最高}
3.还有什么更好的方法吗?比如直接用DataReader返回一条记录,但好像不能绑定到label控件上!
4.在编程规范中 label 的缩写是 lbl 还是lab; Button 的缩写是btn 还是 cmd///例一
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;namespace Shop
{
public class AssetDetails
{
private decimal Cash; //现金
private decimal Bank; //银行
private decimal TotalAsset; //总资产
private bool Result; //结果
} //资产表字段的类 public class Asset
{
public Asset()
{
} public AssetDetails GetUserAsset(int iUserID)
{
SqlConnection myCon = new SqlConnection(ConfigurationSettings.AppSettings["strCon"]);
SqlCommand myCom = new SqlCommand("prGetUserAsset",myCon);
myCom.CommandType = CommandType.StoredProcedure; SqlParameter parmUserID = new SqlParameter("@intUserID", SqlDbType.Int);
parmUserID.Value = iUserID;
myCom.Parameters.Add(parmUserID); SqlParameter parmCash = new SqlParameter("@decCash", SqlDbType.Decimal, 13);
parmCash.Scale = 2;
parmCash.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmCash); SqlParameter parmBank = new SqlParameter("@decBank", SqlDbType.Decimal, 13);
parmBank.Direction = ParameterDirection.Output;
parmBank.Scale = 2;
myCom.Parameters.Add(parmBank); AssetDetails myAssetDetails = new AssetDetails();
try
{
myCon.Open();
myCom.ExecuteNonQuery();
myCon.Close(); myAssetDetails.Cash = Convert.ToDecimal(parmCash.Value);
myAssetDetails.Bank = Convert.ToDecimal(parmBank.Value);
myAssetDetails.TotalAsset = Convert.ToDecimal(parmCash.Value) + Convert.ToDecimal(parmBank.Value);
myAssetDetails.Result = true; return myAssetDetails;
}
catch
{
myAssetDetails.Result = false; return myAssetDetails;
}
}
}
}///这是新建二个类,第一类封装了银行资产的所有字段,在第二个类中返回了这个类的实例。以后可以这样子绑定 lblMessage.Text = myAssetDetails.Cash;(略去了定义这个类的实例)
注可以用DataSet 提高编程的效率,但听说DataSet很吃内存,如果上W个用户防问会给服务器代来很严重的性能问题!但我这是小DataSet就一行的记录不知用DataReader还是DataReader好!using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;namespace Shop
{ public class Asset
{
private decimal m_Cash; //现金
private decimal m_Bank; //银行
private decimal m_TotalAsset; //总资产
private bool m_Result; //结果 public decimal Cash
{
get
{
return m_Cash;
}
set
{
m_Cash = value;
}
} public decimal Bank
{
get
{
return m_Bank;
}
set
{
m_Bank = value;
}
} public decimal TotalAsset
{
get
{
return m_TotalAsset;
}
set
{
m_TotalAsset = value;
}
} public bool Result
{
get
{
return m_Result;
}
set
{
m_Result = value;
}
}
public Asset()
{
} public bool GetUserAsset(int iUserID)
{
SqlConnection myCon = new SqlConnection(ConfigurationSettings.AppSettings["strCon"]);
SqlCommand myCom = new SqlCommand("prGetUserAsset",myCon);
myCom.CommandType = CommandType.StoredProcedure; SqlParameter parmUserID = new SqlParameter("@intUserID", SqlDbType.Int);
parmUserID.Value = iUserID;
myCom.Parameters.Add(parmUserID); SqlParameter parmCash = new SqlParameter("@decCash", SqlDbType.Decimal, 13);
parmCash.Scale = 2;
parmCash.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmCash); SqlParameter parmBank = new SqlParameter("@decBank", SqlDbType.Decimal, 13);
parmBank.Direction = ParameterDirection.Output;
parmBank.Scale = 2;
myCom.Parameters.Add(parmBank);
try
{
myCon.Open();
myCom.ExecuteNonQuery();
myCon.Close(); m_Cash = Convert.ToDecimal(parmCash.Value);
m_Bank = Convert.ToDecimal(parmBank.Value);
m_TotalAsset = Convert.ToDecimal(parmCash.Value) + Convert.ToDecimal(parmBank.Value);
return m_Result = true; }
catch
{
return m_Result = false;
}
}
}
}
///第二种方法,只在一个类中编写,但用到了类的属性!通过类的属性取值,比如下面代码!
Asset myAsset = new Asset(); ///创建Asset类的实例
bool myResult = myAsset.GetUserAsset(101); ///通过调用Asset的方法使类的属性全部等到值!
if(!myResult) ///如是出现错误,比如SQL数据库停了之类,重定向别的网页,不现代码了!
lblMessage.Text = myAsset.Cash ///用属性绑定
1.只读一条记录的时候DataSet和DataReader那个好!(个人认为,在一条记录的时候,DataReader快)
2.返回一条记录的方法,具我常用的是DataSet(返回数据集);返回类的包装就是例一的方法,数据库存中有多少个列,就包装多少个(有点像结构体);返回ArrayList(返回数组),然后用下标引用;返回的类属性,通过类的属性取值!{请问那种方法的执行效率最高}
3.还有什么更好的方法吗?比如直接用DataReader返回一条记录,但好像不能绑定到label控件上!
4.在编程规范中 label 的缩写是 lbl 还是lab; Button 的缩写是btn 还是 cmd///例一
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;namespace Shop
{
public class AssetDetails
{
private decimal Cash; //现金
private decimal Bank; //银行
private decimal TotalAsset; //总资产
private bool Result; //结果
} //资产表字段的类 public class Asset
{
public Asset()
{
} public AssetDetails GetUserAsset(int iUserID)
{
SqlConnection myCon = new SqlConnection(ConfigurationSettings.AppSettings["strCon"]);
SqlCommand myCom = new SqlCommand("prGetUserAsset",myCon);
myCom.CommandType = CommandType.StoredProcedure; SqlParameter parmUserID = new SqlParameter("@intUserID", SqlDbType.Int);
parmUserID.Value = iUserID;
myCom.Parameters.Add(parmUserID); SqlParameter parmCash = new SqlParameter("@decCash", SqlDbType.Decimal, 13);
parmCash.Scale = 2;
parmCash.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmCash); SqlParameter parmBank = new SqlParameter("@decBank", SqlDbType.Decimal, 13);
parmBank.Direction = ParameterDirection.Output;
parmBank.Scale = 2;
myCom.Parameters.Add(parmBank); AssetDetails myAssetDetails = new AssetDetails();
try
{
myCon.Open();
myCom.ExecuteNonQuery();
myCon.Close(); myAssetDetails.Cash = Convert.ToDecimal(parmCash.Value);
myAssetDetails.Bank = Convert.ToDecimal(parmBank.Value);
myAssetDetails.TotalAsset = Convert.ToDecimal(parmCash.Value) + Convert.ToDecimal(parmBank.Value);
myAssetDetails.Result = true; return myAssetDetails;
}
catch
{
myAssetDetails.Result = false; return myAssetDetails;
}
}
}
}///这是新建二个类,第一类封装了银行资产的所有字段,在第二个类中返回了这个类的实例。以后可以这样子绑定 lblMessage.Text = myAssetDetails.Cash;(略去了定义这个类的实例)
注可以用DataSet 提高编程的效率,但听说DataSet很吃内存,如果上W个用户防问会给服务器代来很严重的性能问题!但我这是小DataSet就一行的记录不知用DataReader还是DataReader好!using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;namespace Shop
{ public class Asset
{
private decimal m_Cash; //现金
private decimal m_Bank; //银行
private decimal m_TotalAsset; //总资产
private bool m_Result; //结果 public decimal Cash
{
get
{
return m_Cash;
}
set
{
m_Cash = value;
}
} public decimal Bank
{
get
{
return m_Bank;
}
set
{
m_Bank = value;
}
} public decimal TotalAsset
{
get
{
return m_TotalAsset;
}
set
{
m_TotalAsset = value;
}
} public bool Result
{
get
{
return m_Result;
}
set
{
m_Result = value;
}
}
public Asset()
{
} public bool GetUserAsset(int iUserID)
{
SqlConnection myCon = new SqlConnection(ConfigurationSettings.AppSettings["strCon"]);
SqlCommand myCom = new SqlCommand("prGetUserAsset",myCon);
myCom.CommandType = CommandType.StoredProcedure; SqlParameter parmUserID = new SqlParameter("@intUserID", SqlDbType.Int);
parmUserID.Value = iUserID;
myCom.Parameters.Add(parmUserID); SqlParameter parmCash = new SqlParameter("@decCash", SqlDbType.Decimal, 13);
parmCash.Scale = 2;
parmCash.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmCash); SqlParameter parmBank = new SqlParameter("@decBank", SqlDbType.Decimal, 13);
parmBank.Direction = ParameterDirection.Output;
parmBank.Scale = 2;
myCom.Parameters.Add(parmBank);
try
{
myCon.Open();
myCom.ExecuteNonQuery();
myCon.Close(); m_Cash = Convert.ToDecimal(parmCash.Value);
m_Bank = Convert.ToDecimal(parmBank.Value);
m_TotalAsset = Convert.ToDecimal(parmCash.Value) + Convert.ToDecimal(parmBank.Value);
return m_Result = true; }
catch
{
return m_Result = false;
}
}
}
}
///第二种方法,只在一个类中编写,但用到了类的属性!通过类的属性取值,比如下面代码!
Asset myAsset = new Asset(); ///创建Asset类的实例
bool myResult = myAsset.GetUserAsset(101); ///通过调用Asset的方法使类的属性全部等到值!
if(!myResult) ///如是出现错误,比如SQL数据库停了之类,重定向别的网页,不现代码了!
lblMessage.Text = myAsset.Cash ///用属性绑定
http://blog.csdn.net/qdzx2008/archive/2005/11/27/538003.aspx
非常欣赏你的这种精神(虽然题目话大了一点)。这里要说的是每一个.net类都有它存在的理由,刀枪剑戟需要适需而取。
说到效率问题,我们编程并不都是一味片面的追求效率,总是要在种种因素中寻求平衡点,否则用汇编好了。
2.如果只是一张表用ArrayList,Dataset针对多张表的集合
3.不太清楚
4.在编程规范中 label 的缩写是 lbl; Button 的缩写是btn
不过在规范中,特别是Button 好多都是用cmd 但也好多用btn 正真要用什么,还是很困惑!
数组只能通过下表来取值,但是节省空间,快捷。DataRow可以通过字段名称来取值,字段多了也不会乱。3、为什么要返回一个要手动关闭数据库连接的对象呢?效率和来?4、一条记录就是一条记录,和几个表没有关系。5、lab ?实验室吧。5、
-------------------------------------------------------------------------------
不是只读一条数据得时候DataReader比DataSet快,是只需要读取数据,不需要添加,删除,修改数据等功能时候,DataReader就比DataSet快,DataSet是一个相对庞大得东西,这个东西封装了太多得功能,但从读取数据得数度角度来说,DataSet不比DataReader,DataReader是向前得,只读得!所以不光是读一条的时候快,是只读得时候都快!
------------------------------------------
这个问题其实非常容易解决:
首先明确得是:不报装成类得速度快,当然我不是说和返回DataSet比,面向对象得初衷也不是片面得追求性能,面向对象是在性能、扩展、实用等,甚至是包括软件得运行和开发环境得选择等众多因素中寻找一个平衡点!因为从原理上说:可扩展得,功能大得,性能一定不能保证,而相反性能高的,扩展起来也一定不是方遍得,二者存在着矛盾,但这种矛盾在软件开发里面不是敌我关系,不是有你没我,有我没你得关系,面向对象就是在寻求一种平衡点!
为什么说封装成类得性能会慢,因为数据是被加工过得,装饰过的,修改过得!什么最快?0101010101010011010这些二进制代码最快,而没有封装得相对来说就是原始得,快捷得,实际得!打一个比喻:我有一件东西,要传给张三,张三就在我身边,李四也在,我直接传给张三和我先递给李四再让李四传给张三,你觉得那个快!
但为什么要封装成类,从我本身得做法来说,我也是主要封装成类,因为数据是干嘛用得?是用来显示得,显示得目的是什么?是让人们获得信息!
怎么才能让用户获得得信息更准确更详细,你得数据越多,越可达到这种目的!但数据多了,数据库读取就慢了,矛盾吧?所以有矛盾就要解决!你放到数据库里面一个bit,从这个数据上来说,它什么都不会代表,但又可以什么都代表!你可以让这个bit位为0时候代表灯是关得,1得时候灯是开得,但显示得时候,你怎么显示?直接显示01,人家不知道是什么意思得,你得信息并没有传达出去,而用类封装之后,你想这个01就既可以代表灯开灯灭,门开门关等等很多信息了!所以数据保存得时候一定要实现最精,能少得就少,能剔除得就剔除!但显示得时候,一定要做到从少的数据里面得到多得,详细得,准确得信息!
这就是二者得区别!也是一个多种因素之间寻找平衡得问题!
为什么这么说?
你想想一个应用程序得瓶颈主要在哪里?这里是asp.net区吧?就拿asp.net来说吧?web应用程序得最大瓶颈主要有两部分:Web服务器,也就是一般说得IIS,你可以用Center Test测试一下,基本上IIS每秒钟得RPS就是再1000左右了,而你得数据库Sql 2000每秒能承受多大得连接?
每秒能处理多少得数据?如果你觉得多呢?你往里面插入个千巴百万得数据再站出来说话!所以说最大瓶颈:数据库,其次Web 服务器,然后才是应用程序,(一般情况下亚,别告诉我你得程序来个死锁什么得。别告诉我你得代码里面有类似for(int i=0;i<10000000000;i++){}别告诉我你得一行代码能让现在得CPU算个1分钟就行),你平时开发的时候也可能注意到了,数据库得设计一般由你们项目组里面得PMh或者senior consultant或者最少由SA来完成吧?没有几个像样得项目是请一个人随随随便得就设计库得!数据库设计得时候一个最浅显得道理是是什么?是保证数据最小,能用少得就用少得,能用0来标示就绝对不用000来表示!这样的确再开发数据量不大得时候类得方法是慢得?为什么?你得应用程序处理得要多麽?你敲得每行代码CPU都得执行下亚!但当数据多的时候你得应用程序再性能上所影响到得比例已经会退居二线得,这时候你得库得简单!优化就会体现出来!所以我还是比较赞成用类得,特别是分布式开发,或是三层架构或者多层的时候更始必不可少!
public class AssetDetails
{
private decimal Cash; //现金
private decimal Bank; //银行
private decimal TotalAsset; //总资产
private bool Result; //结果} //资产表字段的类
另一种是在类的本身封装,也就是C#刚加的特性,属性
也就是GET SET 的语句!
在C# 没出来之间,我有时用第一种封装!现在有了C# 我用到了这样的封装
private decimal m_Cash; //现金
private decimal m_Bank; //银行
private decimal m_TotalAsset; //总资产
private bool m_Result; //结果 public decimal Cash
{
get
{
return m_Cash;
}
set
{
m_Cash = value;
}
}public decimal Bank
{
get
{
return m_Bank;
}
set
{
m_Bank = value;
}
}public decimal TotalAsset
{
get
{
return m_TotalAsset;
}
set
{
m_TotalAsset = value;
}
}public bool Result
{
get
{
return m_Result;
}
set
{
m_Result = value;
}
}通过这个类的属性,我可以加一条记录到数据库,也可以删一条记录到数据库!但这样有个问题
就是我用这个类的属性创建了一个实例!
Asses myAsses = new Asses();
myAsses.Cash = 20.00元
///执行一个方法,比如向数据库写放20.00
///然后在执行一个方法,比如读刚才写的记录
用个lblMessage.Text = ConvertToString(myAsses.Cash);
这样的方法,跟第一咱方法,相比,那个更好!
我主要是从事。NET平台上的分布式程序开发!OA系统的!虽然说,同一咱功能,有好多方法实现
但总要选取个执行效率高的吧!
就像,读大量的记录,然后显示在一个控件中,用DataReader 明显比用DataSet强!
DataReadr是记一条记录,到后绑,然后移除!然后在向前读
DataSet 是全部都读到内存中,然后绑,然后后移除
2.返回一条记录的方法,具我常用的是DataSet(返回数据集);返回类的包装就是例一的方法,数据库存中有多少个列,就包装多少个(有点像结构体);返回ArrayList(返回数组),然后用下标引用;返回的类属性,通过类的属性取值!{请问那种方法的执行效率最高}
3.还有什么更好的方法吗?比如直接用DataReader返回一条记录,但好像不能绑定到label控件上!
4.在编程规范中 label 的缩写是 lbl 还是lab; Button 的缩写是btn 还是 cmd
1、2、3、利用DataReader读出来,然后拷贝到一个容器里。其中又快又方便的方法应该是用DataReader读出一条数据,然后拷贝到Dictionary(1.1里面用HashTable)里面返回。拷贝DataRow就是创建的对象多了点儿,效率差了点儿,但是更易于绑定或者组合。只取一条数据可以用CommandBehavior.SingleLine和CommandBehavior.SigleResault参数,某些数据库会针对这些参数进行优化。4、没有这种规范,微软自己就反对这种匈牙利命名法……。
一般说来,需要被改变值的Label可以用它所展现的信息来命名,如遇冲突,+格式或者Info、Label作为后缀。后缀比前缀更符合语法习惯,也是程序更具可读性,而匈牙利命名法强调前缀是因为在C++里面指针类型混乱和C++的变量名有效字符长度的限定。但在C#里面这些都不存在。
类一
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;namespace Experiment
{
/// <summary>
/// 封装了订单表部分列的类
/// </summary>
public class OneClassDetails
{
public string OrderDate;
public string RequiredDate;
public string ShipPedDate; }
/// <summary>
/// 通过封装类返回数据的方法
/// </summary>
public class OneClass
{
public OneClass(){} public OneClassDetails GetOrder(int iOrderID)
{
SqlConnection myCon = new SqlConnection(ConfigurationSettings.AppSettings["strCon"]);
SqlCommand myCom = new SqlCommand("prOneGetOrder",myCon);
myCom.CommandType = CommandType.StoredProcedure; SqlParameter parmOrderID = new SqlParameter("@OrderID", SqlDbType.Int);
parmOrderID.Value = iOrderID;
myCom.Parameters.Add(parmOrderID); SqlParameter parmOrderDate = new SqlParameter("@OrderDate", SqlDbType.DateTime, 8);
parmOrderDate.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmOrderDate); SqlParameter parmRequiredDate = new SqlParameter("@RequiredDate", SqlDbType.DateTime, 8);
parmRequiredDate.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmRequiredDate); SqlParameter parmShipPedDate = new SqlParameter("@ShipPedDate", SqlDbType.DateTime, 8);
parmShipPedDate.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmShipPedDate); myCon.Open();
myCom.ExecuteNonQuery();
myCon.Close(); OneClassDetails myOneClassDetails = new OneClassDetails(); myOneClassDetails.OrderDate = Convert.ToString(parmOrderDate.Value);
myOneClassDetails.RequiredDate = Convert.ToString(parmRequiredDate.Value);
myOneClassDetails.ShipPedDate = Convert.ToString(parmShipPedDate.Value); return myOneClassDetails;
}
}}ACT 测试 250.67次/s
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;namespace Experiment
{
/// <summary>
/// 用DataSet返回数据的方法
/// </summary>
public class ThreeClass
{
public ThreeClass(){} public DataSet GetOrder(int iOrderID)
{ SqlConnection myCon = new SqlConnection(ConfigurationSettings.AppSettings["strCon"]);
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand myCom = new SqlCommand(); myCon.Open();
myCom.CommandType = CommandType.StoredProcedure;
myCom.Connection = myCon; SqlParameter parmOrderID = new SqlParameter("@OrderID", SqlDbType.Int, 4);
parmOrderID.Direction = ParameterDirection.Input;
parmOrderID.Value = iOrderID;
myCom.Parameters.Add(parmOrderID); myCom.CommandText="prOneGetOrderDs";
adapter.SelectCommand = myCom; adapter.Fill(ds);
myCon.Close(); return ds;
}
}
}
ACT测试 239.94/s
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;namespace Experiment
{
/// <summary>
/// 用类的属性返回数据的方法
/// </summary>
public class TwoClass
{
private string m_OrderDate;
private string m_RequiredDate;
private string m_ShipPedDate; public string OrderDate
{
get{ return m_OrderDate;}
set{ m_OrderDate = value; }
}
public string RequiredDate
{
get{ return m_RequiredDate;}
set{ m_RequiredDate = value; }
}
public string ShipPedDate
{
get{ return m_ShipPedDate; }
set{ m_RequiredDate = value; }
} public TwoClass(){} public void GetOrder(int iOrderID)
{
SqlConnection myCon = new SqlConnection(ConfigurationSettings.AppSettings["strCon"]);
SqlCommand myCom = new SqlCommand("prOneGetOrder",myCon);
myCom.CommandType = CommandType.StoredProcedure; SqlParameter parmOrderID = new SqlParameter("@OrderID", SqlDbType.Int);
parmOrderID.Value = iOrderID;
myCom.Parameters.Add(parmOrderID); SqlParameter parmOrderDate = new SqlParameter("@OrderDate", SqlDbType.DateTime, 8);
parmOrderDate.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmOrderDate); SqlParameter parmRequiredDate = new SqlParameter("@RequiredDate", SqlDbType.DateTime, 8);
parmRequiredDate.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmRequiredDate); SqlParameter parmShipPedDate = new SqlParameter("@ShipPedDate", SqlDbType.DateTime, 8);
parmShipPedDate.Direction = ParameterDirection.Output;
myCom.Parameters.Add(parmShipPedDate); myCon.Open();
myCom.ExecuteNonQuery();
myCon.Close(); m_OrderDate = Convert.ToString(parmOrderDate.Value);
m_RequiredDate = Convert.ToString(parmRequiredDate.Value);
m_ShipPedDate = Convert.ToString(parmShipPedDate.Value);
} }
}
ACT测试 251.27/s