2014-12-17 2 views
0

asp.net 응용 프로그램에서 이상한 문제가 있습니다. 두 번째 테이블에 삽입하는 동안 나는 다른 외래 키와 함께 몇 가지 변수의 변화의 역사를 저장 두 개의 테이블을 가지고 있지만 어떤 이유로, MySQL은 오류가 발생ASP.NET : 자식 행을 추가하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 적용되지 않습니다.

Cannot add or update a child row: a foreign key constraint fails (`FlowDB/tab_hist_vars_reas`, CONSTRAINT `tab_hist_vars_reas_ibfk_1` FOREIGN KEY (`HIST_REASIG_ID`) REFERENCES `tab_hist_reas` (`HIST_REASIG_ID`)) 

이 삽입을 만드는 코드는 (로컬 변수에 값이 있다고 가정). 로컬에서 테스트했지만 프로덕션 환경에 사이트를 설치할 때 위의 오류가 발생합니다.

string strcmd = "INSERT INTO tab_hist_reas (HIST_REASIG_INC,HIST_REASIG_FLOW,HIST_REASIG_STEP,HIST_REASIG_DATE,HIST_REASIG_USER)"; 
strcmd += string.Format("VALUES ({0}, '{1}', '{2}', NOW(), '{3}');", incident, flow, step, user); 
db.executeNonQuery(strcmd); 

strcmd = "SELECT last_insert_id() AS id"; 
int idHistory = (int)db.ExecuteScalar(strcmd); 

foreach(var variable in lstVariables) 
{ 
    string strcmd = "INSERT INTO tab_hist_vars_reas (HIST_REASIG_ID,HIST_VAR_REASIG_VAR,HIST_VAR_REASIG_VALUE)"; 
    strcmd += string.Format("VALUES ({0}, '{1}', '{2}');", idHistory, variable.Name, variable.Value); 
    db.executeNonQuery(strcmd); 
} 

다음은 테이블 정의입니다.

CREATE TABLE `tab_hist_reas` (
`HIST_REASIG_ID` int(11) NOT NULL auto_increment, 
`HIST_REASIG_INC` int(11) default NULL, 
`HIST_REASIG_FLOW` varchar(150) default NULL, 
`HIST_REASIG_STEP` varchar(150) default NULL, 
`HIST_REASIG_DATE` datetime default NULL, 
`HIST_REASIG_USER` varchar(150) default NULL, 
PRIMARY KEY (`HIST_REASIG_ID`) 
) ENGINE=InnoDB; 

CREATE TABLE `tab_hist_vars_reas` (
`HIST_VAR_REASIG_ID` int(11) NOT NULL auto_increment, 
`HIST_REASIG_ID` int(11) NOT NULL, 
`HIST_VAR_REASIG_VAR` varchar(100) default NULL, 
`HIST_VAR_REASIG_VALUE` varchar(100) default NULL, 
PRIMARY KEY (`HIST_VAR_REASIG_ID`), 
KEY `IND_HIST_VAR_REAS_ID_HIST` (`HIST_REASIG_ID`), 
CONSTRAINT `tab_hist_vars_reas_ibfk_1` FOREIGN KEY (`HIST_REASIG_ID`) REFERENCES `tab_hist_reas` (`HIST_REASIG_ID`) 
) ENGINE=InnoDB; 

나는 @@identitylast_insert_id()를 교체 시도했지만 중 하나가 작동하지 않았다. 데이터베이스에 직접 쿼리를 실행 해 보았는데 정상적으로 작동합니다.

+0

db 란 무엇입니까? 호출 할 때마다 연결을 열고 닫는 일종의 사용자 정의 클래스입니까? – Steve

답변

0

코드에서 Sql Injection 문제의 일부인이 경우에 대한 가능한 이유는 db입니다. 이 변수가 ExecuteXXX 메서드를 호출 할 때마다 연결을 열고 닫는 사용자 지정 클래스의 인스턴스이면 SELECT LAST_INSERT_ID에서 첫 번째 테이블의 값을 삽입하는 연결과 다른 연결에서 호출 할 때 문제가 발생할 수 있습니다.

당신은이 초기 명령을 병합을 시도 할 수 있습니다 그들을 당신이 한 명령을 간부 인이 방법으로 동일한 연결

string strcmd = @"INSERT INTO tab_hist_reas 
        (HIST_REASIG_INC,HIST_REASIG_FLOW,HIST_REASIG_STEP, 
        HIST_REASIG_DATE,HIST_REASIG_USER) "; 
strcmd += string.Format("VALUES ({0}, '{1}', '{2}', NOW(), '{3}');", incident, flow, step, user); 
strcmd += "SELECT last_insert_id() AS id"; 
int idHistory = (int)db.ExecuteScalar(strcmd); 

에 의해 함께 처리 한하고 당신은 확인해야 그 SELECT LAST_INSERT_ID의 반환 ()가 효과적으로 현재 삽입 명령으로 설정됩니다.

관련 문제