我正在使用MySql,Delphi。 我在下面的代码中出错了什么?
我在where子句中得到“Unknown Column'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没有任何问题,但当我想发送delphi参数时,我得到了错误!!
这是我的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;
此致
答案 0 :(得分:3)
IF NOT EXISTS(SELECT * FROM bimar WHERE `_code_ehda_konandeh` = `code_ehda_konandeh`) THEN
^--- ^---
删除指定的引号。反引号用于“逃避”保留字。它们还强制MySQL将这些转义的单词视为字段/表名。你的参数不是字段,因此MySQL被迫误解为它们。
答案 1 :(得分: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
的一列。