SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可更改DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。当SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。
使用方法
1、通过连接字符串和查询语句
1
2
3
4
5
6
|
string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
strSql= "SELECT * FROM 表名" ;
SqlDataAdapter da= new SqlDataAdapter(strSql,strConn);
DataSet ds= new DataSet(); //创建DataSet实例
da.Fill(ds, "自定义虚拟表名" ); //使用DataAdapter的Fill方法(填充),调用SELECT命令
|
2、通过查询语句和SqlConnection对象来创建
1
2
3
4
5
6
|
string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
SqlConnection conn= new SqlConnection(strConn);
string strSql= "SELECT * FROM 表名" ;
SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
DataSet ds= new DataSet(); //创建DataSet实例
da.Fill(ds, "自定义虚拟表名" ); //使用DataAdapter的Fill方法(填充),调用SELECT命令
|
3、通过SqlCommand对象来创建
1
2
3
4
5
6
7
8
9
10
11
|
string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
SqlConnection connSql= new SqlConnection (strConn); //Sql链接类的实例化
connSql.Open (); //打开数据库
//使用SqlDataAdapter时没有必要从Connection.open()打开,
//SqlDataAdapter会自动打开关闭它。
string strSql = "SELECT * FROM 表名" ; //要执行的SQL语句
SqlCommand cmd = new SqlCommand(strSql, connSql);
SqlDataAdapter da= new SqlDataAdapter(cmd); //创建DataAdapter数据适配器实例
DataSet ds= new DataSet(); //创建DataSet实例
da.Fill(ds, "自定义虚拟表名" ); //使用DataAdapter的Fill方法(填充),调用SELECT命令
connSql.Close(); //关闭数据库
|
注意
如果只需要执行SQL语句或SP,就没必要用到DataAdapter ,直接用SqlCommand的Execute系列方法就可以了。sqlDataadapter的作用是实现Dataset和DB之间的桥梁:比如将对DataSet的修改更新到数据库。
SqlDataAdapter的UpdateCommand的执行机制是:当调用SqlDataAdapter.Update()时,检查DataSet中的所有行,然后对每一个修改过的Row执行SqlDataAdapter.UpdateCommand ,也就是说如果未修改DataSet中的数据,SqlDataAdapter.UpdateCommand不会执行。
1、在使用Fill方式时,可以指定DataTable,而不是DataSet:
1
2
3
4
5
6
|
string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
strSql= "SELECT * FROM 表名" ;
SqlDataAdapter da = new SqlDataAdapter(strSql, strConn);
DataTable tbl= new DataTable( );
da.Fill(tbl);
|
2、注意打开和关闭连接的处理
在调用SqlCommand对象执行sql命令之前,需要保证与该对象关联的SqlConnection对象是打开的,否则SqlCommand的方法执行时将引发一个异常,但是我们在上面的代码中看到,SqlDataAdapter没有这样的要求。
如果调用SqlDataAdapter的Fill方法,并且其SelectCommand属性的SqlConnection是关闭状态,则SqlDataAdapter会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用Fill方法前,SqlConnection是打开的,则查询执行完毕后,SqlConnection还将是打开的,也就是说SqlDataAdapter会保证SqlConnection的状态恢复到原来的情形
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
SqlConnection conn= new SqlConnection(strConn);
SqlDataAdapter daCustomers,daOrders;
strSql= "SELECT * FROM Customers" ;
daCustomers = new SqlDataAdapter(strSql, conn);
strSql= "SELECT * FROM Orders" ;
daOrders= new SqlDataAdapter(strSql, conn);
DataSet ds= new DataSet();
daCustomers.Fill(ds, "Customers" );
daOrders.Fill(ds, "Orders" );
|
以上代码会导致连接被打开和关闭两次,在调用Fill方法时各一次。为了避免打开和关闭SqlConnection对象,在调用SqlDataAdapter对象的Fill方法之前,我们可以先打开SqlConnection对象,如果希望之后关闭连接,我们可以再调用Close方法,就像这样:
1
2
3
4
5
6
7
8
9
10
11
12
|
conn.Open()
strSql= "SELECT * FROM Customers" ;
daCustomers = new SqlDataAdapter(strSql, conn);
strSql= "SELECT * FROM Orders" ;
daOrders= new SqlDataAdapter(strSql, conn);
DataSet ds= new DataSet();
daCustomers.Fill(ds, "Customers" );
daOrders.Fill(ds, "Orders" );
conn.Close();
|
3、多次调用Fill方法需要注意数据重复和有效更新数据的问题
推荐的做法是,在调用Fill方法前,先删除本地DataSet中缓存的数据!
admin
发表于 10个月前
1、首先是设置数据连接,注意此时conn为close状态,此时数据连接状态为连接到数据库
SqlConnectionStringBuilder connstr = new SqlConnectionStringBuilder();
connstr.DataSource = login.servername;
connstr.InitialCatalog = login.ufdatabase; //数据库
connstr.UserID = login.username;
connstr.Password = login.password;
SqlHelper.conn = new SqlConnection(connstr.ConnectionString);
2、然后设置SqlDataAdapter,详见SqlDataAdapter的说明,这是中间件,起到数据库和数据源沟通的作用
SqlDataAdapter da = new SqlDataAdapter(str, SqlHelper.conn);
DataSet ds = new DataSet();
da.Fill(ds, 1, 1000, SqlHelper.conn.DataSource); //1000为最大记录数
dataGridView1.DataSource = ds.Tables[0];
此时,conn的state为close状态,因为sqldataadapter是自动开关conn的,如果存在dataset则使用sqldataadapter,否则直接使用sqlcommand命令
注意事项:
1、设置表格自动调整宽度:
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
2、需要 using System.Data.SqlClient;
评论列表
加载数据中...