Java UCAExc:::4.0.4尝试分配给不可更新列
我希望这段代码连接到我的数据库并加密表WellTable中的行。不幸的是,我遇到了下面列出的错误。我跟随导游来到这里:。。。我使用的是AtomIDEJava UCAExc:::4.0.4尝试分配给不可更新列,java,ms-access,jdbc,atom-editor,ucanaccess,Java,Ms Access,Jdbc,Atom Editor,Ucanaccess,我希望这段代码连接到我的数据库并加密表WellTable中的行。不幸的是,我遇到了下面列出的错误。我跟随导游来到这里:。。。我使用的是AtomIDE 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
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();
}
}
}
现在你有一个问题需要回答: 如果阅读java.sql.Connection.createStatement的文档,您会看到: 默认情况下,将使用返回的Statementobject创建结果集 只能是type_FORWARD_类型,并发级别为 CONCUR_只读 因此,要使其可更新,您必须使用另一个构造函数,该构造函数允许您更改:
Statement readID = dbConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
重复的此代码是否成功连接到我的数据库并执行我希望它执行的操作不是一个可以得到任何答案的问题。指定您的问题:1。代码abc 2。应该是DEF3。但ghi 4也不例外。Why/how/wtf-如果您想知道这个问题的答案:让代码运行并测试它-以及如何使用方法清理代码->阅读任何有关面向对象的书籍/查看基本java教程我没有ms访问权限,无法完全运行代码。如果有人有更多的经验,愿意运行它,或者查看它,并能够发现它为什么不能做我希望它做的事情,或者如何更有效地编写它,这将对我有所帮助。无论他们说什么,我都能学到更多。你说我从中学到的东西不多。谢谢你的意见。我已经进一步编辑了我的问题,希望它符合网站标准:@MarI回答了你的问题。但是您的代码现在将抛出java.sql.SQLDataException:data exception:invalid character value for cast->请不要再次更改此问题。在stackoverflow中查找相同的问题,如果该问题在此处未得到解决,则创建一个新问题。@MarvinEmilBrach这是因为我的加密算法仅加密到字符串值,而数据库列中的数据类型是数字,我想知道是否有一个java语句能够将数据库的类型从数字字段更改为文本字段。谢谢你的帮助。
Statement readID = dbConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);