它们都是用于读取数据,在数据库中创建一张表,并插入一些数据,看看怎么获得这2个对象并使用
CREATE TABLE TEST1
(
Column1 VARCHAR(20),
Column2 VARCHAR(20),
Column3 VARCHAR(20)
)
INSERT INTO TEST1(Column1,Column2,Column3) VALUES('1','2','3')
INSERT INTO TEST1(Column1,Column2,Column3) VALUES('11','22','33')
INSERT INTO TEST1(Column1,Column2,Column3) VALUES('111','222','333')
static void Main(string[] args)
{
SqlConnection sqlConnection = new SqlConnection("Server=.;user=sa;pwd=find/-perm4000;database=DBTEST");
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
sqlConnection.Open();
SqlDataReader sqlDataReader=sqlCommand.ExecuteReader();
int count = sqlDataReader.FieldCount;
//获取字段名
for(int i=0;i<count;i++)
{
Console.Write(sqlDataReader.GetName(i)+"\t");
}
Console.WriteLine();
//获取字段值
while (sqlDataReader.Read())
{
for(int i=0;i<count;i++)
{
Console.Write(sqlDataReader.GetString(i)+"\t");
}
Console.WriteLine();
}
//读取完成需要手动Close,若不关闭可能会引发异常
sqlDataReader.Close();
sqlConnection.Close();
Console.Read();
}
static void Main(string[] args)
{
SqlConnection sqlConnection = new SqlConnection("Server=.;user=sa;pwd=find/-perm4000;database=DBTEST");
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
sqlConnection.Open();
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
DataSet dataSet = new DataSet();
sqlDataAdapter.Fill(dataSet);
DataTable dataTable = dataSet.Tables[0];
//获取列数
int columnCount = dataTable.Columns.Count;
//获取行数
int rowCount = dataTable.Rows.Count;
//打印列名
for(int i=0;i<columnCount;i++)
{
Console.Write(dataTable.Columns[i].Caption+"\t");
}
Console.WriteLine();
//打印内容
for(int i=0;i<rowCount;i++)
{
for(int j=0;j<columnCount;j++)
{
Console.Write(dataTable.Rows[i][j] + "\t");
}
Console.WriteLine();
}
Console.Read();
}
可以看出,结果是一样的,但用法上SqlDataAdapter看上去好像更复杂点,再说下使用上SqlDataReader和SqlDataAdapter需要注意的地方。
(1)SqlDataReader会一直占用SqlConnection,每次只会读取一行数据,只能向前读取,且没有提供修改其内容的API;SqlDataAdapter一次将结果集放入内存,以DataTable或DataSet接收,可精准定位到行列并可修改(改的是内存里的数据,不会反映到数据库)
(2)同一个SqlDataReader对象在调用Close之前只能接收一个SqlCommand;DataSet可执行多个SqlCommand
static void Main(string[] args)
{
SqlConnection sqlConnection = new SqlConnection("Server=.;user=sa;pwd=find/-perm4000;database=DBTEST");
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
sqlConnection.Open();
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
SqlCommand sqlCommand2 = new SqlCommand("SELECT * FROM TEST1", sqlConnection);
sqlDataReader = sqlCommand.ExecuteReader();
}
(3)从以上2个特点说明中可以看出SqlDataAdapter功能比SqlDataReader强大的多,所以SqlDataAdapter在实际业务中更加广泛的应用,但功能强大也意味着资源消耗更多,所以看实际情况作出最合适的选择(不过就目前的硬件发展水平,一般业务场景基本不可能达到硬件瓶颈,所以软件编程怎么方便怎么来就行了)