글
SqlDataReader vs SqlDataAdapter
연결 vs 비연결
DB에 종속적(sqlData~, oleData~) vs DB에 독립적(Dataset 앞에 sql 어쩌고가 없으니까..)
SqlDataReader (매번 db에 왓다갓다 해야되므로 속도가 저하된다.)
질의(select *from tblAddress) 를 날릴때마다 db에 왓다갓다 하면서 결과를 보여주는것.
SqlDataAdapter (db에 매번접근해야되는 횟수가 많으면 속도가 훨씬 빠르다. db에 매번 접속하지 않으니까..더많이쓰임)
fill 메서드가 호출되면 그이후에는 db로 접속하지않는다. DataSet 에 "select *from tblAddress" 의 결과가 복사되어있다.
이후부터는 DataSet 에서 가져와서 사용하는것이다.
string query = "select *from tblAddress";
// 1. 데이터 어댑터 생성
SqlDataAdapter adapter = new SqlDataAdapter(query, Properties.Resources.conStr);
// 2. 데이터 집합 생성 - 복사본
DataSet ds = new DataSet();
// 3. 데이터 채우기
adapter.Fill(ds, "tblAddress");
Console.WriteLine(ds.Tables["tblAddress"].Rows.Count);
// 4. 데이터 확인
DataTable dt = ds.Tables["tblAddress"];
for (int i = 0; i < dt.Rows.Count; i++)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}", dt.Rows[i]["id"].ToString(),dt.Rows[i]["name"].ToString(),
dt.Rows[i]["email"].ToString(), dt.Rows[i]["age"].ToString());
}
------------------------------------------------------------------------------------------------------------------------------
//질의가 두개 일때의 처리방법
SqlDataAdapter adapter = new SqlDataAdapter("select *from tblTest1; select *from tblTest2;", con);
DataSet ds = new DataSet();
adapter.Fill(ds); // 질의가 두개일때는 임시테이블명 못준다.
// 질의가 두개 일때는 아래와같이 테이블 이름을 준다...
ds.Tables[0].TableName = "tblTest1";
ds.Tables[1].TableName = "tblTest2";
Console.WriteLine(ds.Tables.Count);
for (int i = 0; i < ds.Tables.Count; i++)
{
for (int j = 0; j < ds.Tables[i].Rows.Count; j++)
{
Console.WriteLine("{0}\t{1}",ds.Tables[i].Rows[j]["seq"].ToString(), ds.Tables[i].Rows[j]["memo"].ToString());
}
}
// 테이블 1개 추가
SqlDataAdapter adapter2 = new SqlDataAdapter("select *from tblAddress", con);
//DataSet ds2 = new DataSet();
adapter2.Fill(ds, "tblAddress");
Console.WriteLine(ds.Tables.Count);
for (int i = 0; i < ds.Tables.Count; i++)
{
Console.WriteLine(ds.Tables[i].TableName);
}
-----------------------------------------------------------------------------------------------------------
// 연결지향
// 리스트를 2번 출력!
// ★ 연결데이터를 안쓰는 가장큰이유.. 동일한데이터를 2번출력 할 수 없으므로..
// ★ 따라서 연결지향쓰는 경우는 한번만 쭉 훓어서 출력하고 싶을경우에 쓴다.
SqlConnection con = new SqlConnection(Properties.Resources.conStr);
SqlCommand cmd = new SqlCommand("select *from tblAddress", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
// EOF 의 커서는 전진커서..뒤로 역탐색은 불가능하다.
while (reader.Read())
{
Console.WriteLine((int)reader["age"]+1);
// ★★ reader.GetInt32() : 캐스팅되서 나오는것. 단, 인덱스로만 접근가능하다.
Console.WriteLine(reader.GetInt32(3) + 1);
Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());
}
reader.Close();
reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader["id"].ToString(), reader["age"].ToString());
}
con.Close(); //다 읽은후에는 연결종료
reader.Close(); // reader도 종료
// 비연결
// 2번출력해주는게 쉽다.빠르다. (DatasSet에 들어있으니까..)
SqlDataAdapter adapter = new SqlDataAdapter("select *from tblAddress", con);
DataSet ds = new DataSet();
adapter.Fill(ds, "tblAddress");
// 2번 출력
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());
}
Console.WriteLine();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
Console.WriteLine("{0}\t{1}", ds.Tables[0].Rows[i]["id"].ToString(), ds.Tables[0].Rows[i]["age"].ToString());
}
RECENT COMMENT