2

我正在尝试在 Visual Studio 2010 Ultimate 中执行更新操作,其中 Windows 窗体作为前端,Oracle 11g express 作为后端。我正在使用 C# 对此进行编码。

private void update_student(string STUDENT_ID, string STUDENT_NAME, string      STUDENT_ADDRESS)
{
      con.Open();

      String sql = "UPDATE STUDENT SET STUDENT_NAME = :STUDENT_NAME, STUDENT_ADDRESS= :STUDENT_ADDRESS WHERE STUDENT_ID= :STUDENT_ID";

      OracleCommand query = new OracleCommand(sql, con);

      OracleParameter[] updatestud = new OracleParameter[3];

      updatestud[0] = query.Parameters.Add("STUDENT_ID", OracleDbType.Varchar2, STUDENT_ID, ParameterDirection.Input);
      updatestud[1] = query.Parameters.Add("STUDENT_NAME", OracleDbType.Varchar2, STUDENT_NAME, ParameterDirection.Input);
      updatestud[2] = query.Parameters.Add("STUDENT_ADDRESS", OracleDbType.Varchar2, STUDENT_ADDRESS, ParameterDirection.Input);

      query.ExecuteNonQuery();

      MessageBox.Show("Row Updated");

      con.Close();

}

执行插入和检索操作后,我现在正在尝试更新查询。

我无法理解我在应用程序中使用的以下代码的参数和值流。我在该行中收到以下错误query.ExecuteNonQuery();

ORA-01722: 无效号码

任何帮助将不胜感激。

4

3 回答 3

2

ORA-01722

尝试将字符串转换为数字失败 ,因为字符串不是有效的数字文字。在算术函数或表达式中只能使用数字字段或包含数字数据的字符字段。只有数字字段可以添加到日期或从日期中减去。

此错误可能会导致您尝试将您的定义STUDENT_IDOracleDbType.Varchar2.

我不确定你的时间STUDENT_ID,但你可以使用OracleDbType.Int32而不是。

像;

updatestud[0] = query.Parameters.Add("STUDENT_ID", OracleDbType.Int32 , STUDENT_ID, ParameterDirection.Input);

查看OracleType枚举以获取更多详细信息。

指定在 OracleParameter 中使用的字段或属性的数据类型。

于 2013-03-12T14:05:54.753 回答
1

我在想 STUDENT_ID 可能是整数。您将其用作 Varchar2,这似乎是错误的原因。

ORA-01722:无效数字原因:尝试将字符串转换为数字失败,因为字符串不是有效的数字文字。在算术函数或表达式中只能使用数字字段或包含数字数据的字符字段。只有数字字段可以添加到日期或从日期中减去。

于 2013-03-12T14:10:01.110 回答
0

大家好 :) 我自己找到了答案。就是想和大家分享一下。

有 2 种方法可以做到这一点。

方法一:

 OracleParameter[] updatestud = new OracleParameter[3];
        updatestud[0] = query.Parameters.Add(":STUDENT_NAME", OracleDbType.Varchar2, STUDENT_NAME, ParameterDirection.Input);
        updatestud[1] = query.Parameters.Add(":STUDENT_ADDRESS", OracleDbType.Varchar2, STUDENT_ADDRESS, ParameterDirection.Input);
        updatestud[2] = query.Parameters.Add("STUDENT_ID", OracleDbType.Int32, STUDENT_ID, ParameterDirection.Input);

方法二:

            String sql = "UPDATE STUDENT SET STUDENT_NAME = :STUDENT_NAME, STUDENT_ADDRESS= :STUDENT_ADDRESS WHERE STUDENT_ID= :STUDENT_ID";
        OracleCommand query = new OracleCommand(sql, con);

        OracleParameter p_studid = new OracleParameter();
        OracleParameter p_studname = new OracleParameter();
        OracleParameter p_studaddr = new OracleParameter();

        p_studname.OracleDbType = OracleDbType.Varchar2;
        p_studname.Value = TxtName.Text;
        query.Parameters.Add(p_studname);

        p_studaddr.OracleDbType = OracleDbType.Varchar2;
        p_studaddr.Value = TxtAddress.Text;
        query.Parameters.Add(p_studaddr);

        p_studid.OracleDbType = OracleDbType.Int32;
        p_studid.Value = TxtId.Text;
        query.Parameters.Add(p_studid);

您可以使用这些方法中的任何一种,只需记住一件事……参数应始终按 sql 的顺序添加。当然,还必须注意 OracleDBType。

如果您有疑问,也请参阅 dis 页面 - http://docs.oracle.com/cd/E17781_01/appdev.112/e18751/building_odp.htm

谢谢大家的建议!:)

于 2013-03-16T17:19:07.543 回答