HOW TO:執行會傳回 RefType 結果的查詢 (EntityClient)
本主題提供的範例將說明如何藉由使用 EntityCommand 對 Entity Data Model 執行命令,以及如何藉由使用 EntityDataReader 擷取 RefType 結果。
若要執行這個範例中的程式碼
將 AdventureWorks Sales Model 加入至專案中,並將專案設定成使用 Entity Framework。若要這麼做,必須執行下列其中一項:
如果您已經安裝 Entity Data Model 工具,請完成 HOW TO:使用 Entity Data Model 精靈 (Entity Framework) 中的程序。
否則,請完成 HOW TO:手動設定 Entity Framework 專案和 HOW TO:以手動方式定義 Entity Data Model (Entity Framework) 中的程序。
在應用程式的字碼頁中加入下列 using 陳述式 (在 Visual Basic 中為 Imports):
Imports System Imports System.Collections.Generic Imports System.Collections Imports System.Data.Common Imports System.Data Imports System.Data.SqlClient Imports System.Data.EntityClient Imports System.Data.Metadata.Edm Imports System.IO ' Add AdventureWorksModel prepended with the root namespace for the project. 'Imports ProjectName.AdventureWorksModel
using System; using System.Collections.Generic; using System.Collections; using System.Data.Common; using System.Data; using System.IO; using System.Data.SqlClient; using System.Data.EntityClient; using AdventureWorksModel; using System.Data.Metadata.Edm;
範例
若要測試程式碼,將下列查詢當成引數傳遞至 ExectueRefTypeQuery
函式:
"SELECT REF(p) FROM AdventureWorksEntities.Product as p"
上述查詢會傳回 RefType 結果。
Sub ExectueRefTypeQuery(ByVal esqlQuery As String)
If (esqlQuery.Length = 0) Then
Console.WriteLine("The query string is empty.")
Return
End If
Using conn As EntityConnection = New EntityConnection("name=AdventureWorksEntities")
conn.Open()
Try
' Create an EntityCommand.
Using cmd As EntityCommand = conn.CreateCommand()
cmd.CommandText = esqlQuery
' Execute the command.
Using reader As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
Do While (reader.Read())
RefTypeVisitRecord(CType(reader, IExtendedDataRecord))
Loop
End Using
End Using
Catch ex As Exception
Console.WriteLine(ex.ToString())
End Try
conn.Close()
End Using
End Sub
Sub RefTypeVisitRecord(ByVal record As IExtendedDataRecord)
' For RefType the record contains exactly one field.
Dim fieldIndex As Integer
fieldIndex = 0
' If the field is flagged as DbNull, the shape of the value is undetermined.
' An attempt to get such a value may trigger an exception.
If (record.IsDBNull(fieldIndex) = False) Then
Dim fieldTypeKind As BuiltInTypeKind = record.DataRecordInfo.FieldMetadata(fieldIndex).FieldType.TypeUsage.EdmType.BuiltInTypeKind()
'read only fields that contain PrimitiveType
If (fieldTypeKind = BuiltInTypeKind.RefType) Then
' Ref types are surfaced as EntityKey instances.
' The containing record sees them as atomic.
Dim key As EntityKey = CType(record.GetValue(fieldIndex), EntityKey)
' Get the EntitySet name.
Console.WriteLine("EntitySetName " + key.EntitySetName)
' Get the Name and the Value information of the EntityKey.
Dim keyMember As EntityKeyMember
For Each keyMember In key.EntityKeyValues
Console.WriteLine(" Key Name: " + keyMember.Key)
Console.WriteLine(" Key Value: " + keyMember.Value)
Next
End If
End If
End Sub
static void ExectueRefTypeQuery(string esqlQuery)
{
if (esqlQuery.Length == 0)
{
Console.WriteLine("The query string is empty.");
return;
}
using (EntityConnection conn =
new EntityConnection("name=AdventureWorksEntities"))
{
conn.Open();
try
{
// Create an EntityCommand.
using (EntityCommand cmd = conn.CreateCommand())
{
cmd.CommandText = esqlQuery;
// Execute the command.
using (EntityDataReader rdr =
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
// Start reading results.
while (rdr.Read())
{
RefTypeVisitRecord(rdr as IExtendedDataRecord);
}
}
}
}
catch (EntityException ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
}
}
static void RefTypeVisitRecord(IExtendedDataRecord record)
{
// For RefType the record contains exactly one field.
int fieldIndex = 0;
// If the field is flagged as DbNull, the shape of the value is undetermined.
// An attempt to get such a value may trigger an exception.
if (record.IsDBNull(fieldIndex) == false)
{
BuiltInTypeKind fieldTypeKind = record.DataRecordInfo.FieldMetadata[fieldIndex].
FieldType.TypeUsage.EdmType.BuiltInTypeKind;
//read only fields that contain PrimitiveType
if (fieldTypeKind == BuiltInTypeKind.RefType)
{
// Ref types are surfaced as EntityKey instances.
// The containing record sees them as atomic.
EntityKey key = record.GetValue(fieldIndex) as EntityKey;
// Get the EntitySet name.
Console.WriteLine("EntitySetName " + key.EntitySetName);
// Get the Name and the Value information of the EntityKey.
foreach (EntityKeyMember keyMember in key.EntityKeyValues)
{
Console.WriteLine(" Key Name: " + keyMember.Key);
Console.WriteLine(" Key Value: " + keyMember.Value);
}
}
}
}