对于你的例子,你不执行:
selectcommand. ExecuteNonQuery();
效果是一样的ExecuteNonQuery只是执行SQL语句,而不返回数据集之所以你的DataSet里面被填充了数据,是因为你的da利用了selectcommand来执行ExcuteReader返回一个DataReader,这个DataReader包含了查询的数据,da会把这些数据填充到DataSet,然后释放Reader,所以DataSet的数据是本地的
selectcommand. ExecuteNonQuery();
效果是一样的ExecuteNonQuery只是执行SQL语句,而不返回数据集之所以你的DataSet里面被填充了数据,是因为你的da利用了selectcommand来执行ExcuteReader返回一个DataReader,这个DataReader包含了查询的数据,da会把这些数据填充到DataSet,然后释放Reader,所以DataSet的数据是本地的
你用ExecuteNonQuery()执行时他已经把数据填入到customers中去了,你再用fill,实际上
执行的是同一个操作,只是填充的表不同而已,当然我出现“表里的结构和数据完全等同于 customers的情况“。
而select一般用fill
sltcommand.CommandText=”Select distinct shortname from
customers”;
sltcommand. ExecuteNonQuery();
da.Fill(this.dataset1,"shortname");
sltcommand.CommandText=”Select distinct shortname from customers”;
Fill()执行很多操作,打开相关的SqlConnection,执行SqlCommand,并将返回的数据填入Dataset的相应DataTable中。如果用了Fill(),不需要执行ExecuteNonQuery(),它会将数据填入你参数指定的DataTable里,如果这个名字的DataTable不存在,它将创建一个DataTable。
(如OleDbDataAdapter)中的一个命令属性,在执行Fill()方法时,会根据你的命令来填充数据集,
参数如果只有一个参数(数据集)那么会生成或填充已经存在的和你的from 的表相同名的DataTable放到数据集中,如果有两个参数,第二个参数是表的别名(在数据集中区别别的表),那是在数据集中真正的表名,和数据库中表名没有直接关系,只是一个映射吧,所以你两次填充,虽然是访问的数据库中同一个表,但是你用了两个别名所以 产生了两个DataTable但是结构和数据基本上是相同的