執行命令

內含在 .NET Framework 中的每個 .NET Framework 資料提供者本身都有命令物件,此物件是繼承自 DbCommand。 .NET Framework Data Provider for OLE DB 包含 OleDbCommand 物件、.NET Framework Data Provider for SQL Server 包含 SqlCommand 物件、.NET Framework Data Provider for ODBC 包含 OdbcCommand 物件,而 .NET Framework Data Provider for Oracle 包含 OracleCommand 物件。 上述每種物件都會根據命令類型和想要的傳回值而公開 (Expose) 執行命令的方法,如下表所述。

Command 傳回值
ExecuteReader 傳回 DataReader 物件。
ExecuteScalar 傳回單一純量值。
ExecuteNonQuery 執行不會傳回任何資料列的命令。
ExecuteXMLReader 傳回 XmlReader。 僅適用於 SqlCommand 物件。

每個強型別 (Strongly Typed) 的命令物件也會支援 CommandType 列舉型別 (Enumeration),此型別可指定解譯命令字串的方式。

CommandType 說明
Text SQL 命令,可定義在資料來源執行的陳述式。
StoredProcedure 預存程序的名稱。 您可以使用命令的 Parameters 屬性來存取輸入和輸出參數及傳回值,不論呼叫的是哪一個 Execute 方法。 在使用 ExecuteReader 時,無法在 DataReader 關閉之前存取傳回值和輸出參數。
TableDirect 資料表的名稱。

範例

下列程式碼範例示範如何建立 SqlCommand 物件,以藉由設定其屬性來執行預存程序。 用來指定預存程序輸出參數的 SqlParameter 物件。 此命令是藉由使用 ExecuteReader 方法來執行,而 SqlDataReader 的輸出則會顯示在主控台視窗中。

static void GetSalesByCategory(string connectionString,
    string categoryName)
{
    using (SqlConnection connection = new(connectionString))
    {
        // Create the command and set its properties.
        SqlCommand command = new()
        {
            Connection = connection,
            CommandText = "SalesByCategory",
            CommandType = CommandType.StoredProcedure
        };

        // Add the input parameter and set its properties.
        SqlParameter parameter = new()
        {
            ParameterName = "@CategoryName",
            SqlDbType = SqlDbType.NVarChar,
            Direction = ParameterDirection.Input,
            Value = categoryName
        };

        // Add the parameter to the Parameters collection.
        command.Parameters.Add(parameter);

        // Open the connection and execute the reader.
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);
                }
            }
            else
            {
                Console.WriteLine("No rows found.");
            }
            reader.Close();
        }
    }
}
Shared Sub GetSalesByCategory(ByVal connectionString As String, _
    ByVal categoryName As String)

    Using connection As New SqlConnection(connectionString)

        ' Create the command and set its properties.
        Dim command As SqlCommand = New SqlCommand()
        command.Connection = connection
        command.CommandText = "SalesByCategory"
        command.CommandType = CommandType.StoredProcedure

        ' Add the input parameter and set its properties.
        Dim parameter As New SqlParameter()
        parameter.ParameterName = "@CategoryName"
        parameter.SqlDbType = SqlDbType.NVarChar
        parameter.Direction = ParameterDirection.Input
        parameter.Value = categoryName

        ' Add the parameter to the Parameters collection.
        command.Parameters.Add(parameter)

        ' Open the connection and execute the reader.
        connection.Open()
        Using reader As SqlDataReader = command.ExecuteReader()

            If reader.HasRows Then
                Do While reader.Read()
                    Console.WriteLine("{0}: {1:C}", _
                      reader(0), reader(1))
                Loop
            Else
                Console.WriteLine("No rows returned.")
            End If
        End Using
    End Using
End Sub

疑難排解命令

.NET Framework Data Provider for SQL Server 加入一個效能計數器,可讓您偵測與失敗命令執行相關的週期性問題。 如需詳細資訊,請參閱效能計數器

另請參閱