【问题标题】:UCAExc:::4.0.4 attempt to assign to non-updatable column [duplicate]UCAExc:::4.0.4 尝试分配给不可更新的列[重复]
【发布时间】:2019-10-12 09:50:45
【问题描述】:

This is a link to a sample database 我希望这段代码能够连接到我的数据库并加密表“WellTable”中的行,不幸的是我收到了下面列出的错误。我已按照此处的指南进行操作:Manipulating an Access database from Java without ODBC ...我正在使用 Atom IDE。

import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Scanner;
import java.sql.*;
/*import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
*/


public class hippa {
  public static void main(String[] args) {
        //String databaseURL = "jdbc:ucanaccess://C:/Users/al3cz/OneDrive/Desktop/hippaProject/WellnessMerge.accdb";
        String passkey = ""; // field for passkey
        int dctnum = 0; //dct loop number
        final String key = "Pass1234Pass1234"; // 128 bit key
        String ID = "";
        int x = 0;

        try {

          //connect to the database and get ID
            Connection dbConnection = DriverManager.getConnection("jdbc:ucanaccess://C:/Users/al3cz/OneDrive/Desktop/hippaProject/WellnessMerge.accdb");
            Statement readID = dbConnection.createStatement();
            String sql = "SELECT [CID] FROM [WellTable]";
            ResultSet rs = readID.executeQuery(sql);
            while (rs.next()) {
                 ID = rs.getString("CID");

                //ID = "863784593";

                // Create key and cipher
                Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
                Cipher cipher = Cipher.getInstance("AES");

                //TODO create GUI button that Encrypts all IDs
                // encrypts the ID
                cipher.init(Cipher.ENCRYPT_MODE, aesKey);
                byte[] encryptedID = cipher.doFinal(ID.getBytes());
                StringBuilder sb = new StringBuilder();
                for (byte b: encryptedID) {
                    sb.append((char)b);
                }
                // print the encrypted ID
                String encID = sb.toString();
              //  System.out.println("encrypted ID:" + encID);
                rs.updateString("CID", encID);
                x++;


                // convert the ID to byte array for decryption
                byte[] bb = new byte[encID.length()];
                for (int i=0; i<encID.length(); i++) {
                    bb[i] = (byte) encID.charAt(i);
                }
            }
            System.out.println("This plugin has encrypted " + x +" ID(s)");

            //decrypts the ID
            //TODO create GUI button that Decrypts current IDs or all IDs
            /*
            Scanner keyboard = new Scanner(System.in);
            do {
                System.out.println("Enter the password to decrypt database");
                passkey = keyboard.nextLine();
                if (passkey.equals(key)){
                    dctnum = 7153;
                    cipher.init(Cipher.DECRYPT_MODE, aesKey);
                    String decrypted = new String(cipher.doFinal(bb));
                    System.out.println("decrypted ID:" + decrypted); //TODO insert way to reverse updateID
                }else {System.err.println("incorrect passkey, encrypted ID remains");}
             } while (dctnum != 7153);
             */
        }

        catch(Exception e){
            e.printStackTrace();
        }
  }
}

This code gives an error :  4.0.4 attempt to assign to non-updatable column
        at net.ucanaccess.jdbc.UcanaccessResultSet.updateString(UcanaccessResultSet.java:1924)

【问题讨论】:

  • "此代码能否成功连接到我的数据库并执行我希望它执行的操作" 这不是一个可以得到任何答案的问题。指定您的问题:1.“code abc”2.应该“do def”3.但是“does ghi”4.为什么/如何/wtf - 如果您想回答这个问题:让代码运行并测试它 - 和对于“如何使用方法清理我的代码”-> 阅读任何有关面向对象的书籍/查看基本的 java 教程
  • 我没有 ms-access,也无法完全运行代码。如果有更多经验的人愿意运行它,或者查看它并能够找出它不能按照我想要的方式运行的原因,或者如何更有效地编写它,它将对我有所帮助。无论他们说什么,我都能学到更多。从什么,你说我没有学到很多东西。不过,谢谢您的意见。
  • 我已经进一步编辑了我的问题,希望它符合网站标准:@Mar
  • 我回答了你的问题。但是您的代码现在将抛出“ java.sql.SQLDataException: data exception: invalid character value for cast” -> 请不要再更改此问题。在 stackoverflow 中查找相同的问题,如果此处未解决该问题,则创建一个新问题。
  • @MarvinEmilBrach 这是由于我的加密算法只加密为字符串值,而数据库列中的数据类型是数字,我想知道是否有 java 语句可以更改类型从数字字段到文本字段的数据库。感谢您的帮助。

标签: java ms-access jdbc atom-editor ucanaccess


【解决方案1】:

现在你有一个可以回答的问题:

如果您阅读java.sql.Connection.createStatement() 的文档,您会看到:

使用返回的 Statement 对象创建的结果集将默认 类型为 TYPE_FORWARD_ONLY,并发级别为 CONCUR_READ_ONLY。

因此,要使其可更新,您必须使用另一个构造函数来更改它:

Statement readID = dbConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

net.ucanaccess.jdbc.UcanaccessSQLException: attempt to assign to non-updatable column 重复

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 2015-02-09
    • 2021-01-30
    • 1970-01-01
    • 2018-03-29
    • 2018-11-08
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多