2010-12-29 11 views
1

Ich habe ein seltsames Problem mit einer DAO-Klasse und einem StoredProcedure, was passiert ist, dass ich ein CallableStatement-Objekt, das 15 IN Parameter verwendet, der Wert des Feldes id_color wird korrekt aus den HTML-Formularen abgerufen wird es sogar eingerichtet wie es sollte in den CallableStatement Setter-Methoden, aber in dem Moment an die Datenbank gesendet wird die id_color durch den Wert 3 hier ist der „Kontext“ overwriten: ich die folgende Klasse DAO.CoverDAO haben, die die CRUD Operationen dieser Tabelle GriffeWert wird nach dem Kommen geändert. | CallableStatements


CREATE TABLE `cover_details` (
    `refno` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `shape` tinyint(3) unsigned NOT NULL , 
    `id_color` tinyint(3) unsigned NOT NULL ', 
    `reversefold` bit(1) NOT NULL DEFAULT b'0' , 
    `x` decimal(6,3) unsigned NOT NULL , 
    `y` decimal(6,3) unsigned NOT NULL DEFAULT '0.000', 
    `typecut` varchar(10) NOT NULL, 
    `cornershape` varchar(20) NOT NULL, 
    `z` decimal(6,3) unsigned DEFAULT '0.000' , 
    `othercornerradius` decimal(6,3) unsigned DEFAULT '0.000'', 
    `skirt` decimal(5,3) unsigned NOT NULL DEFAULT '7.000', 
    `foamTaper` varchar(3) NOT NULL, 
    `foamDensity` decimal(2,1) unsigned NOT NULL , 
    `straplocation` char(1) NOT NULL ', 
    `straplength` decimal(6,3) unsigned NOT NULL, 
    `strapinset` decimal(6,3) unsigned NOT NULL, 
    `spayear` varchar(20) DEFAULT 'Not Specified', 
    `spamake` varchar(20) DEFAULT 'Not Specified', 
    `spabrand` varchar(20) DEFAULT 'Not Specified', 
    PRIMARY KEY (`refno`) 
) ENGINE=MyISAM AUTO_INCREMENT=143 DEFAULT CHARSET=latin1 $$ 
 

Die Art und Weise Abdeckungen werden i nserted ist von einer gespeicherten Prozedur, die ist die folgende:


CREATE DEFINER=`root`@`%` PROCEDURE `putCover`(
            IN shape TINYINT, 
            IN color TINYINT, 
            IN reverse_fold BIT, 
            IN x DECIMAL(6,3), 
            IN y DECIMAL(6,3), 
            IN type_cut VARCHAR(10), 
            IN corner_shape VARCHAR(10), 
            IN cutsize DECIMAL(6,3), 
            IN corner_radius DECIMAL(6,3), 
            IN skirt DECIMAL(5,3), 
            IN foam_taper VARCHAR(7), 
            IN foam_density DECIMAL(2,1), 
            IN strap_location CHAR(1), 
            IN strap_length DECIMAL(6,3), 
            IN strap_inset DECIMAL(6,3) 
            ) 
BEGIN 
    INSERT INTO `dbre`.`cover_details` 
    (`dbre`.`cover_details`.`shape`, 
    `dbre`.`cover_details`.`id_color`, 
    `dbre`.`cover_details`.`reversefold`, 
    `dbre`.`cover_details`.`x`, 
    `dbre`.`cover_details`.`y`, 
    `dbre`.`cover_details`.`typecut`, 
    `dbre`.`cover_details`.`cornershape`, 
    `dbre`.`cover_details`.`z`, 
    `dbre`.`cover_details`.`othercornerradius`, 
    `dbre`.`cover_details`.`skirt`, 
    `dbre`.`cover_details`.`foamTaper`, 
    `dbre`.`cover_details`.`foamDensity`, 
    `dbre`.`cover_details`.`strapLocation`, 
    `dbre`.`cover_details`.`strapInset`, 
    `dbre`.`cover_details`.`strapLength` 
    ) 
    VALUES 
    (shape,color,reverse_fold, 
    x,y,type_cut,corner_shape, 
    cutsize,corner_radius,skirt,foam_taper,foam_density, 
    strap_location,strap_inset,strap_length); 
END 

Wie Sie im Grunde sehen es füllt nur jedes Feld, nun, das CoverDAO.create(CoverDTO cover) Verfahren, das die Abdeckung schafft, ist in etwa so:


public void create(CoverDTO cover) throws DAOException { 
     Connection link = null; 
     CallableStatement query = null; 
     try { 
      link = MySQL.getConnection(); 
      link.setAutoCommit(false); 
      query = link.prepareCall(
       "{CALL putCover(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}" 
            ); 
      query.setByte(1,cover.getShape().byteValue()); 
      query.setByte(2,cover.getColor().byteValue()); 
      query.setBoolean(3, cover.getReverseFold()); 
      query.setBigDecimal(4,cover.getX()); 
      query.setBigDecimal(5,cover.getY()); 
      query.setString(6,cover.getTypeCut()); 
      query.setString(7,cover.getCornerShape()); 
      query.setBigDecimal(8, cover.getZ()); 
      query.setBigDecimal(9, cover.getCornerRadius()); 
      query.setBigDecimal(10, cover.getSkirt()); 
      query.setString(11, cover.getFoamTaper()); 
      query.setBigDecimal(12, cover.getFoamDensity()); 
      query.setString(13, cover.getStrapLocation()); 
      query.setBigDecimal(14, cover.getStrapLength()); 
      query.setBigDecimal(15, cover.getStrapInset()); 
      query.executeUpdate(); 
      link.commit(); 
     } catch (SQLException e) { 
      throw new DAOException(e); 
     } finally { 
      close(link, query); 
     } 
    }

Das CoverDTO besteht aus Zugriffen oder Methoden, das MySQL-Objekt gibt grundsätzlich die Verbindung aus einem Pool zurück.

Hier ist die pset Abfrage mit Dummy aber entsprechenden Daten an: putCover(1,10,0,80.0,80.0,'F','Cut',0.0,0,15.0,'4x2',1.5,'A',10.0,5.0) (einige nachgestellte Nullen entfernt) Wie Sie alles sehen kann nur gut, wenn ich an die DB schreiben statt 10 im zweiten Parameter eine 3 geschrieben wird. Ich habe folgendes getan:

  • Traced den id_color Wert der Methode erstellen, wurde noch durch einen
  • 3 ersetzt
  • hartcodiert der Wert in der DAO-Methode erstellen, wurde nach wie vor von einem
  • 3 ersetzt die Prozedur aus der MySQL-Called Workbench, es funktionierte Geldstrafe, also nehme ich an, dass etwas in der Create-Methode passiert, jede Hilfe wird wirklich geschätzt.

    +0

    Wo haben Sie "den Wert in der DAO create-Methode festgeschrieben", haben Sie versucht "query.setInt (2,10);"? –

    +0

    Sollen 'query.setInt (2, cover.getColor())' 'query.setByte (2, cover.getColor())' sein? – trashgod

    +0

    Hat es jemals funktioniert? Sind Sie sicher, dass die DAO und die Tabellendefinition übereinstimmen? –

    Antwort

    1

    Es ist ein Fehler in gespeicherten Prozedur Deklaration:

    IN color TINYINT(3) 
    

    Änderung vor:

    IN color TINYINT 
    

    Hoffentlich wird es funktionieren.

    +0

    @ShahidAzim: Können Sie es ausarbeiten? "Die Anzeigebreite beschränkt nicht den Wertebereich, der in der Spalte gespeichert werden kann." -http: //dev.mysql.com/doc/refman/5.0/en/numeric-types.html – trashgod

    +0

    Es sollte nicht funktionieren , aber in diesem Fall verhält es sich so. Am besten warten Sie auf @Triztian Antwort. – ShahidAzim

    +0

    @ShahidAzim: Ich verstehe deinen Standpunkt. – trashgod

    1

    die atribute Definitionen shape tinyint(3) und id_color tinyint(3) gegeben, ich bin überrascht, PROCEDURE putCover() mit formalen Parametern IN shape TINYINT und IN color TINYINT(3) bzw. zu sehen. Darüber hinaus würde ich create() erwarten, entsprechend zu verwenden setByte().

    +0

    Ich denke, dass könnte es sein, aber nach der Spezifikation ein TINYINT auf einen INTEGER abbildet siehe hier Java, JDBC and MySQL Types Triztian

    +0

    Haben Sie Glück mit 'setByte()', wie oben gezeigt? http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-type-conversions.html – trashgod

    +0

    Eigentlich ist das Problem gelöst, siehe die Kommentare in ShahidAzims Antwort. – Triztian

    Verwandte Themen