【发布时间】: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