2012-08-14 3 views
0

나는 작업을위한 작은 응용 프로그램을 만들고 있으며 양식도 포함되어 있습니다. 양식을 사용하는 사람이 데이터 유형 "숫자"(PIN 번호를 말하게 할 수 있음) 또는 "날짜"데이터 유형 필드 (예 : 그의 기념일을 말함) 중 하나에 날짜를 입력하지 않으면, 다음과 같은 오류 : Postgresql에서 숫자 또는 날짜 유형을 사용하여 NULL 값을 입력 할 수없는 이유는 무엇입니까?

Error Type – Type d'erreur _Microsoft OLE DB Provider for ODBC Drivers (0x80004005)_ ERROR: invalid input syntax for type numeric: ""; Error while executing the query

Error Type – Type d'erreur _Microsoft OLE DB Provider for ODBC Drivers (0x80004005)_ ERROR: syntax error at or near ")"; Error while executing the query

는 그래서 양식을 사용하는 사람이 아무것도 입력하지 않을 때, 그것은 문자열 ""입니다 "빈"을 반환 것으로 보인다. 숫자 형식 및 데이터 형식이 해당 항목을 NULL 항목으로 읽지 못하는 이유는 무엇입니까? 이 필드는 필수 항목이 아니므로 때로는 비어 있어야합니다.

어떻게 할 수 있습니까? 사용자가이 필드에 아무 것도 입력하지 않으면이 오류를 표시하는 빈 사례가 테이블에 채워지도록 "숫자"및 "날짜"유형을 계속 사용하는 방법입니까? 여기

내 SQL 문입니다 :
trsConn.EXECUTE "INSERT INTO ""TRS"".employeetbl ("& _ 
    """firstName"", " & _ 
    """lastName"" , " & _ 
    """detContract"", " & _ 
    "sle, " & _ 
    """posNumber"" "& _ 
    ") VALUES (" & _ 
    "'" & Request.Form("empFirst") & "', " & _** 
    "'" & Replace(Request.Form("empLast"), "'", "`") & "', " & _ 
    "'" & Request.Form("dateContract") & "', " & _ 
    "'" & Request.Form("sle") & "', " & _ 
    "'" & Request.Form("posNum") & "');" 

합니다 (posNum 및 dateContract 유형 모두 respectivly있다 "숫자"와 "날짜"

도움을 너무 많이

감사 청각 기대 것. 당신 천재. 말을

+3

와우. "ASP classic"은 * placeholder * 또는 * prepared statements *를 지원합니까? 나는 * VALUES (.., NULL, ..)이 아닌 .. VALUES (.., NULL, ..)와 같이 끝나는 데이터를 보간한다는 것이 문제가 될지도 모른다. '그것이되어야한다. –

+0

또한'posNum'은'''(재밌는 작은 따옴표, 틀린 것)을 사용하는 반면, 다른 사람들은'''(아포스트로피, 올바른 것)을 사용하는 이유는 무엇입니까? 'posNum'에 대해 ** ** 값을 입력 할 수 있습니까? (즉, 제목은 빨간색 청어입니까?) –

+1

이것은 고전적인 ' ""NULL과 동일하지 않습니다 "입니다. NULL은 결코 어떤 것과도 같지 않으며, 당신은 그것을 대체 할 수 없습니다. (오라클은 수년간 예외였습니다. 'NULL '을 지정하려면'NULL '을 지정하십시오. 열이'NULL'인지 확인하고 싶다면'IS NULL'을 사용하십시오; 그들은'NULL '값을 다루기 위해'IsNull()'과'Coalesce()'를 특별히 가지고 있습니다. 그래서 그것들은 특별한 함수와 그것을 검사하는 연산자를 가지고 있습니다. 'NULL' <> 다른 것은 없지만 그 외의 것은'NULL'입니다. –

답변

4

The concept of NULL in SQL is pretty muddled and inconsistent이 ...하지만 ''NULL 구별 된 매우 분명하다.

''NULL이 아니며 빈 문자열 인 ''입니다. 당신은 날짜, 숫자 등으로 변환 할 수 없습니다

regress=# SELECT CAST('' AS DATE); 
ERROR: invalid input syntax for type date: "" 
LINE 1: SELECT CAST('' AS DATE); 
        ^
regress=# SELECT CAST('' AS NUMERIC); 
ERROR: invalid input syntax for type numeric: "" 
LINE 1: SELECT CAST('' AS NUMERIC); 
        ^

일부 제품 - 특히 마이크로 소프트 액세스와 MySQL의 이전 버전은 - 그 문제에 대해 혼란스러워한다. NULL이 NULL이면 ''은 빈 문자열입니다. 그들은 같은 것이 아닙니다. 하나를 다른 것으로 변환 할 수 없습니다.

So it seems that when the person using the form enters nothing, it returns the string "empty" that is "". Why can't the numeric type and data type read that as a NULL entry? These fields are not mandatory and so I need to have them be sometimes blank.

그건 응용 프로그램의 직업입니다. 응용 프로그램에서 빈 문자열이 숫자, 날짜 등의 양식 필드에 표시되면 ''이 아닌 NULL을 데이터베이스에 보내야합니다. 이는 대개 사용자 입력에서 데이터를 데이터베이스로 변환하기 전에 데이터를 변환하는 일상적인 부분입니다. 그러한 변환을 수행하는 것은 중요 함입니다. 사용자의 값을 데이터베이스로 직접 전송해서는 안됩니다.

빠른 검색은 asp classic이 null 값으로 null 또는 undefined을 사용한다고 제안합니다. 무언가가 널 때 준비한 계산서로 그 (것)들을 전달할 수 있어야합니다.

''에 대한 오류가 발생한 후에 구문 오류가 발생한다는 사실은 prepared statements with placeholders이 아닌 문자열로 SQL 문을 작성하고 있음을 나타냅니다. (SO 질문에 대한 JayC의 심판에 감사드립니다.) 이것은 SQL injection을 위해 간청하고있다; 즉, 귀하의 응용 프로그램은 비판적으로 불안합니다입니다.사용자가 "날짜"를 입력하면 어떻게되는지 상상 :

2012-01-01'); DROP SCHEMA public;-- 

하고 앱은 행복하게

INSERT INTO sometable (blah, blah, blah) VALUES (1, 2, DATE '2012-01-01'); DROP SCHEMA public;--'); 

DROP SCHEMA 다음 명랑하게 실행하고 으악, 플랫, 당신의 데이터베이스가가는 것을집니다. 이것은 단지 가장 단순하고 간단한 SQL 인젝션 공격 일뿐입니다.

+0

Craig에게 감사드립니다. 그 안에있는 모든 것이 내 마음을 열었습니다. 정말로 감사합니다. 또한, 내 응용 프로그램은 안전하지 못하다는 것을 알지만 아직 개발 중이며 아무도 실제로 액세스 할 수있는 것이 아니라 내게 액세스 할 수 있습니다. 또한 사용자는 내 대행사의 인트라넷 페이지에서 올 것이므로 인터넷을 통해 액세스 할 수 없습니다. 다시 한 번 감사드립니다! –

+0

@ Vince.CRA IMO 처음부터 바로 쓰면서 보안을 강화하는 가장 좋은시기입니다. 보안 기능은 추가 작업이 끝나면 추가 기능이 아니기 때문에 디자인에 대해 생각하고, 도구를 선택하고, 설치를 바로 할 필요가 있습니다. 인터넷 상에 있지 않은 것에 관해서는 - 공격 범위는 낮지 만, 호기심이 많거나 불만스런 직원 (또는 잘못 구성된 프록시 서버) 만 있으면됩니다. 누군가가 할 수있는 간단한 SQL 삽입 결함을 악용하는 도구가 있습니다. –

+0

@ Vince.CRA 또한 진지하게 ASP 고전에서 * 새로운 * 응용 프로그램을 개발하고 있습니까? 그게 ... 재미있는 결정이야. 어떻게 지원 될 것인가? –