一: 使用ExecuteReader()操作数据库
ExecuteReader会返回一个DataReader对象,是一个只读只进的数据流,相比DateSet对象,其速度比较快,所需要的服务器资源也少
public void PrintData()
{
string str = "Data Source=localhost;Initial Catalog=MyC#;User ID=sa;password=123456";
SqlConnection con = new SqlConnection(str);
con.Open(); //打开连接
string strsql = "select * from maninfo"; //SQL 查询语句
SqlCommand cmd = new SqlCommand(strsql, con); //初始化Command对象
SqlDataReader rd = cmd.ExecuteReader(); // 初始化DataReader //对象
while (rd.Read()) // 读取数据,如果有数据则返回true,饭则false,并移到下一行
{
listBox1.Items.Add(rd["name"].ToString());
}
rd.Close();
con.Close();
}
通常用ExecuteReader执行查询操作,事务处理inert delete update不建议使用
二:ExecuteNonQuery()操作数据库
ExecuteNonQuery()返回的是一个整形值,并不是DataSet,是影响数据库的行数.
通常情况下为数据库事务处理的首选,当需要执行插入、删除、更新等操作时,首选
ExecuteNonQuery()。
注意当执行create table 或drop table成功时也是返回-1
public void InsertData()
{
string str = "Data Source=localhost;Initial Catalog=MyC#;User ID=sa;password=123456";
SqlConnection con = new SqlConnection(str);
con.Open(); //打开连接
string strsql = "insert into maninfo values('小灰','北京',22)"; //SQL 查询语句
SqlCommand cmd = new SqlCommand(strsql, con); //初始化Command对象
MessageBox.Show(cmd.ExecuteNonQuery().ToString());
}
三:ExecuteScalar()操作数据库
ExecuteScalar 如果是select则返回的是第一行第一列的值,如果执行的不是查询语句,则返回的是一个未实例化的object,
必须进行类型转换来显示。ExecuteScalar()经常使用于当需要返回单一值时的情况
public void ScalarData()
{
string str = "Data Source=localhost;Initial Catalog=MyC#;User ID=sa;password=123456";
SqlConnection con = new SqlConnection(str);
con.Open(); //打开连接
string strsql = "select @@identity "; //SQL 查询语句
SqlCommand cmd = new SqlCommand(strsql, con); //初始化Command对象
MessageBox.Show(cmd.ExecuteScalar().ToString());
con.Close();
}
四:用DataSet更新,删除,插入数据
步骤:
1.创建一个Connection 对象。
2.创建一个DataAdapter 对象。
3.初始化适配器。
4.使用数据适配器的Fill 方法执行SELECT 命令,并填充DataSet。
5.执行SqlCommandBuilder 方法生成UpdataCommand 方法。
6.创建DataTable 对象并指定相应的DataSet 中的表。
7.创建DataRow 对象并查找需要修改的相应行。
8.更改DataRow 对象中的列的值。
9.使用Update 方法进行数据更新。
DataSet的更新删除和插入操作基本相同,不同的是第7,8步
插入数据库:
public void DataSetInsert()
{
//打开连接
string str = "Data Source=localhost;Initial Catalog=MyC#;User ID=sa;password=123456";
SqlConnection con = new SqlConnection(str);
con.Open();
//创建适配器
string sql = "select * from maninfo";
SqlDataAdapter ds = new SqlDataAdapter(sql, con);
//创建DataSet,并填充
DataSet da = new DataSet();
ds.Fill(da,"datatable");
//自适应适配器属性设置
SqlCommandBuilder du = new SqlCommandBuilder(ds);
//插入新行
DataRow dr = da.Tables["datatable"].NewRow();
dr["name"] = "阿虎";
dr["address"] = "香港";
dr["age"] = 33;
da.Tables["datatable"].Rows.Add(dr);
//更新
ds.Update(da, "datatable");
//关闭
con.Close();
}
更新数据库:
public void DataSetUpdate()
{
//打开连接
string str = "Data Source=localhost;Initial Catalog=MyC#;User ID=sa;password=123456";
SqlConnection con = new SqlConnection(str);
con.Open();
//创建适配器
string sql = "select * from maninfo";
SqlDataAdapter ds = new SqlDataAdapter(sql, con);
//创建DataSet,并填充
DataSet da = new DataSet();
ds.Fill(da, "datatable");
//为表设置主键
DataTable db = da.Tables["datatable"];
db.PrimaryKey = new DataColumn[] { db.Columns["name"] };
//如果是主键为多列的话:
//为表设置主键
//DataTable db = da.Tables["datatable"];
//db.PrimaryKey = new DataColumn[] { db.Columns["name"], db.Columns["address"] };
//查找行
//string[] kk = { "芙蓉姐姐", "火星" };
//DataRow dr = db.Rows.Find(kk);
//dr["age"] = 23;
//自适应适配器属性设置
SqlCommandBuilder du = new SqlCommandBuilder(ds);
//查找行
DataRow dr = db.Rows.Find("芙蓉姐姐");
dr["address"] = "火星";
//更新
ds.Update(da, "datatable");
//关闭
con.Close();
}
删除数据行
public void DataSetDelete()
{
//打开连接
string str = "Data Source=localhost;Initial Catalog=MyC#;User ID=sa;password=123456";
SqlConnection con = new SqlConnection(str);
con.Open();
//创建适配器
string sql = "select * from maninfo";
SqlDataAdapter ds = new SqlDataAdapter(sql, con);
//创建DataSet,并填充
DataSet da = new DataSet();
ds.Fill(da, "datatable");
//为表设置主键
DataTable db = da.Tables["datatable"];
db.PrimaryKey = new DataColumn[] { db.Columns["name"] };
//自适应适配器属性设置
SqlCommandBuilder du = new SqlCommandBuilder(ds);
//查找行
DataRow dr = db.Rows.Find("小狗");
dr.Delete();
//更新
ds.Update(da, "datatable");
//关闭
con.Close();
}
注意DataSet更新和删除,都必须设置DataSet DataTablet的主键与实际数据库中的表一样,否则find()会出错
什么时候用DataReader,什么用DataSet (转http://hi.baidu.com/281305450/blog/item/f6c9547ac1a261e32e73b392.html)
如果不需要客户返回值,只需要显示而不修改,用sqldatareader效率比较高。相反用dataset。
sqldatareader提供一种从数据库读取只进的行流的方式.
如果用到分页或者需要有暂存数据的地方,用dataset。
总的来说
大数据量或简单操作 使用 DataReader
中小数据量或复杂操作 使用 DataSet
如果一次性读取的数据量较大建议使用DataSet,DataSet读取之后占的是内存空间,但是现在一般的电脑都有1G以上的内存,所以这点内存算不了什么。完全可以忽略。如果使用DataReader可能会导致网站读取数据的时候 出现假死现象。(千条以上)
如果是少量数据 建议使用DataReader,读取速度较快。让用户体验的舒服些。
在 IIS 服务器上所使用的内存也较少。我们的建议是,如果您的数据来源控件只是用来填入控件的清单成为其选项,亦或是您的数据绑定控件并不需要提供排序或分页功能的话,则应该使用 DataReader。反之,如果您的数据绑定控件需要提供排序或分页功能的话,则必须使用 DataSet 并承担其各项负面效应。
DataReader
速度较快
不支持快取、分页与动态排序。
DataSet
支持快取、分页与动态排序
速度较慢