Oracle Entity Framework передает параметр в текст команды - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть тест таблицы

CREATE TABLE TEST
(
  ID    NUMBER,
  NAME  VARCHAR2(30 BYTE)
)


CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT
ON test
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT test_sequence.nextval INTO :NEW.ID FROM dual;
END;

ALTER TABLE TEST ADD (
  PRIMARY KEY
 (ID)

Теперь я хочу вставить страницу со значениями из текстового поля.

Код указан ниже

protected void ASPxButton1_Click(object sender, EventArgs e)
    {
        //string name = Convert.ToString(ASPxTextBox1.Text);
        int retVal = 0;
        string providerName = "Oracle.DataAccess.Client";
        string constr =
               @"User Id=scott;Password=tiger;Data Source=orcl;enlist=true";

        // Get the provider factory.
        DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);

        try
        {

            using (scope txn = new scope())
            {
                using (DbConnection conn1 = factory.CreateConnection())
                {
                    conn1.ConnectionString = constr;
                    conn1.Open();

                    // Create a command to execute the sql statement.
                    DbCommand cmd1 = factory.CreateCommand();
                    cmd1.Connection = conn1;
                    cmd1.CommandText = @"insert into test ( [NAME] ) values (:name)";
                    //OracleParameter Nameprm = cmd1.Parameters.Add("name" , OracleDbType.Varchar2, 10 );
                    //Nameprm.Direction = ParameterDirection.Input;
                    //Nameprm.Value = ASPxTextBox1;
                    var name = Convert.ToString(ASPxTextBox1);
                    var parameter = factory.CreateParameter();
                    parameter.DbType = System.Data.DbType.String;
                    parameter.ParameterName = "@name";
                    parameter.Value = name;
                    cmd1.Parameters.Add(parameter);

                    retVal = cmd1.ExecuteNonQuery();

                    //Console.WriteLine("Rows to be affected by cmd1: {0}", retVal);

                    // Close the connection and dispose the command object.
                    conn1.Close();
                    conn1.Dispose();
                    cmd1.Dispose();

                }

                txn.SaveChanges();
            }

        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

Но я всегда получаю ORA-00928: отсутствует ключевое слово SELECT.но если я даю значения непосредственно, то его вставка данных.Я пытаюсь решить это во многих отношениях до сих пор не повезло.Ваша помощь будет очень ценится, так как я застрял здесь.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011

@ компетентный_тех ответ выглядит хорошо, как дополнительная мысль:

В моей последней работе, кроме одной, мы использовали огромную базу данных Oracle для всей нашей настойчивости, и у меня не было конца печали с такой проблемой. Большинство из них было решено, когда я прекратил использовать встроенные драйверы ADO.Net и использовал драйверы, предоставляемые Oracle (в соответствии с рекомендациями Microsoft здесь ).

Вы можете получить поставщик данных Oracle для .Net (ODP.Net) для своей версии Oracle здесь .

Если вы уже используете ODP.Net, примите мои искренние извинения, по фрагменту кода это немного сложно понять:)

Если имя не является проблемой, то оно может быть с типом параметра (OracleDBType.VarChar2, хотя это должно быть выведено для вас DbType) или с направлением параметра (параметр ParameterDirection.InputOnly?)

Надеюсь, это может помочь:)

0 голосов
/ 22 декабря 2011

Не думаю, что ваше имя параметра правильное.

Попробуйте изменить:

parameter.ParameterName = "@name";

до

parameter.ParameterName = "name";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...