SqlDataReader查询,更新,删除并保持和数据库实时操作
2009-07-17 11:39
603 查看
ado.net提供了丰富的数据库操作,在这些操作中SqlConnection和SqlCommand类是必须使用的,但接下来可以分为两类操作:
一类是用SqlDataReader直接一行一行的读取数据库。
第二类是SqlDataAdapter联合DataSet来读取数据。
两者比较:
SqlDataReader由于是直接访问数据库,所以效率较高。但使用起来不方便。
SqlDataAdapter可以把数据库的数据缓存在内存中,以数据集的方式进行填充。这种方式使用起来更方,便简单。但性能较第一种稍微差一点。(在一般的情况下两者的性能可以忽略不计。)
先看一个比较简单的代码:
public void SqlAdapterDemo1(string connStr)
{
SqlConnection conn = new SqlConnection(connStr);//连接对象
SqlCommand cmd = conn.CreateCommand();//sql命令对象
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from products = @ID";//sql语句
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters["@ID"].Value = 1;//给参数sql语句的参数赋值
SqlDataAdapter adapter = new SqlDataAdapter();//构造SqlDataAdapter
adapter.SelectCommand = cmd;//与sql命令对象绑定,这个必不可少
DataSet ds = new DataSet();
adapter.Fill(ds,"table1");//填充数据。第二个参数是数据集中内存表的名字,可以与数据库中的不同
//Fill方法其实是隐藏的执行了Sql命令对象的CommandText
//填充完了后,就可以方便的访问数据了。例如
WriteLine(ds.Tables["table1"].Rows[0][1]);}
怎么样?是不是很简单?
以上代码有一个地方需要注意,就是没有显示的调用连接对象的Open()方法。只是因为在每次调用Fill()方法的时候会自己去维护连接。调用Fill()方法并不会改变之前连接对象的状态。(这是关键点,也是优点之一)
//连接对象和sql命令对象单从上面的代码只有查询语句,没有其他的操作。那么接下来我就针对其他的操作来进一步说明SqlDataAdapter的用法。其他操作(如:增加,修改,删除等操作)可以分为两种情况一个是单表操作,一个是多表操作。
先来看单表操作:
数据更新:
其实非常简单,就是用sqldataadapter的update方法就行了。
//直接把上面的代码赋值过来
public void SqlAdapterDemo1(string connStr)
{
SqlConnection conn = new SqlConnection(connStr);//连接对象
多表操作的片段代码
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters["@ID"].Value = 1;//给参数sql语句的参数赋值
SqlDataAdapter adapter = new SqlDataAdapter();//构造SqlDataAdapter
adapter.SelectCommand = cmd;//与sql命令对象绑定,这个必不可少
SqlCommandBuilder builder =new SqlCommandBuilder(adapter);//在构造好了SqlDataAdapter对象 //加上此句代码
DataSet ds = new DataSet();
adapter.Fill(ds,"table1");//填充数据。第二个参数是数据集中内存表的名字,可以与数据库中的不同
//Fill方法其实是隐藏的执行了Sql命令对象的CommandText
//填充完了后,就可以方便的访问数据了。例如
WriteLine(ds.Tables["table1"].Rows[0][1]);
//修改操作
ds.Tables["table1"].Rows[0][1] ="Sample2";//此句代码只是修改了数据集中某够值
//更新到数据库
adapter.Update(ds, "table1");//把内存中的数据同步到数据库中
上面的修改代码很简单,原理就是修改了内存中数据集的数据,然后调用一下Update()方法就同步到数据库中去了。SqlDataAdapter帮我们自动生成了Sql语句,并且在这里Update()方法是带了事务处理功能的。其他的删除,增加操作同理,在对内存中的数据集进行相关修改后,只需要调用一下Update()方法即可同步到数据库中去。但遗憾的是,目前这种方式只支持单表的操作,不支持任何与多表相关的操作(包括同一视图中来自不同表的列)。
如果要传递参数,可以这样去做:
public static SqlDataAdapter CreateSqlDataAdapter(SqlCommand selectCommand,
SqlConnection connection)
{
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
// Create the other commands.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Customers (CustomerID, CompanyName) "
"VALUES (@CustomerID, @CompanyName)", connection);
adapter.UpdateCommand = new SqlCommand(
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName "
"WHERE CustomerID = @oldCustomerID", connection);
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);
// Create the parameters.
adapter.InsertCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
adapter.InsertCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 40, "CompanyName");
adapter.UpdateCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
adapter.UpdateCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 40, "CompanyName");
adapter.UpdateCommand.Parameters.Add("@oldCustomerID",
SqlDbType.Char, 5, "CustomerID").SourceVersion = DataRowVersion.Original;
adapter.DeleteCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID").SourceVersion = DataRowVersion.Original;
return adapter;
}
一类是用SqlDataReader直接一行一行的读取数据库。
第二类是SqlDataAdapter联合DataSet来读取数据。
两者比较:
SqlDataReader由于是直接访问数据库,所以效率较高。但使用起来不方便。
SqlDataAdapter可以把数据库的数据缓存在内存中,以数据集的方式进行填充。这种方式使用起来更方,便简单。但性能较第一种稍微差一点。(在一般的情况下两者的性能可以忽略不计。)
先看一个比较简单的代码:
public void SqlAdapterDemo1(string connStr)
{
SqlConnection conn = new SqlConnection(connStr);//连接对象
SqlCommand cmd = conn.CreateCommand();//sql命令对象
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from products = @ID";//sql语句
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters["@ID"].Value = 1;//给参数sql语句的参数赋值
SqlDataAdapter adapter = new SqlDataAdapter();//构造SqlDataAdapter
adapter.SelectCommand = cmd;//与sql命令对象绑定,这个必不可少
DataSet ds = new DataSet();
adapter.Fill(ds,"table1");//填充数据。第二个参数是数据集中内存表的名字,可以与数据库中的不同
//Fill方法其实是隐藏的执行了Sql命令对象的CommandText
//填充完了后,就可以方便的访问数据了。例如
WriteLine(ds.Tables["table1"].Rows[0][1]);}
怎么样?是不是很简单?
以上代码有一个地方需要注意,就是没有显示的调用连接对象的Open()方法。只是因为在每次调用Fill()方法的时候会自己去维护连接。调用Fill()方法并不会改变之前连接对象的状态。(这是关键点,也是优点之一)
//连接对象和sql命令对象单从上面的代码只有查询语句,没有其他的操作。那么接下来我就针对其他的操作来进一步说明SqlDataAdapter的用法。其他操作(如:增加,修改,删除等操作)可以分为两种情况一个是单表操作,一个是多表操作。
先来看单表操作:
数据更新:
其实非常简单,就是用sqldataadapter的update方法就行了。
//直接把上面的代码赋值过来
public void SqlAdapterDemo1(string connStr)
{
SqlConnection conn = new SqlConnection(connStr);//连接对象
多表操作的片段代码
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters["@ID"].Value = 1;//给参数sql语句的参数赋值
SqlDataAdapter adapter = new SqlDataAdapter();//构造SqlDataAdapter
adapter.SelectCommand = cmd;//与sql命令对象绑定,这个必不可少
SqlCommandBuilder builder =new SqlCommandBuilder(adapter);//在构造好了SqlDataAdapter对象 //加上此句代码
DataSet ds = new DataSet();
adapter.Fill(ds,"table1");//填充数据。第二个参数是数据集中内存表的名字,可以与数据库中的不同
//Fill方法其实是隐藏的执行了Sql命令对象的CommandText
//填充完了后,就可以方便的访问数据了。例如
WriteLine(ds.Tables["table1"].Rows[0][1]);
//修改操作
ds.Tables["table1"].Rows[0][1] ="Sample2";//此句代码只是修改了数据集中某够值
//更新到数据库
adapter.Update(ds, "table1");//把内存中的数据同步到数据库中
上面的修改代码很简单,原理就是修改了内存中数据集的数据,然后调用一下Update()方法就同步到数据库中去了。SqlDataAdapter帮我们自动生成了Sql语句,并且在这里Update()方法是带了事务处理功能的。其他的删除,增加操作同理,在对内存中的数据集进行相关修改后,只需要调用一下Update()方法即可同步到数据库中去。但遗憾的是,目前这种方式只支持单表的操作,不支持任何与多表相关的操作(包括同一视图中来自不同表的列)。
如果要传递参数,可以这样去做:
public static SqlDataAdapter CreateSqlDataAdapter(SqlCommand selectCommand,
SqlConnection connection)
{
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
// Create the other commands.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Customers (CustomerID, CompanyName) "
"VALUES (@CustomerID, @CompanyName)", connection);
adapter.UpdateCommand = new SqlCommand(
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName "
"WHERE CustomerID = @oldCustomerID", connection);
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);
// Create the parameters.
adapter.InsertCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
adapter.InsertCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 40, "CompanyName");
adapter.UpdateCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
adapter.UpdateCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 40, "CompanyName");
adapter.UpdateCommand.Parameters.Add("@oldCustomerID",
SqlDbType.Char, 5, "CustomerID").SourceVersion = DataRowVersion.Original;
adapter.DeleteCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID").SourceVersion = DataRowVersion.Original;
return adapter;
}
相关文章推荐
- SqlDataReader查询,更新,删除并保持和数据库实时操作(转)
- Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式'
- DAL 操作数据库方法ExecuteNonQuery/ExecuteScalar/SqlDataAdapter/SqlDataReader
- Yii数据库操作增删改查-[增加\查询\更新\删除 AR模式]
- MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB 性能监测
- QTP中对数据库的操作(查询,更新和删除等)
- Yii 1.0数据库操作 查询、增加、更新、删除
- perl数据库添加、删除、更新、查询操作例子
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式'
- shell脚本操作mysql数据库—创建数据库,在该数据库中创建表(插入,查询,更新,删除操作也可以做)
- Yii 1.0数据库操作 查询、增加、更新、删除
- Yii数据库操作增删改查-[增加\查询\更新\删除 AR模式]
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
- Android Sqlite数据库执行插入查询更新删除的操作对比
- Android Sqlite数据库执行插入查询更新删除的操作对比
- 使用SqlDataReader来操作数据库
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
- 数据库操作 查询,更新,删除的方法(AR模式)