1

我正在使用 MySql ,德尔福。下面的代码我有什么问题?

我在 where 子句中得到“未知列 'x'”错误 --> 'where 子句'中的未知列 '_code_ehda_konandeh' 我非常需要它。我必须在两天后做这个项目......


   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 上运行的 Stored Proc 没有任何问题,但是当我想向它发送 delphi 参数时,我得到了那个错误!

这是我的德尔福代码:

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 回答