Configurando parâmetros e tipos de dados de parâmetroConfiguring parameters and parameter data types

Objetos de comando usam parâmetros para passar valores para instruções SQL ou procedimentos armazenados, fornecendo verificação de tipo e validação.Command objects use parameters to pass values to SQL statements or stored procedures, providing type checking and validation. Diferentemente do texto de comando, o parâmetro de entrada é tratado como um valor literal, não como código executável.Unlike command text, parameter input is treated as a literal value, not as executable code. Isso ajuda a proteger contra ataques de "Injeção de SQL", em que um invasor insere um comando que compromete a segurança no servidor em uma instrução SQL.This helps guard against "SQL injection" attacks, in which an attacker inserts a command that compromises security on the server into an SQL statement.

Os comandos parametrizados também podem melhorar o desempenho de execução da consulta, porque ajudam o servidor de banco de dados a corresponder exatamente ao comando de entrada com um plano de consulta em cache apropriado.Parameterized commands can also improve query execution performance, because they help the database server accurately match the incoming command with a proper cached query plan. Para obter mais informações, consulte cache de plano de execução e reutilização e parâmetros e reutilização de plano de execução.For more information, see Execution Plan Caching and Reuse and Parameters and Execution Plan Reuse. Além dos benefícios de segurança e desempenho, os comandos parametrizados fornecem um método conveniente para organizar os valores passados para uma fonte de dados.In addition to the security and performance benefits, parameterized commands provide a convenient method for organizing values passed to a data source.

Um objeto DbParameter pode ser criado usando o construtor ou adicionando-o ao DbParameterCollection chamando o método Add da coleção DbParameterCollection.A DbParameter object can be created by using its constructor, or by adding it to the DbParameterCollection by calling the Add method of the DbParameterCollection collection. O método Add utilizará como entrada argumentos de construtor ou um objeto de parâmetro existente, dependendo do provedor de dados.The Add method will take as input either constructor arguments or an existing parameter object, depending on the data provider.

Fornecendo a propriedade ParameterDirectionSupplying the ParameterDirection property

Ao adicionar parâmetros, você deverá fornecer uma propriedade ParameterDirection para parâmetros diferentes dos parâmetros de entrada.When adding parameters, you must supply a ParameterDirection property for parameters other than input parameters. A tabela a seguir mostra os valores ParameterDirection que você pode usar com a enumeração ParameterDirection.The following table shows the ParameterDirection values that you can use with the ParameterDirection enumeration.

Nome do membroMember name DescriçãoDescription
Input O parâmetro é um parâmetro de entrada.The parameter is an input parameter. Esse é o padrão.This is the default.
InputOutput O parâmetro pode executar entrada e saída.The parameter can perform both input and output.
Output O parâmetro é um parâmetro de saída.The parameter is an output parameter.
ReturnValue O parâmetro representa um valor de retorno de uma operação como um procedimento armazenado, uma função interna ou uma função definida pelo usuário.The parameter represents a return value from an operation such as a stored procedure, built-in function, or user-defined function.

Trabalhando com espaços reservados de parâmetroWorking with parameter placeholders

A sintaxe para espaços reservados de parâmetro depende da fonte de dados.The syntax for parameter placeholders depends on the data source. Os provedores de dados .NET Framework lidar com a nomenclatura e especificando parâmetros e espaços reservados de parâmetro de forma diferente.The .NET Framework data providers handle naming and specifying parameters and parameter placeholders differently. Essa sintaxe é personalizada para uma fonte de dados específica, conforme descrito na tabela a seguir.This syntax is customized to a specific data source, as described in the following table.

Provedor de dadosData provider Sintaxe de nomeação de parâmetroParameter naming syntax
System.Data.SqlClient Usa parâmetros nomeados no formato @ parametername.Uses named parameters in the format @parametername.
System.Data.OleDb Usa os marcadores de parâmetros posicionais indicados por um ponto de interrogação (?).Uses positional parameter markers indicated by a question mark (?).
System.Data.Odbc Usa os marcadores de parâmetros posicionais indicados por um ponto de interrogação (?).Uses positional parameter markers indicated by a question mark (?).
System.Data.OracleClient Usa parâmetros nomeados no formato : parmname (ou parmname).Uses named parameters in the format :parmname (or parmname).

Especificando tipos de dados de parâmetroSpecifying parameter data types

O tipo de dados de um parâmetro é específico ao provedor de dados .NET Framework.The data type of a parameter is specific to the .NET Framework data provider. Especifica o tipo converte o valor da Parameter para o tipo de provedor de dados .NET Framework antes de passar o valor para a fonte de dados.Specifying the type converts the value of the Parameter to the .NET Framework data provider type before passing the value to the data source. Você também pode especificar o tipo de um Parameter genericamente definindo a propriedade DbType de um objeto Parameter para um DbType específico.You may also specify the type of a Parameter in a generic manner by setting the DbType property of the Parameter object to a particular DbType.

O tipo de provedor de dados .NET Framework de um Parameter objeto é inferido do tipo do .NET Framework a Value da Parameter objeto, ou do DbType do Parameter objeto.The .NET Framework data provider type of a Parameter object is inferred from the .NET Framework type of the Value of the Parameter object, or from the DbType of the Parameter object. A tabela a seguir mostra o tipo inferido de Parameter baseado no objeto passado como o valor do Parameter ou DbType especificado.The following table shows the inferred Parameter type based on the object passed as the Parameter value or the specified DbType.

Tipo do .NET Framework.NET Framework type DbTypeDbType SqlDbTypeSqlDbType OleDbTypeOleDbType OdbcTypeOdbcType OracleTypeOracleType
Boolean BooleanBoolean BitBit BooleanBoolean BitBit ByteByte
Byte ByteByte TinyIntTinyInt UnsignedTinyIntUnsignedTinyInt TinyIntTinyInt ByteByte
byte[]byte[] BinárioBinary VarBinary.VarBinary. Essa conversão implícita falhará se a matriz de bytes for maior que o tamanho máximo de um VarBinary, que é de 8000 bytes. Para matrizes de byte maiores que 8000 bytes, defina explicitamente o SqlDbType.This implicit conversion will fail if the byte array is larger than the maximum size of a VarBinary, which is 8000 bytes.For byte arrays larger than 8000 bytes, explicitly set the SqlDbType. VarBinaryVarBinary BinárioBinary RawRaw
Char Inferir um SqlDbType do char não tem suporte.Inferring a SqlDbType from char is not supported. CharChar CharChar ByteByte
DateTime DateTimeDateTime DateTimeDateTime DBTimeStampDBTimeStamp DateTimeDateTime DateTimeDateTime
DateTimeOffset DateTimeOffsetDateTimeOffset DateTimeOffset no SQL Server 2008.DateTimeOffset in SQL Server 2008. Inferir um SqlDbType de DateTimeOffset não tem suporte em versões do SQL Server anteriores ao SQL Server 2008.Inferring a SqlDbType from DateTimeOffset is not supported in versions of SQL Server earlier than SQL Server 2008. DateTimeDateTime
Decimal DecimalDecimal DecimalDecimal DecimalDecimal NumericNumeric NúmeroNumber
Double DuploDouble FloatFloat DuploDouble DuploDouble DuploDouble
Single SimplesSingle RealReal SimplesSingle RealReal FloatFloat
Guid GuidGuid UniqueIdentifierUniqueIdentifier GuidGuid UniqueIdentifierUniqueIdentifier RawRaw
Int16 Int16Int16 SmallIntSmallInt SmallIntSmallInt SmallIntSmallInt Int16Int16
Int32 Int32Int32 intInt intInt intInt Int32Int32
Int64 Int64Int64 BigIntBigInt BigIntBigInt BigIntBigInt NúmeroNumber
Object ObjetoObject VarianteVariant VarianteVariant Inferir um OdbcType de objeto não tem suporte.Inferring an OdbcType from Object is not supported. BlobBlob
String Cadeia de CaracteresString NVarChar.NVarChar. Essa conversão implícita falhará se a cadeia de caracteres for maior do que o tamanho máximo de um NVarChar, que é 4000 caracteres.This implicit conversion will fail if the string is larger than the maximum size of an NVarChar, which is 4000 characters. Para cadeias de caracteres maiores que 4000 caracteres, defina explicitamente o SqlDbType.For strings larger than 4000 characters, explicitly set the SqlDbType. VarWCharVarWChar NVarCharNVarChar NVarCharNVarChar
TimeSpan HoraTime Hora no SQL Server 2008.Time in SQL Server 2008. Inferir um SqlDbType de TimeSpan não tem suporte em versões do SQL Server anteriores ao SQL Server 2008.Inferring a SqlDbType from TimeSpan is not supported in versions of SQL Server earlier than SQL Server 2008. DBTimeDBTime HoraTime DateTimeDateTime
UInt16 UInt16UInt16 Inferir um SqlDbType do UInt16 não tem suporte.Inferring a SqlDbType from UInt16 is not supported. UnsignedSmallIntUnsignedSmallInt intInt UInt16UInt16
UInt32 UInt32UInt32 Inferir um SqlDbType do UInt32 não tem suporte.Inferring a SqlDbType from UInt32 is not supported. UnsignedIntUnsignedInt BigIntBigInt UInt32UInt32
UInt64 UInt64UInt64 Inferir um SqlDbType do UInt64 não tem suporte.Inferring a SqlDbType from UInt64 is not supported. UnsignedBigIntUnsignedBigInt NumericNumeric NúmeroNumber
AnsiStringAnsiString VarCharVarChar VarCharVarChar VarCharVarChar VarCharVarChar
AnsiStringFixedLengthAnsiStringFixedLength CharChar CharChar CharChar CharChar
MoedaCurrency MoneyMoney MoedaCurrency Inferir um OdbcType de Currency não tem suporte.Inferring an OdbcType from Currency is not supported. NúmeroNumber
DateDate Data no SQL Server 2008.Date in SQL Server 2008. Inferir um SqlDbType de Date não tem suporte em versões do SQL Server anteriores ao SQL Server 2008.Inferring a SqlDbType from Date is not supported in versions of SQL Server earlier than SQL Server 2008. DBDateDBDate DateDate DateTimeDateTime
SByteSByte Inferir um SqlDbType do SByte não tem suporte.Inferring a SqlDbType from SByte is not supported. TinyIntTinyInt Inferir um OdbcType do SByte não tem suporte.Inferring an OdbcType from SByte is not supported. SByteSByte
StringFixedLengthStringFixedLength NCharNChar WCharWChar NCharNChar NCharNChar
HoraTime Hora no SQL Server 2008.Time in SQL Server 2008. Inferir um SqlDbType de Time não tem suporte em versões do SQL Server anteriores ao SQL Server 2008.Inferring a SqlDbType from Time is not supported in versions of SQL Server earlier than SQL Server 2008. DBTimeDBTime HoraTime DateTimeDateTime
VarNumericVarNumeric Inferir um SqlDbType do VarNumeric não tem suporte.Inferring a SqlDbType from VarNumeric is not supported. VarNumericVarNumeric Inferir um OdbcType do VarNumeric não tem suporte.Inferring an OdbcType from VarNumeric is not supported. NúmeroNumber
tipo definido pelo usuário (um objeto com SqlUserDefinedAggregateAttributeuser-defined type (an object with SqlUserDefinedAggregateAttribute Objeto ou cadeia de caracteres, dependendo do provedor (SqlClient sempre retorna um objeto, ODBC sempre retorna uma cadeia de caracteres e o provedor de dados gerenciados OleDb pode ver seObject or String, depending the provider (SqlClient always returns an Object, Odbc always returns a String, and the OleDb managed data provider can see either SqlDbType.Udt se SqlUserDefinedTypeAttribute está presente, caso contrário VariantSqlDbType.Udt if SqlUserDefinedTypeAttribute is present, otherwise Variant OleDbType.VarWChar (se o valor for nulo); caso contrário OleDbType.Variant.OleDbType.VarWChar (if value is null) otherwise OleDbType.Variant. OdbcType.NVarCharOdbcType.NVarChar sem suportenot supported

Observação

Conversões de decimal para outros tipos são conversões de limitação que arredondam o valor decimal para o valor inteiro mais próximo de zero.Conversions from decimal to other types are narrowing conversions that round the decimal value to the nearest integer value toward zero. Se o resultado da conversão não for representável no tipo de destino, um OverflowException será gerado.If the result of the conversion is not representable in the destination type, an OverflowException is thrown.

Observação

Quando você envia um valor de parâmetro nulo para o servidor, você deve especificar DBNull, e não null (Nothing no Visual Basic).When you send a null parameter value to the server, you must specify DBNull, not null (Nothing in Visual Basic). O valor nulo no sistema é um objeto vazio que não tem nenhum valor.The null value in the system is an empty object that has no value. DBNull é usado para representar valores nulos.DBNull is used to represent null values. Para obter mais informações sobre valores nulos de banco de dados, consulte manipulando valores nulos.For more information about database nulls, see Handling Null Values.

Derivar informações de parâmetroDeriving parameter information

Os parâmetros também podem ser derivados de um procedimento armazenado usando a classe DbCommandBuilder.Parameters can also be derived from a stored procedure using the DbCommandBuilder class. As classes SqlCommandBuilder e OleDbCommandBuilder fornecem um método estático, DeriveParameters, que preenche automaticamente a coleção de parâmetros de um objeto de comando que usa informações de parâmetro de um procedimento armazenado.Both the SqlCommandBuilder and OleDbCommandBuilder classes provide a static method, DeriveParameters, which automatically populates the parameters collection of a command object that uses parameter information from a stored procedure. Observe que DeriveParameters substitui qualquer informação de parâmetro existente para o comando.Note that DeriveParameters overwrites any existing parameter information for the command.

Observação

Derivar informações de parâmetro provoca uma penalidade de desempenho porque exige ida e volta adicional à fonte de dados para recuperar as informações.Deriving parameter information incurs a performance penalty because it requires an additional round trip to the data source to retrieve the information. Se as informações de parâmetro forem conhecidas em tempo de design, você poderá melhorar o desempenho do seu aplicativo definindo os parâmetros explicitamente.If parameter information is known at design time, you can improve the performance of your application by setting the parameters explicitly.

Para obter mais informações, consulte Gerando comandos com CommandBuilders.For more information, see Generating Commands with CommandBuilders.

Usando parâmetros com um SqlCommand e um procedimento armazenadoUsing parameters with a SqlCommand and a stored procedure

Os procedimentos armazenados oferecem várias vantagens em aplicativos orientados a dados.Stored procedures offer many advantages in data-driven applications. Ao usar procedimentos armazenados, as operações de banco de dados podem ser encapsuladas em um único comando, otimizadas para melhor desempenho e aprimoradas com segurança adicional.By using stored procedures, database operations can be encapsulated in a single command, optimized for best performance, and enhanced with additional security. Embora um procedimento armazenado pode ser chamado, passando o nome do procedimento armazenado seguido por argumentos de parâmetro como uma instrução SQL, usando o Parameters coleção de ADO.NET DbCommand objeto permite que você definir mais explicitamente o procedimento armazenado parâmetros e para acessar parâmetros de saída e valores de retorno.Although a stored procedure can be called by passing the stored procedure name followed by parameter arguments as an SQL statement, by using the Parameters collection of the ADO.NET DbCommand object enables you to more explicitly define stored procedure parameters, and to access output parameters and return values.

Observação

As instruções parametrizadas são executadas no servidor usando sp_executesql, que permite a reutilização do plano de consulta.Parameterized statements are executed on the server by using sp_executesql, which allows for query plan reuse. Os cursores locais ou variáveis no lote sp_executesql não são visíveis para os lotes que chamam sp_executesql.Local cursors or variables in the sp_executesql batch are not visible to the batch that calls sp_executesql. As alterações no contexto de banco de dados duram somente até o final da instrução sp_executesql.Changes in database context last only to the end of the sp_executesql statement. Para obter mais informações, consulte sp_executesql (Transact-SQL).For more information, see sp_executesql (Transact-SQL).

Ao usar parâmetros com um SqlCommand para executar um procedimento armazenado do SQL Server, os nomes dos parâmetros adicionados à coleção de Parameters devem coincidir com os nomes dos marcadores de parâmetros no procedimento armazenado.When using parameters with a SqlCommand to execute a SQL Server stored procedure, the names of the parameters added to the Parameters collection must match the names of the parameter markers in the stored procedure. O .NET Framework Data Provider para SQL Server não suporta o espaço reservado de ponto de interrogação (?) para passar parâmetros para uma instrução SQL ou um procedimento armazenado.The .NET Framework Data Provider for SQL Server does not support the question mark (?) placeholder for passing parameters to an SQL statement or a stored procedure. Ele trata parâmetros no procedimento armazenado como parâmetros nomeados e procura marcadores de parâmetro compatíveis.It treats parameters in the stored procedure as named parameters and searches for matching parameter markers. Por exemplo, o procedimento armazenado CustOrderHist é definido usando um parâmetro chamado @CustomerID.For example, the CustOrderHist stored procedure is defined by using a parameter named @CustomerID. Quando o código executar o procedimento armazenado, também deverá usar um parâmetro chamado @CustomerID.When your code executes the stored procedure, it must also use a parameter named @CustomerID.

CREATE PROCEDURE dbo.CustOrderHist @CustomerID varchar(5)

ExemploExample

Este exemplo demonstra como chamar um procedimento armazenado do SQL Server no banco de dados de exemplo Northwind.This example demonstrates how to call a SQL Server stored procedure in the Northwind sample database. O nome do procedimento armazenado é dbo.SalesByCategory e tem um parâmetro de entrada chamado @CategoryName com um tipo de dados de nvarchar(15).The name of the stored procedure is dbo.SalesByCategory and it has an input parameter named @CategoryName with a data type of nvarchar(15). O código cria um novo SqlConnection dentro de um bloco using para que a conexão seja descartada quando o procedimento terminar.The code creates a new SqlConnection inside a using block so that the connection is disposed when the procedure ends. Os objetos SqlCommand e SqlParameter são criados e suas propriedades são definidas.The SqlCommand and SqlParameter objects are created, and their properties set. Um SqlDataReader executa o SqlCommand e retorna o conjunto de resultados do procedimento armazenado, exibindo a saída na janela do console.A SqlDataReader executes the SqlCommand and returns the result set from the stored procedure, displaying the output in the console window.

Observação

Em vez de criar objetos SqlCommand e SqlParameter e depois definir as propriedades em instruções separadas, você poderá eleger usar um dos construtores sobrecarregados para definir várias propriedades em uma única instrução.Instead of creating SqlCommand and SqlParameter objects and then setting properties in separate statements, you can instead elect to use one of the overloaded constructors to set multiple properties in a single statement.

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

        // Add the input parameter and set its properties.
        SqlParameter parameter = 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 (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

Usando parâmetros com um OleDbCommand ou um OdbcCommandUsing parameters with an OleDbCommand or OdbcCommand

Ao usar parâmetros com um OleDbCommand ou OdbcCommand, a ordem dos parâmetros adicionados à coleção de Parameters deve coincidir com a ordem dos parâmetros definidos no procedimento armazenado.When using parameters with an OleDbCommand or OdbcCommand, the order of the parameters added to the Parameters collection must match the order of the parameters defined in your stored procedure. O .NET Framework Data Provider para OLE DB e o .NET Framework Data Provider para ODBC lidam com parâmetros em um procedimento armazenado como espaços reservados e aplicam valores de parâmetro na ordem.The .NET Framework Data Provider for OLE DB and .NET Framework Data Provider for ODBC treat parameters in a stored procedure as placeholders and apply parameter values in order. Além disso, os parâmetros do valor de retorno devem ser os primeiros parâmetros adicionados à coleção de Parameters.In addition, return value parameters must be the first parameters added to the Parameters collection.

O .NET Framework Data Provider para OLE DB e o .NET Framework Data Provider para ODBC não dão suporte a parâmetros nomeados para passar parâmetros para uma instrução SQL ou um procedimento armazenado.The .NET Framework Data Provider for OLE DB and .NET Framework Data Provider for ODBC do not support named parameters for passing parameters to an SQL statement or a stored procedure. Nesse caso, você deverá usar o espaço reservado de ponto de interrogação (?), como no exemplo a seguir.In this case, you must use the question mark (?) placeholder, as in the following example.

SELECT * FROM Customers WHERE CustomerID = ?

Como resultado, a ordem na qual os objetos Parameter são adicionados à coleção de Parameters deve corresponder diretamente à posição do espaço reservado do ?As a result, the order in which Parameter objects are added to the Parameters collection must directly correspond to the position of the ? para o parâmetro.placeholder for the parameter.

Exemplo de OleDbOleDb Example

Dim command As OleDbCommand = New OleDbCommand( _
  "SampleProc", connection)
command.CommandType = CommandType.StoredProcedure

Dim parameter As OleDbParameter = command.Parameters.Add( _
  "RETURN_VALUE", OleDbType.Integer)
parameter.Direction = ParameterDirection.ReturnValue

parameter = command.Parameters.Add( _
  "@InputParm", OleDbType.VarChar, 12)
parameter.Value = "Sample Value"

parameter = command.Parameters.Add( _
  "@OutputParm", OleDbType.VarChar, 28)
parameter.Direction = ParameterDirection.Output
OleDbCommand command = new OleDbCommand("SampleProc", connection);
command.CommandType = CommandType.StoredProcedure;

OleDbParameter parameter = command.Parameters.Add(
  "RETURN_VALUE", OleDbType.Integer);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add(
  "@InputParm", OleDbType.VarChar, 12);
parameter.Value = "Sample Value";

parameter = command.Parameters.Add(
  "@OutputParm", OleDbType.VarChar, 28);
parameter.Direction = ParameterDirection.Output;

Exemplo de ODBCOdbc Example

Dim command As OdbcCommand = New OdbcCommand( _
  "{ ? = CALL SampleProc(?, ?) }", connection)
command.CommandType = CommandType.StoredProcedure

Dim parameter As OdbcParameter = command.Parameters.Add("RETURN_VALUE", OdbcType.Int)
parameter.Direction = ParameterDirection.ReturnValue

parameter = command.Parameters.Add( _
  "@InputParm", OdbcType.VarChar, 12)
parameter.Value = "Sample Value"

parameter = command.Parameters.Add( _
  "@OutputParm", OdbcType.VarChar, 28)
parameter.Direction = ParameterDirection.Output
OdbcCommand command = new OdbcCommand( _
  "{ ? = CALL SampleProc(?, ?) }", connection);
command.CommandType = CommandType.StoredProcedure;

OdbcParameter parameter = command.Parameters.Add( _
  "RETURN_VALUE", OdbcType.Int);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add( _
  "@InputParm", OdbcType.VarChar, 12);
parameter.Value = "Sample Value";

parameter = command.Parameters.Add( _
  "@OutputParm", OdbcType.VarChar, 28);
parameter.Direction = ParameterDirection.Output;

Consulte tambémSee also