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(); }
}
}