DataReader kullanarak veri alma

DataReader kullanarak verileri almak Için, komut nesnesinin bir örneğini oluşturun ve sonra bir veri kaynağından satırları almak için Command. ExecuteReader çağırarak bir DataReader oluşturun. DataReader , yordamsal mantığın bir veri kaynağından oluşan sonuçları sırayla verimli bir şekilde işlemesini sağlayan, arabelleğe alınmamış bir veri akışı sağlar. Veriler bellekte önbelleğe alınmadığı için büyük miktarlarda veri alırken DataReader iyi bir seçimdir.

Aşağıdaki örnekte, geçerli bir reader DataReader temsil eden ve command geçerli bir komut nesnesini temsil eden bir DataReader kullanımı gösterilmektedir.

reader = command.ExecuteReader();  
reader = command.ExecuteReader()

Sorgu sonuçlarından bir satır almak için DataReader. Read metodunu kullanın. Döndürülen satırın her sütununa, sütunun ad veya sıra numarasını DataReader' a geçirerek erişebilirsiniz. Bununla birlikte, en iyi performans için, DataReader kendi yerel veri türlerindeki (GetDateTime, GetDouble, GetGuid, GetInt32 vb.) sütun değerlerine erişmenize izin veren bir dizi yöntem sunar. Veri sağlayıcısına özgü DataReaders türü belirlenmiş erişimci yöntemlerinin bir listesi için bkz OleDbDataReader SqlDataReader . ve. Temel alınan veri türünü bildiğiniz durumlarda türü belirlenmiş erişimci yöntemlerinin kullanılması, sütun değerini alırken gereken tür dönüştürme miktarını azaltır.

Aşağıdaki örnek, bir DataReader nesnesi üzerinden yinelenir ve her satırdan iki sütun döndürür.

static void HasRows(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
        }
        else
        {
            Console.WriteLine("No rows found.");
        }
        reader.Close();
    }
}
Private Sub HasRows(ByVal connection As SqlConnection)
    Using connection
        Dim command As SqlCommand = New SqlCommand( _
          "SELECT CategoryID, CategoryName FROM Categories;", _
          connection)
        connection.Open()

        Dim reader As SqlDataReader = command.ExecuteReader()

        If reader.HasRows Then
            Do While reader.Read()
                Console.WriteLine(reader.GetInt32(0) _
                  & vbTab & reader.GetString(1))
            Loop
        Else
            Console.WriteLine("No rows found.")
        End If

        reader.Close()
    End Using
End Sub

DataReader kapatılıyor

DataReader nesnesini kullanmayı bitirdiğinizde her zaman Close yöntemini çağırın.

Komutunuz çıkış parametrelerini veya dönüş değerlerini Içeriyorsa, DataReader kapatılana kadar bu değerler kullanılamaz.

Bir DataReader açık olsa da bağlantı , bu DataReader tarafından özel olarak kullanılıyor. Özgün DataReader kapatılana kadar, başka bir DataReader oluşturma da dahil olmak üzere bağlantı için herhangi bir komut yürütemezsiniz.

Not

Bir bağlantıyı, bir DataReader'ı veya sınıfınızın Finalize yönteminde herhangi bir yönetilen nesneyi kapatma veya atma işlemini çağırmayın. Sonlandırıcıda yalnızca, sınıfınızın doğrudan sahip olduğu yönetilmeyen kaynakları serbest bırakın. Sınıfınız hiçbir yönetilmeyen kaynağa sahip değilse, sınıf tanımınıza bir Finalize yöntemi eklemeyin. Daha fazla bilgi için bkz. çöp toplama.

NextResult kullanarak birden çok sonuç kümesi alma

DataReader birden çok sonuç kümesi döndürürse, sonuç kümelerini sırayla yinelemek Için NextResult yöntemini çağırın. Aşağıdaki örnek, SqlDataReader yöntemi kullanılarak ıkı SELECT deyimi sonuçlarının işlenme işlemini gösterir ExecuteReader .

static void RetrieveMultipleResults(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM dbo.Categories;" +
          "SELECT EmployeeID, LastName FROM dbo.Employees",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        while (reader.HasRows)
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            while (reader.Read())
            {
                Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
            reader.NextResult();
        }
    }
}
Private Sub RetrieveMultipleResults(ByVal connection As SqlConnection)
    Using connection
        Dim command As SqlCommand = New SqlCommand( _
          "SELECT CategoryID, CategoryName FROM Categories;" & _
          "SELECT EmployeeID, LastName FROM Employees", connection)
        connection.Open()

        Dim reader As SqlDataReader = command.ExecuteReader()

        Do While reader.HasRows
            Console.WriteLine(vbTab & reader.GetName(0) _
              & vbTab & reader.GetName(1))

            Do While reader.Read()
                Console.WriteLine(vbTab & reader.GetInt32(0) _
                  & vbTab & reader.GetString(1))
            Loop

            reader.NextResult()
        Loop
    End Using
End Sub

DataReader 'tan şema bilgileri alma

Bir DataReader açıkken, GetSchemaTable yöntemini kullanarak geçerli sonuç kümesiyle ilgili şema bilgilerini alabilirsiniz. GetSchemaTable DataTable , geçerli sonuç kümesi için şema bilgilerini içeren satırlar ve sütunlar ile doldurulmuş bir nesne döndürür. DataTable , sonuç kümesinin her bir sütunu için bir satır içerir. Şema tablosunun her sütunu, sonuç kümesinin satırlarında döndürülen sütunların bir özelliğine eşlenir; burada sütunadı , özelliğin adıdır ve sütununun değeri özelliğin değeridir. Aşağıdaki örnek, DataReader için şema bilgilerini yazar.

static void GetSchemaInfo(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();
        DataTable schemaTable = reader.GetSchemaTable();

        foreach (DataRow row in schemaTable.Rows)
        {
            foreach (DataColumn column in schemaTable.Columns)
            {
                Console.WriteLine(String.Format("{0} = {1}",
                   column.ColumnName, row[column]));
            }
        }
    }
}
Private Sub GetSchemaInfo(ByVal connection As SqlConnection)
    Using connection
        Dim command As SqlCommand = New SqlCommand( _
          "SELECT CategoryID, CategoryName FROM Categories;", _
          connection)
        connection.Open()

        Dim reader As SqlDataReader = command.ExecuteReader()
        Dim schemaTable As DataTable = reader.GetSchemaTable()

        Dim row As DataRow
        Dim column As DataColumn

        For Each row In schemaTable.Rows
            For Each column In schemaTable.Columns
                Console.WriteLine(String.Format("{0} = {1}", _
                  column.ColumnName, row(column)))
            Next
            Console.WriteLine()
        Next
        reader.Close()
    End Using
End Sub

OLE DB bölümler ile çalışma

Hiyerarşik satır kümeleri veya bölümler (OLE DB türü dbtype_hchapter, ADO türü adbölüm) kullanılarak alınabilir OleDbDataReader . Bölüm içeren bir sorgu DataReader olarak döndürüldüğünde, bölüm bu DataReader 'da bir sütun olarak döndürülür ve bir DataReader nesnesi olarak sunulur.

ADO.NET veri kümesi , tablolar arasında üst-alt ilişkilerini kullanarak hiyerarşik satır kümelerini temsil etmek için de kullanılabilir. Daha fazla bilgi için bkz. veri kümeleri, DataTable ve DataView.

Aşağıdaki kod örneği, bir müşteri listesindeki her müşteri için siparişlerin bir bölüm sütununu oluşturmak üzere MSDataShape sağlayıcısını kullanır.

Using connection As OleDbConnection = New OleDbConnection(
    "Provider=MSDataShape;Data Provider=SQLOLEDB;" &
    "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")

    Using custCMD As OleDbCommand = New OleDbCommand(
        "SHAPE {SELECT CustomerID, CompanyName FROM Customers} " &
        "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS CustomerOrders " &
        "RELATE CustomerID TO CustomerID)", connection)

        connection.Open()

        Using custReader As OleDbDataReader = custCMD.ExecuteReader()

            Do While custReader.Read()
                Console.WriteLine("Orders for " & custReader.GetString(1))
                ' custReader.GetString(1) = CompanyName  

                Using orderReader As OleDbDataReader = custReader.GetValue(2)
                    ' custReader.GetValue(2) = Orders chapter as DataReader  

                    Do While orderReader.Read()
                        Console.WriteLine(vbTab & orderReader.GetInt32(1))
                        ' orderReader.GetInt32(1) = OrderID  
                    Loop
                    orderReader.Close()
                End Using
            Loop
            ' Make sure to always close readers and connections.  
            custReader.Close()
        End Using
    End Using
End Using
using (OleDbConnection connection = new OleDbConnection(
    "Provider=MSDataShape;Data Provider=SQLOLEDB;" +
    "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"))
{
    using (OleDbCommand custCMD = new OleDbCommand(
        "SHAPE {SELECT CustomerID, CompanyName FROM Customers} " +
        "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS CustomerOrders " +
        "RELATE CustomerID TO CustomerID)", connection))
    {
        connection.Open();

        using (OleDbDataReader custReader = custCMD.ExecuteReader())
        {

            while (custReader.Read())
            {
                Console.WriteLine("Orders for " + custReader.GetString(1));
                // custReader.GetString(1) = CompanyName  

                using (OleDbDataReader orderReader = (OleDbDataReader)custReader.GetValue(2))
                {
                    // custReader.GetValue(2) = Orders chapter as DataReader  

                    while (orderReader.Read())
                        Console.WriteLine("\t" + orderReader.GetInt32(1));
                    // orderReader.GetInt32(1) = OrderID  
                    orderReader.Close();
                }
            }
            // Make sure to always close readers and connections.  
            custReader.Close();
        }
    }
}

Oracle REF IMLEÇLER ile sonuçları döndürme

oracle için .NET Framework Veri Sağlayıcısı, oracle REF imleçler 'in bir sorgu sonucu döndürecek şekilde kullanılmasını destekler. Oracle REF CURSOR bir olarak döndürülür OracleDataReader .

OracleDataReaderYöntemini kullanarak bir Oracle başvuru imlecini temsil eden bir nesnesi alabilirsiniz ExecuteReader . Ayrıca, OracleCommand bir veya daha fazla Oracle başvuru imleçlerini bir tane doldurdukları Için SelectCommand olarak döndüren bir de belirtebilirsiniz OracleDataAdapter DataSet .

Oracle veri kaynağından döndürülen bir başvuru IMLECINE erişmek için, OracleCommand sorgunuz için bir oluşturun ve başvuru imlecine başvuran bir çıkış parametresi ekleyin Parameters OracleCommand . Parametrenin adı Sorgunuzdaki REF CURSOR parametresinin adıyla eşleşmelidir. Parametresinin türünü olarak ayarlayın OracleType.Cursor . ' OracleCommand.ExecuteReader() In YÖNTEMI OracleCommand OracleDataReader başvuru imleci için döndürür.

OracleCommandBirden çok başvuru imleci döndürürse, birden çok çıkış parametresi ekleyin. Yöntemini çağırarak farklı başvuru Imleçlerinin erişimine erişebilirsiniz OracleCommand.ExecuteReader() . Çağrısı, ExecuteReader() OracleDataReader Ilk başvuru imlecine başvuran döndürür. Ardından, OracleDataReader.NextResult() sonrakı başvuru imleçlerini erişmek için yöntemini çağırabilirsiniz. OracleCommand.ParametersKoleksiyonunuzdaki parametreler, başvuru imleci çıkış parametreleriyle ada göre eşleşir, ancak OracleDataReader onlara koleksiyona eklendikleri sırayla erişir Parameters .

Örneğin, aşağıdaki Oracle paketini ve paket gövdesini göz önünde bulundurun.

CREATE OR REPLACE PACKAGE CURSPKG AS
  TYPE T_CURSOR IS REF CURSOR;
  PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
    DEPTCURSOR OUT T_CURSOR);
END CURSPKG;  
  
CREATE OR REPLACE PACKAGE BODY CURSPKG AS
  PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
    DEPTCURSOR OUT T_CURSOR)
  IS
  BEGIN
    OPEN EMPCURSOR FOR SELECT * FROM DEMO.EMPLOYEE;
    OPEN DEPTCURSOR FOR SELECT * FROM DEMO.DEPARTMENT;
  END OPEN_TWO_CURSORS;
END CURSPKG;

Aşağıdaki kod, OracleCommand koleksiyona iki tür parametre ekleyerek önceki Oracle PAKETINDEN başvuru imleçleri döndüren bir oluşturur OracleType.Cursor OracleCommand.Parameters .

Dim cursCmd As OracleCommand = New OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn)  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  
OracleCommand cursCmd = new OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn);  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  

Aşağıdaki kod, ve yöntemlerini kullanarak önceki komutun sonucunu döndürür Read() NextResult() OracleDataReader . REF CURSOR parametreleri sırayla döndürülür.

oraConn.Open()  
  
Dim cursCmd As OracleCommand = New OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn)  
cursCmd.CommandType = CommandType.StoredProcedure  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  
  
Dim reader As OracleDataReader = cursCmd.ExecuteReader()  
  
Console.WriteLine(vbCrLf & "Emp ID" & vbTab & "Name")  
  
Do While reader.Read()  
  Console.WriteLine("{0}" & vbTab & "{1}, {2}", reader.GetOracleNumber(0), reader.GetString(1), reader.GetString(2))  
Loop  
  
reader.NextResult()  
  
Console.WriteLine(vbCrLf & "Dept ID" & vbTab & "Name")  
  
Do While reader.Read()  
  Console.WriteLine("{0}" & vbTab & "{1}", reader.GetOracleNumber(0), reader.GetString(1))  
Loop  
' Make sure to always close readers and connections.  
reader.Close()  
oraConn.Close()  
oraConn.Open();  
  
OracleCommand cursCmd = new OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn);  
cursCmd.CommandType = CommandType.StoredProcedure;  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  
  
OracleDataReader reader = cursCmd.ExecuteReader();  
  
Console.WriteLine("\nEmp ID\tName");  
  
while (reader.Read())  
  Console.WriteLine("{0}\t{1}, {2}", reader.GetOracleNumber(0), reader.GetString(1), reader.GetString(2));  
  
reader.NextResult();  
  
Console.WriteLine("\nDept ID\tName");  
  
while (reader.Read())  
  Console.WriteLine("{0}\t{1}", reader.GetOracleNumber(0), reader.GetString(1));  
// Make sure to always close readers and connections.  
reader.Close();  
oraConn.Close();  

Aşağıdaki örnek, DataSet Oracle paketinin sonuçlarıyla birlikte doldurmak için Previous komutunu kullanır.

Dim ds As DataSet = New DataSet()  
  
Dim adapter As OracleDataAdapter = New OracleDataAdapter(cursCmd)  
adapter.TableMappings.Add("Table", "Employees")  
adapter.TableMappings.Add("Table1", "Departments")  
  
adapter.Fill(ds)  
DataSet ds = new DataSet();  
  
OracleDataAdapter adapter = new OracleDataAdapter(cursCmd);  
adapter.TableMappings.Add("Table", "Employees");  
adapter.TableMappings.Add("Table1", "Departments");  
  
adapter.Fill(ds);  

Not

bir OverflowException'ı önlemek için, değeri bir içinde depolamadan önce Oracle NUMBER türünden geçerli bir .NET Framework türüne dönüştürme işleminin de işlemesini öneririz DataRow . FillErrorBir OverflowException 'ın oluşup oluşmadığını öğrenmek için olayını kullanabilirsiniz. Olay hakkında daha fazla bilgi için FillError bkz. DataAdapter olaylarını işleme.

Ayrıca bkz.