2010-12-29 9 views
1

DAOクラスとStoredProcedureで奇妙な問題が発生しましたが、私はパラメータを取るCallableStatementオブジェクトを使用し、フィールドid_colorの値が設定されているHTMLフォームから正しく取得されます。それはどのようにCallableStatement setterメソッドにする必要がありますが、それはデータベースid_colorに送信された瞬間には、値3ここで「コンテキスト」はだでoverwritenさ: は、私は、この表のCRUD操作を処理し、次のクラスDAO.CoverDAOを持ってコミット時に値が変更されます。 | 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 $$ 
 

ウェイカバーは私ですnsertedがあるストアドプロシージャ、である次


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

:あなたはそれだけで、各フィールドを埋め基本的に見ることができるように、今、カバーを作成CoverDAO.create(CoverDTO cover)方法はとても似ている


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 

CoverDTOはアクセスメソッドまたはメソッドで構成され、MySQLオブジェクトは基本的にプールから接続を返します。私は3が書かれている2番目のパラメータでDB代わりの10に書き込むだけのとき putCover(1,10,0,80.0,80.0,'F','Cut',0.0,0,15.0,'4x2',1.5,'A',10.0,5.0)(いくつかの末尾のゼロを削除) あなたはすべてのものを見ることができるように罰金されています

ここでダミーが、適切なデータとPSETクエリがあります。私は、次のことを行っている:まだDAOの値はメソッドを作成する3

  • ハードコードに置き換えられてしまった作成方法に
  • トレースさid_color値は、まだMySQLからの手続きと呼ばれる3
  • に置き換えられてしまいましたワークベンチ、それは罰金を働いたので、私は何かが作成メソッドで起こっていると仮定し、任意のヘルプは本当に感謝しています。

    IN color TINYINT(3) 
    

    の変化、それはへ:

    IN color TINYINT 
    

    がうまくいけば、それが動作します
  • +0

    "DAO作成メソッドの値をハードコーディングしました"、あなたは 'query.setInt(2,10);'を試しましたか? –

    +0

    'query.setInt(2、cover.getColor())'は 'query.setByte(2、cover.getColor())'になりますか? – trashgod

    +0

    これまで働いたことがありますか?あなたはDAOとテーブルの定義が一致していますか? –

    答えて

    1

    は、ストアドプロシージャの宣言に誤りがあります。 atribute定義shape tinyint(3)id_color tinyint(3)考える

    +0

    @ShahidAzim:詳しく説明できますか? "表示幅は列に格納できる値の範囲を制限しません。" -http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html – trashgod

    +0

    これは動作しませんしかし、この場合、それはそのように振る舞います。最高ののは、@トリズートの応答を待つことです。 – ShahidAzim

    +0

    @ShahidAzim:あなたの意見が分かります。 – trashgod

    1

    は、私はPROCEDURE putCover()は、それぞれ、仮パラメータIN shape TINYINTIN color TINYINT(3)を持つ見て驚いています。また、create()にはsetByte()を使用すると思われます。

    +0

    私はそれかもしれませんが、仕様によると、TINYINTはINTEGERにマップされますJava, JDBC and MySQL Types Triztian

    +0

    上記のように 'setByte()'を使用するとどんな運がありますか? http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-type-conversions.html – trashgod

    +0

    実際に問題は解決しました.ShahidAzimの答えのコメントを参照してください。 – Triztian

    関連する問題