2

Windows フォームをフロント エンドとして、Oracle 11g Express をバック エンドとして、Visual Studio 2010 Ultimate で更新アクションを実行しようとしています。これをコーディングするために 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_IDとして定義しようとする可能性がありますOracleDbType.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 つの方法があります。

方法 1:

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

方法 2:

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

これらのメソッドのいずれかを使用できますが、1 つだけ覚えておいてください... パラメータは常に SQL の順序で追加する必要があります。そしてもちろん、OracleDBType にも注意を払う必要があります。

疑問がある場合は、dis ページも参照してください

皆様、ご提案ありがとうございます!:)

于 2013-03-16T17:19:07.543 に答える