1

私は MySql 、 Delphi を使用しています。以下のコードで何が間違っていますか??

「where 句の不明な列 'x'」エラーが表示されます --> 'where 句' の不明な列 '_code_ehda_konandeh' が必要です。私はこのプロジェクトを2日後にしなければなりません........


   DELIMITER $$

USE `bimarestan`$$

DROP PROCEDURE IF EXISTS `Save_Ehda_Konande`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Save_Ehda_Konande`(
IN _code_ehda_konandeh VARCHAR(50),
IN _tarikh_moarefi VARCHAR(50),
IN _tarikh_tashkil_parvandeh VARCHAR(50),
IN _name VARCHAR(50),
IN _name_khanevadegi VARCHAR(50),
IN _name_pedar VARCHAR(50),
IN _tarikh_tavalod VARCHAR(20),
IN _tahsilat VARCHAR(50),
IN _vaziyat_taahol VARCHAR(50),
IN _noe_bimeh VARCHAR(50),
IN _gorooh_khoon VARCHAR(50),
IN _rezayat_dahandeh VARCHAR(50),
IN _shoghl VARCHAR(50),
IN _address VARCHAR(50),
IN _telphone VARCHAR(50),
OUT _out INT)
BEGIN
IF LTRIM(RTRIM(_code_ehda_konandeh))<>'' THEN
 BEGIN
 SET _out = 0;
  IF NOT EXISTS(SELECT * FROM bimar WHERE `_code_ehda_konandeh` = `code_ehda_konandeh`) THEN
    INSERT INTO `ehda_konandeh` (
code_ehda_konandeh,
tarikh_moarefi,
tarikh_tashkil_parvandeh,
NAME,
name_khanevadegi,
name_pedar,
tarikh_tavalod,
tahsilat,
vaziyat_taahol,
noe_bimeh,
gorooh_khoon,
rezayat_dahandeh,
shoghl,
address,
telphone)
    VALUES(
_code_ehda_konandeh,
_tarikh_moarefi,
_tarikh_tashkil_parvandeh,
_name,
_name_khanevadegi,
_name_pedar,
_tarikh_tavalod,
_tahsilat,
_vaziyat_taahol,
_noe_bimeh,
_gorooh_khoon,
_rezayat_dahandeh,
_shoghl,
_address,
_telphone
);
  ELSE
    SET _out = 1;  
  END IF;
    END; 
END IF;
END$$

DELIMITER ;

MySqlでストアドプロシージャを実行しても問題はありませんが、デルファイパラメータをそれに送信したい場合、エラーが発生します!!

これは私のデルファイコードです:

if flag_new_edit = 1 then
  sp_sabt.StoredProcName := 'Save_Ehda_Konande'
 else
  sp_sabt.StoredProcName := 'Edit_Ehda_Konande';
   With sp_sabt Do
   Begin
   ParamByName('_code_ehda_konandeh').Value := Trim(txt_code_ehda_konande.Text);
   ParamByName('_tarikh_moarefi').Value := Trim(txt_tarikh_tavalod.Text);
   ParamByName('_tarikh_tashkil_parvandeh').Value := Trim(txt_name_khanevadegi.Text);
   ParamByName('_name').Value := Trim(txt_name.Text);
   ParamByName('_name_khanevadegi').Value := Trim(txt_name_khanevadegi.Text);
   ParamByName('_name_pedar').Value := Trim(txt_name_pedar.Text);
   ParamByName('_tarikh_tavalod').Value := Trim(txt_tarikh_tavalod.Text);
   ParamByName('_tahsilat').Value := Trim(cmb_tahsilat.Text);
   ParamByName('_vaziyat_taahol').Value := Trim(cmb_vaziyat_taahol.Text);
   ParamByName('_noe_bimeh').Value := Trim(cmb_noe_bime.Text);
   ParamByName('_gorooh_khoon').Value := Trim(cmb_gorooh_khoon.Text);
   ParamByName('_rezayat_dahandeh').Value := Trim(txt_rezayat_dahande.Text);
   ParamByName('_shoghl').Value := Trim(txt_shoghl.Text);
   ParamByName('_address').Value := Trim(txt_adress.Text);
   ParamByName('_telphone').Value := Trim(txt_tel.Text);
   ExecProc;
End;

よろしく

4

2 に答える 2

3
  IF NOT EXISTS(SELECT * FROM bimar WHERE `_code_ehda_konandeh` = `code_ehda_konandeh`) THEN
                                          ^---                ^---

示された引用符を削除します。バックティックは、予約語を「エスケープ」するために使用されます。また、これらのエスケープされた単語をフィールド/テーブル名として扱うようにMySQLに強制します。パラメータはフィールドではないため、MySQLはそれらをそのように誤解することを余儀なくされています。

于 2012-05-20T13:28:07.747 に答える
3

SQLコードでエラーが発生する可能性があることを指摘しましたが、詳細を説明したいと思います。

That Stored Procedure Runing at MySql WithOut any problems but when send Delphi parameters to sp , i get that Error !!しかし、あなたは間違っています。

a known bugプロシージャの作成にあります。その理由により、実行時例外が発生しました。
Semantics of Stored procedure code is not checked at CREATE time. At runtime, undeclared variables are detected, and an error message is generated for each reference to an undeclared variable. However, SP's seem to believe any reference denotes a column, even though the syntactic context excludes that. This leads to a very confusing error message in case the procedure.

標準的なテストの例を以下に示します。

mysql> drop procedure proc_test;
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter //
mysql> CREATE PROCEDURE proc_test()
    -> BEGIN
    ->     select current_day;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

ここで、プロシージャのコンパイルが何であるかを無視したことがわかりますcurrent day

mysql> delimiter ;
mysql> call proc_test();
ERROR 1054 (42S22): Unknown column 'current_day' in 'field list'
mysql>

これで、それが正しくないことを理解する必要That Stored Procedure Runing at MySql WithOut any problems ...があります。


クエリをすばやく修正すると、問題が解決します。あなたはそれを述べましたI defined input parameters with _ prefix. I don't know waht i must do !。それが本当なら
変える

SELECT * FROM bimar WHERE `_code_ehda_konandeh` = `code_ehda_konandeh`

SELECT * FROM bimar WHERE `code_ehda_konandeh` = _code_ehda_konandeh

そして、それは機能するはずです。ここでcode_ehda_konandehは、テーブルの列も想定していますbimar

于 2012-05-21T15:37:46.927 に答える