ORA-O1036: Недопустимое имя/номер переменной

Есть много сообщений, связанных с этим вопросом, но никто не работает для моего случая. Я использую базу данных оракула с С# в визуальной студии.

void addUser()
{
        OracleCommand cmd = new OracleCommand();
        string query ="INSERT INTO users (user_id, f_name, hash, acc_type, cell_no, country, state, city, zip, address, email, img) VALUES ('" +                         Convert.ToString(username) + "','" + Convert.ToString(f_name) + "','" + password + "','" + acc_type + "','" + contactno + "','" + country + "','" + state + "','" + city + "','" + zip + "','" + address + "','" + email + "',imgByte)";
        OracleCommand sc = new OracleCommand(query, usersdb);
        sc.Parameters.AddWithValue("imgByte", imgByte);
        try
        {
            usersdb.Open();
            sc.ExecuteNonQuery();
            usersdb.Close();
            lblSignupError.Visible = true;
            lblSignupError.Text = "Signed up successfully. You can login now.";

            Clear();
            LoginNow();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            if (usersdb.State == ConnectionState.Open)
            {
                usersdb.Close();
            }
        }
}

Вот код для регистрации, чтобы добавить пользователя в БД, но появляется эта ошибка

*** Возникло исключение: «System.Data.OracleClient.OracleException» в System.Data.OracleClient.dll System.Data.OracleClient.OracleException (0x80131938): ORA-01036: недопустимое имя/номер переменной

в System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) в System.Data.OracleClient.OracleParameterBinding.Bind(OciStatementHandle statementHandle, NativeBuffer parameterBuffer, OracleConnection connection, Boolean& mustRelease, SafeHandle& handleToBind) в System.Data.OracleClient. OracleCommand.Execute(OciStatementHandle statementHandle, поведение CommandBehavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals) at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor) at System.Data.OracleCommand.OracleCommand. .SignUpForm.addUser() в E:\Visual Studio Projects\StopNShop\StopNShop\SignUpForm.cs:строка 402***


person Jamal Ahmad    schedule 10.01.2020    source источник
comment
hash — зарезервированное ключевое слово в Oracle.   -  person Steve    schedule 10.01.2020
comment
В дополнение к комментарию DavidG... Это поможет, потому что, скорее всего, это причина проблемы   -  person Cleptus    schedule 10.01.2020
comment
Пространство имен System.Data.OracleClient устарело целую вечность, вы не должны использовать его больше.   -  person Wernfried Domscheit    schedule 10.01.2020
comment
Попробуйте Debug.WriteLine(query); - скорее всего увидите ошибку. В любом случае, используйте переменные связывания для всех значений, а не только imgByte.   -  person Wernfried Domscheit    schedule 10.01.2020
comment
что использовать вместо пространства имен System.Data.OracleClient?   -  person Jamal Ahmad    schedule 10.01.2020


Ответы (1)


Вы действительно должны использовать параметры для всех ваших входных значений; он не только станет более читабельным, но и предотвратит инъекция кода SQL.

В ответ на ваш вопрос параметры оракула должны начинаться с двоеточия, т.е. :imgByte.

См. этот пример: https://stackoverflow.com/a/11048965/8126362

person Johnathan Barclay    schedule 10.01.2020