我正在做一個必須與 MySQL 資料庫互動的 Java 程式,我正在嘗試從 Java 查詢中洗掉表中的一行。
問題是,當我嘗試將 Java 中的字串“2021/2022”轉換為 char(9) 時,我收到一條錯誤訊息,指出資料對于列來說太長了。任何人都可以幫忙嗎?
這是應該洗掉行的方法:
public boolean borrarMatricula(Connection conn, int alumno, int profesor, int asignatura,
String c){
boolean borrado = false;
String drop = "DROP PROCEDURE IF EXISTS DELETE_ENROLLMENT";
String rutina = "CREATE PROCEDURE DELETE_ENROLLMENT(IN alumno double(4,0), "
"IN profesor double(2,0), IN asignatura double(3,0), IN c char(9))"
"BEGIN "
"DELETE FROM MATRICULAS WHERE codigoAlumno=alumno and "
"codigoProfesor=profesor and codigoAsignatura=asignatura and curso=c;"
"END";
try{
Statement s = conn.createStatement();
s.execute(drop);
s.execute(rutina);
CallableStatement cs=conn.prepareCall("{call DELETE_ENROLLMENT("
alumno "," profesor "," asignatura "," c ")}");
cs.execute();
borrado = true;
}
catch(SQLException e){
Vista.muestraErrorSQL(e);
}
catch(Exception e){
e.printStackTrace(System.err);
}
return(borrado);
}
“Curso”被定義為一個字符(9),我使用的字串是 2021/2022
uj5u.com熱心網友回復:
發生的事情是您將 Java 變數連接到 CALL 陳述句中:
CallableStatement cs=conn.prepareCall("{call DELETE_ENROLLMENT("
alumno "," profesor "," asignatura "," c ")}");
所以它運行一個 CALL 陳述句,就像你這樣格式化它一樣:
mysql> call delete_enrollment(1, 1, 1, 2021/2022);
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
--------- ------ ----------------------------------------
| Level | Code | Message |
--------- ------ ----------------------------------------
| Warning | 1265 | Data truncated for column 'c' at row 1 |
--------- ------ ----------------------------------------
在 Java 中,警告被提升為錯誤。該值不是 string '2021/2022',而是一個浮點值,它是 2021/2022 的商,或大約 0.9995。當您嘗試將浮點值用作字串時,它會導致警告。
如果您使用了實際的帶引號的字串,則不會發出警告:
mysql> call delete_enrollment(1, 1, 1, '2021/2022');
Query OK, 0 rows affected (0.00 sec)
但是您應該避免使用字串連接。您已經在使用準備好的陳述句,因此您應該使用系結引數:
CallableStatement cs=conn.prepareCall("{call DELETE_ENROLLMENT(?, ?, ?, ?)}");
cs.setDouble(1, alumno);
cs.setDouble(2, profesor);
cs.setDouble(3, asignatura);
cs.setString(4, c);
cs.execute();
使用引數而不是字串連接是使用準備好的陳述句的最重要原因之一。它使您的代碼更安全,更不容易出錯,并且更容易閱讀和撰寫代碼。
另見:https : //dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-statements-callable.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368586.html
上一篇:ID3D11Multithread::Enter是可重入的嗎?
下一篇:MySQL使用CAST更新列值
