1

私はDAOクラスとStoredProcedureに奇妙な問題を抱えてCallableStatementいます.15個INのパラメータを取るオブジェクトを使用しています.フィールドの値はHTMLフォームから正しく取得され、セッターid_colorでどのように設定されていますか.CallableStatementメソッドですが、データベースに送信された瞬間にid_color、値によって上書きされます。ここに「コンテキスト」があります。このテーブルの操作を処理する3次のクラスがあります。DAO.CoverDAOCRUD


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 $$

カバーを挿入する方法は、次のようなストアド プロシージャです。


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

ご覧のとおり、基本的には各フィールドを埋めるだけですがCoverDAO.create(CoverDTO cover)、カバーを作成するメソッドは次のようになります。


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);
        }
    }

CoverDTO はアクセサ メソッドで構成され、MySQL オブジェクトは基本的にプールから接続を返します。

ダミーだが適切なデータを含む pset クエリを次に 示しputCover(1,10,0,80.0,80.0,'F','Cut',0.0,0,15.0,'4x2',1.5,'A',10.0,5.0)ます。私は次のことをしました: 103

  • 値を create メソッドまでトレースしid_colorましたが、それでも 3 に置き換えられました
  • DAO create メソッドで値をハードコーディングしましたが、それでも 3 に置き換えられました
  • MySQL Workbench からプロシージャを呼び出したところ、問題なく動作したので、create メソッドで何かが起こっていると思います。どんな助けも本当に感謝しています。
  • 4

    2 に答える 2

    1

    ストアド プロシージャの宣言に誤りがあります。

    IN color TINYINT(3)
    

    次のように変更します。

    IN color TINYINT
    

    うまくいけばうまくいくでしょう。

    于 2010-12-29T01:46:49.797 に答える
    1

    shape tinyint(3)属性定義と を考えると、仮パラメータとがそれぞれあるid_color tinyint(3)ことに驚きました。さらに、それに応じて を使用することを期待しています。PROCEDURE putCover()IN shape TINYINTIN color TINYINT(3)create()setByte()

    于 2010-12-29T02:06:44.750 に答える