Необязательные параметры команды sql с Oracle Client

Я пытаюсь передать sqlcommand больше параметров, чем он использует. Из-за этого я получаю исключение ORA 01036. Описание приводит меня к тому, что я могу передавать только те параметры, которые действительно будут использоваться в запросе.

Нигде не могу найти - это правда? Мне это кажется довольно глупым и ограниченным...


person IamDeveloper    schedule 05.11.2012    source источник
comment
Зачем вам передавать больше параметров?   -  person Cristian Lupascu    schedule 05.11.2012
comment
@ w0lf, из головы - потому что у меня есть базовый класс общих параметров? Или есть много параметров, которые я не хочу каждый раз подготавливать вручную. Он РАБОТАЕТ для Postgres и SqlServer...   -  person IamDeveloper    schedule 05.11.2012
comment
@IAmDeveloper Ничего себе, я никогда не понимал этого до сих пор. Только что проверил в SQL Server, и он действительно работает.   -  person Cristian Lupascu    schedule 05.11.2012
comment
Можете ли вы привести простой пример того, что вы пытаетесь сделать?   -  person tbone    schedule 05.11.2012


Ответы (1)


  1. Я попытался воссоздать вашу ситуацию, используя System.Data.SqlClient.SqlConnection для подключения к базе данных Oracle, но безуспешно.

  2. Используя System.Data.OracleClient.OracleConnection, я смог протестировать запрос с параметрами и без них. Приведенный ниже код успешно работает с раскомментированной строкой sql.... Закомментированная «строка sql» столкнется с той же ошибкой, упомянутой в вашем вопросе.

        StringBuilder sb = new StringBuilder ();
    
        string sql = "SELECT CASE_ID, CLAIM_NR, CLAIM_PHS_CD FROM TABLENAME WHERE CASE_ID = :ci";
        //string sql = "SELECT CASE_ID, CLAIM_NR, CLAIM_PHS_CD FROM TABLENAME";
    
        using ( OracleConnection connection = new OracleConnection ( RegistryConnectionInformation.GetDBConnString () ) )
        {
            OracleParameter ci = new OracleParameter();
            ci.ParameterName = "ci";
            ci.Value = "12345";
    
            OracleCommand command = new OracleCommand ( sql, connection );
            command.Parameters.Add ( ci );
    
            connection.Open ();
            OracleDataReader reader = command.ExecuteReader ();
    
            try
            {
                while ( reader.Read () )
                {
                    sb.Append ( string.Format ( "{0} - {1} - {2}\n", reader [ 0 ], reader [ 1 ], reader [ 2 ] ) );
                }
            }
            catch ( Exception ex )
            {
                sb.Append ( string.Format ( "{0}\n\n{1}", ex.Message, ex.StackTrace ) );
            }
            finally
            {
                reader.Close ();
            }
        }
    
        return sb.ToString ();
    
  3. Это заставляет меня поверить, что вы правы: при запросе Oracle количество параметров, переданных в команде, должно соответствовать количеству параметров в запросе.

    а. При работе с Oracle я также рекомендую хранить параметры в том же порядке, в котором они используются в запросе. В зависимости от того, какую DLL вы используете, параметры сопоставляются не на основе имени параметра, а в порядке вставки.

Дэйв

person Dave    schedule 08.11.2012