이 문제에 대해 궁금합니다. SQL Server 데이터베이스에서 다음 SQL을 실행하는 경우 :
SELECT [id]
FROM [dbo].[events]
WHERE createdon BETWEEN '2016-07-09' AND '2016-07-10'
이벤트를 잘 반환합니다. 이 경우 createdon
열은 데이터 유형 datetime
입니다.
ASP.Net에서 해당 쿼리를 실행하면 매개 변수화 된 쿼리로 바뀝니다.
SQL 프로파일 러에 따르면 다음 쿼리가 실행됩니다.
EXEC sp_executesql N'SELECT [id] FROM [dbo].[events] WHERE createdon BETWEEN ''@DateFrom'' AND ''@DateTo'' ',
N'@DateFrom datetime,@DateTo datetime',
@DateFrom = '2016-07-09',
@DateTo = '2016-07-10';
위의 쿼리가 처음 시작한 쿼리와 동일한 것 같습니다. @DateFrom
및 @DateTo
올바른 세트로되어 datetime
있는 유형과 일치 createdon
.
그러나 매개 변수화 된 쿼리는 다음과 함께 실패합니다.
문자열에서 날짜 및 / 또는 시간을 변환 할 때 SQL Server 변환이 실패했습니다.
왜 이래요? 누군가가 나를 깨달을 수 있기를 바랍니다 :). 두 쿼리 모두 동일한 SQL 로그인에서 실행되었습니다. .Net을 통해 매개 변수를 추가했습니다.command.Parameters.AddWithValue
(그런데, 결국 쿼리에 시간 요소가있을 것이지만 지금은 간단하게 제거했습니다).
문제는 ''
매개 변수 주위의 아포스트로피 에 있습니다. 아마도 ASP.NET에서 이와 같이 쿼리를 정의했을 것입니다.
string query = "SELECT [id] FROM [dbo].[events] WHERE createdon BETWEEN ''@DateFrom'' AND ''@DateTo'' ";
그런 다음 매개 변수를 추가합니다.
cmd.Parameters.AddWithValue("@DateFrom","2016-07-09");
ASP.NET은이를 문자열 ( varchar
) 로 간주합니다 .
이 시도.
string query = "SELECT [id] FROM [dbo].[events] WHERE createdon BETWEEN @DateFrom AND @DateTo ";
//...
cmd.Parameters.Add("@DateFrom",SqlDbType.Datetime).Value = "2016-07-09";
OP ( ...BETWEEN ''@DateFrom'' AND ''@DateTo''
) 의 쿼리는 선언 할 수있는 매개 변수 값을 사용하지 않습니다 datetime
. 그것은 사용 @DateFrom
하고 @DateTo
있는지에 대한 날짜없는 리터럴.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다