很久以前就借了一本《Beginning C# Databases From Novice to Professional》,最近閒來無事終於可以拜讀一下。讀來發現自己之前的數據庫操作是何等的粗鄙。今天 抽時間記錄下一些關於數據讀取器有關的內容。
在本書後面的數據集時提及“如果只想讀取數據和顯示數據,則只需使用數據讀取器”,“如果需要處理數據,然後更新數據庫,就需要使用數據集”
下面給出一個實例
using System;
using System.Data;
using System.Data.SqlClient;
namespace DataReader
{
class Program
{
static void Main(string[] args)
{
string connString = @"Data Source=localhost;Initial Catalog=mydatabase; Integrated Security=SSPI";
string sql = @"select * from mytable";
SqlConnection conn = new SqlConnection(connString);
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
//SqlDataReader類是抽象類,不能顯示實例化。必須執行SqlCommand的ExecuteReader方法獲得SqlDataReader實例
SqlDataReader reader = cmd.ExecuteReader();
//Read方法如果存在下一行就返回true,並向前移動遊標;如果沒有下一行,該方法就返回false
while (reader.Read())
{
Console.WriteLine("databack with {0} columes", reader[0]);
}
}
catch (Exception e)
{
Console.WriteLine("Error occurred:" + e);
}
finally
{
conn.Close();
}
}
}
}
Console.WriteLine("databack with {0} columes", reader[0]); 中使用了序數索引器從數據庫中檢索列數據。
同時可以使用列名索引器(優點:使用列名索引器可以屏蔽由於添加刪除列導致的列順序變化,而產生的異常)
reader["CompanyName"].Tostring().PadLeft(25);
reader["ContactName"].Tostring().PadLeft(20);
然後如果知道了返回值的類型 還可以使用類型訪問器
這個需要查表將數據庫中定義的類型對用.NET Framework中的類型訪問器
while(reader.Read())
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}",reader.GetString(0).PadRight(30), reader.GetDecimal(1),reader.GetInt16(2),reader.GetBoolean(3));
}
類型訪問器方法都以Get開頭,用序數進行數據索引,是類型安全的
數據讀取器的元數據屬性和函數
函數或屬性名稱 |
說明 |
Depth |
該屬性表示當前行的嵌套深度 |
FieldCount |
該屬性表示結果集中的列數 |
GetDataTypeName |
這個方法接收索引,返回含有列數據類型名稱的字符串 |
GetfieldType |
這個方法接收索引,返回對象的.NET FrameWork 數據類型 |
GetName |
這個方法接收索引,返回指定列的名稱 |
GetOrdinal |
這個方法接收列名,返回列的索引 |
Console.WriteLine("'{0|' is at index{1}" +
"and its type is:{2}",
reader.GetName(0),
reader.GetOrdinal("contactname"),
reader.GetFieldType(0));
獲取表的數據
DataTable schema=reader.GetSchemaTable();
使用拼接的方式 使用數據讀取器處理多個結果集
string sql1 = @“select companyname,contactname from customers where companyname like 'A%'";
string sql2 =@"select firstname,lastname from employees";
string sql=sql1+sql2;
SqlDataReader reader= cmd.executeReader();
do
{
while(reader.Read())
{
Console.WriteLine("".PadLeft(60,'='));
}
}
while(reader.NextResult());