2009-05-14 6 views
2

주제가 제시합니다. 작은 데이터를 검색하고 처리 할 수있는 작은 프로그램을 만들고 있습니다. 문제는 SQL 테이블에 새로운 행을 삽입해도 문제가 없지만 동일한 메소드를 사용하여 smalldatetime 변수에 문제가 발생한다는 것입니다.ASP.NET을 SQL Server 2005로 업데이트하면 smalldatetime 프로 시저가 업데이트되지 않습니까?

나는 exec 명령이 날짜에 큰 따옴표를 넣는 것을 보았지만 제거 할 수없는 것으로 나타났습니다. 게다가 삽입 할 때 동일한 큰 따옴표가 사용됩니다.

 
exec spUpdateinfo 
@id=default, 
@job=N'Loadsoftext', 
@address=N'Loadsoftext', 
@startdate=''2009-02-01 00:00:00:000'', 
@enddate=''2009-05-15 00:00:00:000'', 
@other=N'Loadsoftext' 

그리고 내가 무엇을 얻을 것은이 오류입니다 : 절차에서이 명령은 다음과 같습니다

 
Msg 102, Level 15, State 1, Line 5 
Incorrect syntax near '2009'. 

내가이 asp.net의 코드 숨김에서 날짜를 사용하여 통과하고있어 같은 그 SQL 프로 시저에서 smalldatetime으로 변환되었다고 가정 할 때 일반 날짜로 매개 변수. 사용 된 메소드 및 변수 및 문자열 등은 삽입 할 때와 정확히 동일 할 수 있지만 어떤 이유에서든 UPDATING이 문제를 유발합니다. 인터넷에있는 동안 PreserveSingleQuotes() 함수가 사용되는 것을 보아 왔지만 VB 또는 SQL Server 2005에는 존재하지 않는 것 같습니다.

업데이트가 정상적으로 작동하는 이유는 무엇입니까?

편집 : 아, 날짜는 원래 dd.MM.yyyy 인 핀란드 형식입니다. 그러나 말했듯이,이 모든 것은 잘 작동하며 INSERT를 사용하는 동안 자동으로 변환됩니다.

편집 2 : 다음은 전체 코드입니다. 나는 sensitives을 편집했다으로

Asp.Net (VB)

 
     Dim fdate As Date 
     Dim ldate As Date 

     fdate = CDate(BegindateTextBox.Text.Trim) 
     ldate = CDate(EnddateTextBox.Text.Trim) 
     Dim ID As New SqlParameter("@id", Request.QueryString("job_id")) 
     Dim Job As New SqlParameter("@job", JobTextBox.Text) 
     Dim Address As New SqlParameter("@address", AddressTextBox.Text) 
     Dim Begindate As New SqlParameter("@startdate", fdate) 
     Dim Enddate As New SqlParameter("@enddate", ldate) 
     Dim Otherinfo As New SqlParameter("@other", OtherinfoTextBox.Text) 

     Begindate.DbType = DbType.Date 
     Enddate.DbType = DbType.Date 

     myCommand = New SqlCommand("spUpdateinfo") 
     myCommand.CommandType = CommandType.StoredProcedure 
     myCommand.Connection = conn 
     myCommand.Parameters.Add(ID) 
     myCommand.Parameters.Add(Job) 
     myCommand.Parameters.Add(Address) 
     myCommand.Parameters.Add(Begindate) 
     myCommand.Parameters.Add(Enddate) 
     myCommand.Parameters.Add(Otherinfo) 

     myCommand.ExecuteNonQuery() 

SQL 절차

 
    UPDATE jobInfo 
    SET Job = @Job, 
     Address= @Address, 
     Begindate = CAST(@Begindate AS smalldatetime), 
     Enddate = CAST(@Enddate AS smalldatetime), 
     Otherinfo = @Otherinfo 
    WHERE Job_id = @id 

잠시했다. 어쨌든, 무슨 일이 일어나고 있는지에 대한 도움이나 아이디어가 있습니까? 내가 고칠 수있는대로 바이올린을 시도 했으므로 캐스트를 볼 수 있지만 여전히 작동하지 않습니다.

편집 3 : 편집 해 주셔서 감사합니다. 오늘은 내일 다시 보겠습니다.

답변

3

이 시도 :

Asp.Net (VB)

Dim fdate As Date 
    Dim ldate As Date 

    fdate = CDate(BegindateTextBox.Text.Trim) 
    ldate = CDate(EnddateTextBox.Text.Trim) 
    //Trim might be screwing it up not sure 

    Dim ID As New SqlParameter("@id", Request.QueryString("job_id")) 
    Dim Job As New SqlParameter("@job", JobTextBox.Text) 
    Dim Address As New SqlParameter("@address", AddressTextBox.Text) 
    Dim Begindate As New SqlParameter("@startdate", fdate) 
    Dim Enddate As New SqlParameter("@enddate", ldate) 
    Dim Otherinfo As New SqlParameter("@other", OtherinfoTextBox.Text) 

    Begindate.DbType = DbType.Date // Try removing this 
    Enddate.DbType = DbType.Date // Try removing this 

    myCommand = New SqlCommand("spUpdateinfo") 
    myCommand.CommandType = CommandType.StoredProcedure 
    myCommand.Connection = conn 
    myCommand.Parameters.Add(ID) 
    myCommand.Parameters.Add(Job) 
    myCommand.Parameters.Add(Address) 
    myCommand.Parameters.Add(Begindate) 
    myCommand.Parameters.Add(Enddate) 
    myCommand.Parameters.Add(Otherinfo) 

    myCommand.ExecuteNonQuery() 

: 날짜 시간 문자열

편집를 만들 때

exec spUpdateinfo 
@id=default, 
@job=N'Loadsoftext', 
@address=N'Loadsoftext', 
@startdate='2009-02-01 00:00:00:000', 
@enddate='2009-05-15 00:00:00:000', 
@other=N'Loadsoftext' 

당신은 하나의 아포스트로피를 필요로한다 SQL 프로 시저

UPDATE jobInfo 
SET Job = @Job, 
    Address= @Address, 
    Begindate = CAST(@Begindate AS smalldatetime) //Try removing the cast, 
    Enddate = CAST(@Enddate AS smalldatetime) //Try removing the cast, 
    Otherinfo = @Otherinfo 
WHERE Job_id = @id 

당신이하고있는 일은 내가 정기적으로하는 일과 엄청나게 유사하고 당신이 가지고있는 문제가 없기 때문에 이것은 이상합니다. 내가 제안 할 수있는 유일한 방법은 강조 표시된 부분을 제거하고 작동하는지 확인하는 것입니다.나는 일반적으로 사용하는 코드에서 필요하지 않기 때문에 이것을 제안합니다.

+1

00 : 00 : 00.000이 기본적으로 추가되어 시간 부분을 제거 할 수도 있습니다. – Scoregraphic

+0

Scoregraphic : 맞습니다. 문제를 해결하기 위해 가능한 가장 작은 수의 변경을 시도했습니다. 나는 개인적으로 'dd/mm/yyyy'의 형태로 모든 내 데이트 시간을 설정하지만 각자 자신에게 각각 설정합니다. – TheTXI

+0

질문 : "exec 명령을 사용하여 날짜에 큰 따옴표를 넣는 것으로 나타났습니다.하지만이를 제거 할 수 없습니다." 나는 원래 포스터가 여분의 큰 따옴표를 이미 알고 있다고 생각한다. 질문을 더 자세히 읽으면 왜 이것이 일어나는지 알고 싶어합니다. –

1

나는 그것의 큰 따옴표를 생각합니다. 프로파일 러는 하나의 주 sp_executesql 문과 단일 인용문을 이스케이프 처리하기 때문에 프로파일러에있는 것처럼 보일 수 있습니다. 그러나 당신이 가지고있는 성명서는 큰 따옴표가 아닌 큰 따옴표 여야합니다.

2

ASP.NET에서 저장 프로 시저를 어떻게 호출합니까? SqlCommand 개체를 사용하고 Parameters 컬렉션을 통해 명령에 매개 변수를 추가하고 있습니까?

일반적으로 Text 명령을 사용하지 않고 유형을 StoredProcedure로 설정합니다.

Dim conn As New SqlConnection("server=myserver;integrated security=sspi;initial catalog=mydb;") 
    Dim sql As String = "[dbo].[tblAccount_Save]" 
    Dim comm As System.Data.SqlClient.SqlCommand = New SqlCommand(sql, conn) 
    comm.CommandType = System.Data.CommandType.StoredProcedure 
    comm.Parameters.AddWithValue("@ID", id) 
    comm.Parameters.AddWithValue("@AccountNumber", number) 
    comm.Parameters.AddWithValue("@ClassID", class) 
    comm.Parameters.AddWithValue("@LastName", lastName) 
    comm.Parameters.AddWithValue("@FirstName", firstName) 
    comm.ExecuteNonQuery() 

당신이 코드 숨김에서 저장 프로 시저를 호출하는 방법에 대한 자세한 정보를 제공하십시오 : 다음 예는 5 개 매개 변수 "tblAccount_Save"라는 이름의 저장 프로 시저를 호출합니다.

감사합니다.

+0

감사합니다.이 매개 변수를 설정하는 것이 효과가 있다면이 비트를 사용해보아야했습니다. 그러나 불행하게도 그렇게하지 않았습니다. 지금까지와 같은 결과. – Zan

1

편집 4 : 알았습니다. 작동합니다. 도움을 주셔서 감사 드리며 문제가 생겨서 죄송합니다. 처음부터 결함이 없었습니다. @ id = default는 힌트 일 것임에 틀림 없다. 편집 페이지에 링크 된 부분에 오타가 있었는데 'jb_id'로 'job_id'를 설정 했으므로 실제 번호가 반환되지 않았습니다. 나는 이것을 놓쳤다는 것을 믿을 수 없어, 이것에 시간을 보냈다 ...

오, 잘 말했듯이, 도움에 감사드립니다. : D

+0

당신이 고칠 다행. 논쟁이 기본 SQL API에 의해 인용되는 방법에 대해 걱정할 필요가 전혀 없습니다. 그래서 그것은 당신이 발견 한 문제와 같은 것이 었습니다! –

관련 문제