sqlconnection,sqlcommand,sqldataadapter,sqldatareader,dataset的关系详解


一,首先,简单打个比喻,

以老板要小二去仓库取东西为例,在这里:

sqlconnection就是去东西要经过的路;

sqlcommand便是老板的命令;

sqldatareader是小二选择去仓库的交通工具,这里可以比作是摩托车,那么sqldatareader便是大卡车;

dataset便是你取回数据后,自己的临时仓库,你可以把取来的数据放在这个仓库里!

二、用户说!

1、用户说,要连接数据库,于是就有了sqlconnection (数据库连接,配置连接字符串等,用户名密码之类)

2、用户说,要执行sql语句。于是就有了sqlcommand, 直接翻译成sql命令。每个sqlcommand都有commandtext跟parameters 文本跟参数。填写好这个命令,然后execute去执行。当然,要确保连接是open的才能执行。没连接啥都干不了。

3、用户认为要有办法读取返回结果,于是便有了datareader.可以一条一条的读取(read)直到最后一条。

4、用户认为,把执行的结果找个地方存起来是好的。于是就有了dataset。这个东西很完美,基本上能存各种数据跟关系,比datareader方便很多。里面有一个一个的dataview跟datatable.针对你的查询结果,当然,datatable又可以从datarow一个一个的循环取得

5、上帝觉得上述步骤(3和4)太复杂了 -_-!
于是便有了SqlDataAdapter (翻译为SQL数据适配器,适配器模式) 它来封装简化了上述步骤。你只要new出来一个sqldataadapter,给他填上语句,直接fill到dataset就行了。 这样你什么都有了,只需要两步!

6、微软觉得,可视化的东西是用户喜欢的
于是有了一个一个的SqlAdapter控件,DataSet控件,GridView控件....你可以直接拖到你的窗口(WinForm)或者页面(Asp.Net Web Application等)设置几个属性,绑定即可。一行代码都不用写。以至于普通网管跟文员都能成为潜在用户。(虽然这种方式被“专业程序员”所不齿)

7建议:
如果喜欢效率的,用command+datareader自己处理(要小心别弄得更差哦)
如果喜欢方便的,就大量的使用Adapter+DataSet吧。毕竟绑定太节约时间了
如果就想显示个数据而已...拖吧...反正你就是想给隔壁办公室显示个报表。

示例:

this.dataGridView3.Refresh();
this.dataGridView3.Update();
this.dataGridView3.EndEdit();
string datestr = dateTimePicker1.Value.ToString("yyyy-MM-dd");
string str = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
SqlConnection conn = new SqlConnection(str);
conn.Open();

SqlCommand cmd = new SqlCommand("SELECT Row_Number() over (order by ApprDate asc) as RowId,Id FROM DB_Table a where a.Date>='" + datestr + "' ) order by a.Date desc", conn);
SqlDataAdapter dpt = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
dpt.Fill(ds);
System.Data.DataTable dtb = ds.Tables[0];
dataGridView3.DataSource = dtb;
this.dataGridView3.AutoGenerateColumns = false;
this.dataGridView3.Columns["RowId"].DataPropertyName = dtb.Columns["RowId"].ToString();
this.dataGridView3.Columns["Id"].DataPropertyName = dtb.Columns["Id"].ToString();
this.dataGridView3.Columns["SubContractCode"].DataPropertyName = dtb.Columns["SubContractCode"].ToString();

conn.Close();