ADO.NET的DataSet问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADO.NET的DataSet问题相关的知识,希望对你有一定的参考价值。

namespace DataGridViewExample

public partial class frmDGV : Form

public frmDGV()

InitializeComponent();


private void frmDGV_Load(object sender, EventArgs e)

//Persist Security Info属性的意思是表示是否保存安全信息;
string connStr = "server=JUJUMAO;"+ "persist security info=False;" + "database=DataStudy;" + "integrated security=SSPI;";
string sql = "select * from Students";
SqlConnection conn = new SqlConnection(connStr);

conn.Open(); //这句代码为什么可以不要?

SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
DataSet ds = new DataSet(); //填充数据集
adapter.Fill(ds);

//对应修改的列标题
ds.Tables[0].Columns[0].ColumnName = "学号";
ds.Tables[0].Columns[1].ColumnName = "姓名";
ds.Tables[0].Columns[2].ColumnName = "性别";
ds.Tables[0].Columns[3].ColumnName ="出生日期";
ds.Tables[0].Columns[4].ColumnName = "专业";
ds.Tables[0].Columns[5].ColumnName ="是否党员";

dataGridView .DataSource =ds.Tables [0].DefaultView ;
//问题在这里
conn.Close();



我想问的是conn.Open()和conn.Close()这两句代码为什么在这里不要也可以执行?
这两个方法要不要有什么区别,什么情况下必须要这两个代码,什么情况下不用,望各位大侠可以详细的解释一下,感激不尽!

用SqlDataAdapter可以不用写conn.Open()
但是最后要把连接关闭
可以这么写:
if (conn.State != ConnectionState.Closed)

conn.Close();

检查conn的状态,不是关闭就把连接(conn)关闭
如果你是用SqlCommand的话,那你就得conn.Open()与conn.Close()了
SqlCommand表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程,而SqlDataAdapter把开关封装到了自己的内部,所以你不用手动写
一般而言:
SqlDataAdapter 一般用于查询.
使用的时候不用con.open();直接将数据fill到dataset中.
SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。

当 SqlDataAdapter 填充 DataSet 时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。但是,除非 MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中不包括主键信息。也可以使用 FillSchema,让 SqlDataAdapter 创建 DataSet 的架构,并在用数据填充它之前就将主键信息包括进去。有关更多信息,请参见 向 DataSet 添加现有约束。

SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到 SQL Server 数据库时提高性能。

SqlDataAdapter 还包括 SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和 TableMappings 属性,以便于数据的加载和更新。

当创建 SqlDataAdapter 的实例时,读/写属性将被设置为初始值。

SqlCommand 一般用于非查询.(也可用于查询)
需要con.open();
使用完之后要关闭.

还有的就是,劝楼主不要写成ds.Tables[0].Columns[2]
改写成ds.Tables["表名"].Columns["列名"]
建议楼主多看一下帮助文档,能上网的话,就上
http://msdn.microsoft.com/zh-cn/library/
最好的老师就是帮助文档

参考资料:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldataadapter(VS.80).aspx

参考技术A SqlDataAdapter会自动处理数据库的连接,所以可以不要
不过最好手动加上conn.Close()
因为你不知道SqlDataAdapter什么时候关闭conn
参考技术B SqlDataAdapter 执行数据操作不需要打开连接 参考技术C conn.Open()可以不加,但是conn.Close()一定得加。

给LZ的代码改写一下~~~

private void frmDGV_Load(object sender, EventArgs e)

//Persist Security Info属性的意思是表示是否保存安全信息;
string connStr = "server=JUJUMAO;"+ "persist security info=False;" + "database=DataStudy;" + "integrated security=SSPI;";
string sql = "select * from Students";
try

SqlConnection conn = new SqlConnection(connStr);

conn.Open(); //这句代码为什么可以不要?

SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
DataSet ds = new DataSet(); //填充数据集
adapter.Fill(ds);

//对应修改的列标题
ds.Tables[0].Columns[0].ColumnName = "学号";
ds.Tables[0].Columns[1].ColumnName = "姓名";
ds.Tables[0].Columns[2].ColumnName = "性别";
ds.Tables[0].Columns[3].ColumnName ="出生日期";
ds.Tables[0].Columns[4].ColumnName = "专业";
ds.Tables[0].Columns[5].ColumnName ="是否党员";

dataGridView .DataSource =ds.Tables [0].DefaultView ;

catch(Exception)

//抛出异常

finilly //加上finilly块,程序总会执行这块。

if(conn.State==ConnectionState.Open())

conn.Close();






ado.net的五大对象

ado.net的五大对象

ASP.net: ADO的五大对象:
Connection 连接对象
Command 命令对象,指示要执行的命令和存储过程!
DataReader是一个向前的只读的数据流。
DataAdapter是功能强大的适配合器,支持增删改查的功能
DataSet是一个数据级对象,相当于内存中的一张表或多张表!(asp中是recordset)
参考技术A 分别为4个提供者对象:
Connection
DataReader
Command
DataAdapter
和1个用户对象
DataSet
这些文字上的东西记熟了也没多大意义。
关键是要多多使用他们!

呵呵,希望楼主解决了问题。本回答被提问者采纳
参考技术B Command对象主要提供与数据库的连接功能

Connection对象用于返回数据,修改数据,运行存储过程以及发送或检索参数信息的数据库命令

DataReader对象通过Command对象提供从数据库检索信息的功能,它以一种只读的,向前的,快速的方式访问数据库

DataAdapter对象提供连接DataSet对象和数据源的桥梁,它主要使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并确保DataSet数据集中数据的更改与数据源保持一致

DataSet对象是一个数据库容器,可以把它当作是存在于内存中的数据库,无论数据源是什么,它都会提供一致的关系编程模型

以上是关于ADO.NET的DataSet问题的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET之使用DataSet类更新数据库

在运行时将 ADO.Net DataSet 指向不同的数据库?

哪位高手简洁分析下ADO.NET中的常用对象:DataAdapter、Command、DataSet的使用情况。。非常感谢!!

Ado.net 三[SQL注入,DataAdapter,sqlParameter,DataSet]

ADO.NET数据库开发方式中使用DataAdapt对象和DataSet对象的步骤是啥?

ado.net的五大对象