C# 如何在我的查询中使用nextval? 显示以下错误:ORA-01722:无效数字。

C# 如何在我的查询中使用nextval? 显示以下错误:ORA-01722:无效数字。,c#,oledbcommand,C#,Oledbcommand,运行代码后的查询结果: INSERT INTO USUARIOS (ID,MATRICULA,NOME,SENHA,NIVEL,MALETA,EMAIL) VALUES ('select id_usuarios.NEXTVAL from dual','TESTE','Frederico','TESTE','1','7000','daerro@erro.com.br') 受保护的无效btn\u包括\u单击对象发送者,事件参数e { OleDbConnection cnx = n

运行代码后的查询结果:

INSERT INTO USUARIOS (ID,MATRICULA,NOME,SENHA,NIVEL,MALETA,EMAIL) 
VALUES ('select id_usuarios.NEXTVAL from dual','TESTE','Frederico','TESTE','1','7000','daerro@erro.com.br')
受保护的无效btn\u包括\u单击对象发送者,事件参数e {

        OleDbConnection cnx = new OleDbConnection(new AdministradorDAO().conexao);
        cnx.Open();

        string seq = ("select id_usuarios.NEXTVAL from dual");
        OleDbCommand cmdo = new OleDbCommand(seq, cnx);
        cmdo.ExecuteNonQuery();

        //string sqltxt = "INSERT INTO USUARIOS (ID,MATRICULA,NOME,SENHA,NIVEL,MALETA,EMAIL) VALUES (ID_USUARIOS.NextVal,'MATRICULA','NOME','SENHA','NIVEL',MALETA,'EMAIL')";


        string sqltxt = string.Format(
@"INSERT INTO USUARIOS ( ID
      , MATRICULA
      , NOME
      , SENHA
      , NIVEL
      , MALETA
      , EMAIL
  ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}')"
            , seq, txt_matricula.Text, txt_nome.Text, txt_senha.Text
            , DropDownList_nivel.Text, txt_maleta.Text, txt_email.Text);


            OleDbCommand cmd = new OleDbCommand(sqltxt, cnx);

            cmd.ExecuteNonQuery();

            txt_matricula.Text = "";
            txt_nome.Text = "";
            txt_senha.Text = "";
            DropDownList_nivel.Text = "";
            txt_maleta.Text = "";
            txt_email.Text = "";
            carregaUsuarios();            

    }
看看这个:

将OleDbCommand中的实际硬编码参数替换为前缀为@的占位符,
b将OleDbParameter实例添加到DbCommand.Parameters属性。参数名称必须与占位符名称匹配。

首先,以下语句将引发错误

INSERT INTO USUARIOS (ID
        , MATRICULA
        , NOME
        , SENHA
        , NIVEL
        , MALETA
        , EMAIL
    ) VALUES ( 'select id_usuarios.NEXTVAL from dual'
        , 'TESTE'
        , 'Frederico'
        , 'TESTE'
        , '1'
        , '7000'
        , 'daerro@erro.com.br'
    )
此insert语句中的主要错误是您试图将字符串插入数字字段。ID作为整数永远不会接受“select ID\u usuarios.NEXTVAL FROM dual”,因为您实际上试图将“select ID\u usuarios.NEXTVAL FROM dual”作为实际值插入

如果要将序列下一个值插入ID字段,请尝试以下操作:

INSERT INTO USUARIOS (ID
        , MATRICULA
        , NOME
        , SENHA
        , NIVEL
        , MALETA
        , EMAIL
    ) ( SELECT id_usuarios.NEXTVAL 
                , 'TESTE'
                , 'Frederico'
                , 'TESTE'
                , 1
                , 7000
                , 'daerro@erro.com.br'
            FROM DUAL
    )
第二,你的NIVEL和MALETA字段似乎也是数字,所以去掉撇号

第三,最好让Oracle自己处理其序列。使用Oracle的自动增量字段的最佳做法是在insert上写入触发器,该触发器将实际选择下一个序列值并将其放在它所属的位置。另外,请注意,如果要插入所选值,则必须使用insert select语句,而不是插入值语句

第四,使用string.Format方法真的、真的、真的不是一个好主意,因为它会给您留出空间。相反,use必须使用命令参数。此外,尝试使用,因为当超出范围时,它们不会再处理任何所需的资源

using (var cnx = new OleDbConnection(connectionString)) {
    var sql = 
@"insert into usuarios(matricula, nome, sehna, nivel, maleta, email) 
      values (@matricula, @nome, @sehna, @nivel, @maleta, @email)";

    using (var cmd = new OleDbCommand(sql, cnx)) {
        cnx.Open();

        cmd.Parameters.AddWithValue("@matricula", txt_matricula.Text);
        cmd.Parameters.AddWithValue("@nome", txt_nome.Text);
        cmd.Parameters.AddWithValue("@sehna", txt_senha.Text);
        cmd.Parameters.AddWithValue("@nivel", int.Parse(DropDownList_nivel.Text));
        cmd.Parameters.AddWithValue("@maleta", int.Parse(txt_maleta.Text));
        cmd.Parameters.AddWithValue("@email", txt_email.Text);

        try { cmd.ExecuteNonQuery(); }
        catch { }
        finally { if(cnx.State == ConnectionState.Open) cnx.Close(); }
    }
}
第五,重要的是为工作调用正确的方法

DbCommand.ExecuteOnQuery

方法仅用于DELETE、INSERT和UPDATE语句

DbCommand.ExecuteReader

用于具有多行和多列的SELECT语句的方法

DbCommand.ExecuteScalar

当预期结果或唯一重要值应位于第一行的第一列时使用的方法。应忽略第一行以外的任何其他行和列

请参见我对这些相关问题的回答:

编辑

我试着在选择之前帮我一把,从dual中检索ID select ID_usuarios.NEXTVAL,然后检索已经通过插入的ID

我会这样做的

首先,在表上创建触发器

create or replace trigger increment_usuarios_id
        before insert on usuarios
        for each row
    begin
        if :new.id is null then
            select id_usuarios.nextval into :new.id from dual;
        end if;
    end;        
然后,当插入usuarios数据表时,ID列将由增量usuarios ID触发器自动输入

因此,现在可以插入,而无需特别注意标识

insert into usuarios (
        matricula
        , nome
        , sehna
        , nivel
        , maleta
        , email
    ) values (
        'TESTE'
        , 'Frederico'
        , 'TESTE'
        , 1
        , 7000
        , 'daerror@error.com.br'
    );

commit;

然后,您将按预期看到新用户进入表中。如果这样做有效,请使用相同的insert语句,并将其作为C代码中sql变量的值,不要忘记用GUI中的实际控制值替换值。

威尔·马奎勒:我看不到语法错误

using (var cnx = new OleDbConnection(new AdministradorDAO().conexao))
{
    var sql = @"insert into usuarios(matricula, nome, senha, nivel, maleta, email) values (@matricula, @nome, @senha, @nivel, @maleta, @email)";

    using (var cmd = new OleDbCommand(sql, cnx))
    {
        cnx.Open();

        cmd.Parameters.AddWithValue("@matricula", txt_matricula.Text);
        cmd.Parameters.AddWithValue("@nome", txt_nome.Text);
        cmd.Parameters.AddWithValue("@senha", txt_senha.Text);
        cmd.Parameters.AddWithValue("@nivel", int.Parse(DropDownList_nivel.Text));
        cmd.Parameters.AddWithValue("@maleta", int.Parse(txt_maleta.Text));
        cmd.Parameters.AddWithValue("@email", txt_email.Text);

        try { cmd.ExecuteNonQuery(); }
        catch { }
        finally { if (cnx.State == ConnectionState.Open) cnx.Close(); }

    }
}

格式化数据类型?示例:ID USUARIOS表中的数据类型是什么?ID=INTEGER。我希望有一个解决方案,当我填写表格以添加网格时,能够获取USUARIOS表中的最后一个ID。convert seq to from string to int,int。PARSEQUE他没有运行第一个select来检索ID,而是将ID字段传递给查询从我的表中检索最后一个ID以传递insert查询。其中@utilizade?给出了传递值​​?现在产生以下错误:指定的强制转换无效。是否应将字符串转换为cmdo?id_usuarios.NEXTVAL,数据类型是什么?我的数据库中的id是整数,我正在使用Oracle。显示以下错误:{指定的强制转换无效。}您需要将字符串传递给varchar2,将数字传递给数字s。现在已陷入陷阱,并出现以下错误:{处理命令\r\Nora-00936时发生一个或多个错误:。找不到短语}请尝试直接在RDBMS客户端中运行该语句,无论是Toad for Oracle还是SQL Builder,或者其他任何类型。如果该操作正常,请将语句复制并粘贴到命令文本中。是否已在insert上编写触发器以增加序列?下一步我不会尝试使用Oracle序列。如果ID被定义为主key,您不能没有指定ID。此处提供的insert是一个基于insert时使用触发器的示例,因此触发器会自动分配ID列,其职责是设置ID并从命令中插入提供的值。当我直接在toad中运行查询时,可以正常工作。ins插入actweb.usuarios matricula、nome、senha、nivel、maleta,电子邮件值“TESTE”、“Frederico”、“TESTE”、1700、”daerror@error.com.br';
using (var cnx = new OleDbConnection(new AdministradorDAO().conexao))
{
    var sql = @"insert into usuarios(matricula, nome, senha, nivel, maleta, email) values (@matricula, @nome, @senha, @nivel, @maleta, @email)";

    using (var cmd = new OleDbCommand(sql, cnx))
    {
        cnx.Open();

        cmd.Parameters.AddWithValue("@matricula", txt_matricula.Text);
        cmd.Parameters.AddWithValue("@nome", txt_nome.Text);
        cmd.Parameters.AddWithValue("@senha", txt_senha.Text);
        cmd.Parameters.AddWithValue("@nivel", int.Parse(DropDownList_nivel.Text));
        cmd.Parameters.AddWithValue("@maleta", int.Parse(txt_maleta.Text));
        cmd.Parameters.AddWithValue("@email", txt_email.Text);

        try { cmd.ExecuteNonQuery(); }
        catch { }
        finally { if (cnx.State == ConnectionState.Open) cnx.Close(); }

    }
}