执行命令

包含在 .NET Framework 中的每个 .NET Framework 数据提供程序都拥有自己的继承自 DbCommand 的命令对象。 适用于 OLE DB 的 .NET Framework 数据提供程序包括一个 OleDbCommand 对象,适用于 SQL Server 的 .NET Framework 数据提供程序包括一个 SqlCommand 对象,适用于 ODBC 的 .NET Framework 数据提供程序包括一个 OdbcCommand 对象,适用于 Oracle 的 .NET Framework 数据提供程序包括一个 OracleCommand 对象。 其中每个对象都根据命令的类型和所需的返回值公开用于执行命令的方法,如下表所述。

命令 返回值
ExecuteReader 返回一个 DataReader 对象。
ExecuteScalar 返回一个标量值。
ExecuteNonQuery 执行不返回任何行的命令。
ExecuteXMLReader 返回 XmlReader。 只用于 SqlCommand 对象。

每个强类型命令对象还支持指定如何解释命令字符串的 CommandType 枚举,如下表所述。

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

命令疑难解答

用于 SQL Server 的 .NET Framework 数据提供程序添加了性能计数器,使您能够检测与失败的命令执行相关的间歇性问题。 有关详细信息,请参阅性能计数器

请参阅