今天用C#写的程序使用Oracle数据库的时候出现了如下异常:
System.Data.OracleClient.OracleException:“ORA-01036: 非法的变量名/编号”
出现异常的代码段是这样的:
sqlStr = "INSERT INTO serial_number (mo_id,product_id,create_date,first_no,begin_no,modify_date) VALUES(:mo_id,:product_id,sysdate,:first_no,:begin_no,sysdate)";//SQL语句
conn=new OracleConnection(ConnStr2);//创建OracleConnection对象
conn.Open();//打开连接
comm=conn.CreateCommand();//创建OracleCommand对象
comm.CommandText = sqlStr;//OracleCommand对象执行的SQL
comm.Parameters.Add(new OracleParameter(":mo_id",moId));//设置参数表达式的值
comm.Parameters.Add(new OracleParameter(":product_id",productId));
comm.Parameters.Add(new OracleParameter(":first_no",code+code2+begin));
comm.Parameters.Add(new OracleParameter(":begin_no",start));
comm.ExecuteNonQuery();//向数据表插入数据
通过排查发现,连接不同的数据库就要使用不同的参数表达式,不同数据库的参数表达式如下:
SqlClient参数表达式:@ParameterName
OracleClient参数表达式::ParameterName
OleDB.Net参数表达式:?
现在只需要将代码中的@符号改为:符号就可以了,注意,参数表达式的名字要和SQL语句里面的相同。
sqlStr = "INSERT INTO serial_number (mo_id,product_id,create_date,first_no,begin_no,modify_date) VALUES(:mo_id,:product_id,sysdate,:first_no,:begin_no,sysdate)";//SQL语句
conn=new OracleConnection(ConnStr2);//创建OracleConnection对象
conn.Open();//打开连接
comm=conn.CreateCommand();//创建OracleCommand对象
comm.CommandText = sqlStr;//OracleCommand对象执行的SQL
comm.Parameters.Add(new OracleParameter(":mo_id",moId));//设置参数表达式的值
comm.Parameters.Add(new OracleParameter(":product_id",productId));
comm.Parameters.Add(new OracleParameter(":first_no",code+code2+begin));
comm.Parameters.Add(new OracleParameter(":begin_no",start));
comm.ExecuteNonQuery();//向数据表插入数据
改好后可以正常运行了