2012-06-13 6 views
2

우리 회사를위한 웹 매핑 응용 프로그램 인트라넷을 개발 중입니다. 지도에 "다각형 추가"기능을 생성합니다. AspMap, VB.NET 및 SQL Server를 사용합니다. 사용자가 웹 양식 입력 데이터 특성에서 새 레코드를 추가하기 위해 단추를 클릭하면 오류 '?'근처의 구문이 잘못되었습니다.이 발생합니다. "는 스칼라 변수를 선언해야합니다 : 여기에SqlCommand 자리 표시 자 매개 변수 : " '근처에 구문이 잘못되었습니다."및 "스칼라 변수 @param을 선언해야합니다"?

Dim sql As String = "INSERT INTO " & tableName & " (CHECKLIST_ID, TYPE, SHAPEDATA, ADDRESS_AREA, DMZ, CUSTOMERID, SOURCE, AREA, INSTALATUR, DEVELOPER, DATA_RECEIVED, DOC_DATA, DATA_SENT, REMARK) VALUES *(?,?,?,?,?,?,?,?,?,?,?,?,?,?) 

:

Private Sub AddNewShape(ByVal checklist_id As String, ByVal type As String, ByVal shape As AspMap.Shape, ByVal address_area As String, ByVal dmz As String, ByVal customerid As String, ByVal source As String, ByVal area As String, ByVal instalatur As String, ByVal developer As String, ByVal data_received As DateTime, ByVal doc_data As DateTime, ByVal datereport As DateTime, ByVal remark As String) 
    Dim tableName As String 

    Select Case shape.ShapeType 
     Case AspMap.ShapeType.Line 
      tableName = "lines" 
     Case AspMap.ShapeType.Polygon 
      tableName = "sambungan_baru" 
     Case Else 
      Return 
    End Select 

    Dim conn As SqlConnection = GetDbConnection() 
    Dim sql As String = "INSERT INTO " & tableName & " (CHECKLIST_ID, TYPE, SHAPEDATA, ADDRESS_AREA, DMZ, CUSTOMERID, SOURCE, AREA, INSTALATUR, DEVELOPER, DATA_RECEIVED, DOC_DATA, DATA_SENT, REMARK) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)" 

    Dim cmd As SqlCommand = New SqlCommand(sql, conn) 
    cmd.Parameters.AddWithValue("CHECKLIST_ID", checklist_id) 
    cmd.Parameters.AddWithValue("TYPE", type) 
    cmd.Parameters.AddWithValue("SHAPEDATA", shape.ShapeData) 
    cmd.Parameters.AddWithValue("ADDRESS_AREA", address_area) 
    cmd.Parameters.AddWithValue("DMZ", dmz) 
    cmd.Parameters.AddWithValue("CUSTOMERID", customerid) 
    cmd.Parameters.AddWithValue("SOURCE", source) 
    cmd.Parameters.AddWithValue("AREA", area) 
    cmd.Parameters.AddWithValue("INSTALATUR", instalatur) 
    cmd.Parameters.AddWithValue("DEVELOPER", developer) 
    cmd.Parameters.AddWithValue("DATA_RECEIVED", data_received) 
    cmd.Parameters.AddWithValue("DOC_DATA", doc_data) 
    cmd.Parameters.AddWithValue("DATA_SENT", datereport) 
    cmd.Parameters.AddWithValue("REMARK", remark) 

    cmd.ExecuteNonQuery() 
    conn.Close() 

    ReloadShapesDatabase() 
End Sub 

내가이 변경 :

내 코드는

Dim sql As String = "INSERT INTO " & tableName & " (CHECKLIST_ID, TYPE, SHAPEDATA, ADDRESS_AREA, MZ, CUSTOMERID, SOURCE, AREA, INSTALATUR, DEVELOPER, DATA_RECEIVED, DOC_DATA, DATA_SENT, REMARK)(@checklist_id, @type, @shapedata, @address_area, @dmz, @conection, @source, @area, @instalatur, @developer, @data_received, @doc_data, data_sent, @remark)" 

그리고 경고로 실행 @ 연결 ". 아무도 도와 줄 수 있습니까?

+1

이 수정 된 삽입 문 바로 오타의 키워드 "값"을 놓치게되었다 :

그렇지 않으면이 문제에 도움이 있는지 확인? –

답변

1

매개 변수를 지정해야하며 "CONECTION"매개 변수에 값을 입력하지 못한 경우를 지정해야합니다. 또한 추가 참고 사항으로 블록을 사용하여 항상 연결 개체를 묶어야합니다. this을 참조하고 "비고"절을보십시오.

command.CommandText = "INSERT INTO Table (Col1, Col2, Col3) VALUES _ 
        (@Col1Val, @Col2Val, @Col3Val)" 
command.Parameters.AddWithValue("@Col1Val","1"); 
command.Parameters.AddWithValue("@Col2Val","2"); 
command.Parameters.AddWithValue("@Col3Val","3"); 
+0

안녕하세요. Ashish .. 당신의 제안에 대해 감사합니다. odbcCommand를 sqlcommand로 변경했습니다. 하지만 여전히 위와 같은 문제가 있습니다. – kikiwisaka

4

SQL 쿼리에는 두 가지 다른 스타일의 매개 변수가 있습니다. ODBC 구문은 간단한 자리 표시 자 '?'를 사용합니다. 각 매개 변수에 대한 문자가 있으며 매개 변수는 매개 변수 컬렉션에 추가 한 것과 동일한 순서로 바뀝니다. OdbcCommand의 경우 매개 변수에 지정한 이름은 무시되며 그 순서 만 중요합니다.

SqlCommand의 경우 매개 변수 이름은 의미가 있습니다. 명령이 실행되면 매개 변수 이름 및 값의 목록을 가져와 T-SQL 쿼리로 대체하는 SQL 저장 프로 시저를 통해 실행됩니다. 이 경우 쿼리에 매개 변수를 추가하는 순서는 중요하지 않지만 이름이 올바른지 확인해야합니다 ("@"접두사 포함).

매개 변수가있는 SqlCommand을 사용하는 적절한 방법은 다음과 같습니다. 다음과 같이

// The SQL Query: Note the use of named parameters of the form 
// @ParameterName1, @ParameterName2, etc. 
Dim sql As String = "INSERT INTO " & tableName & _ 
" (CHECKLIST_ID, TYPE, SHAPEDATA) " & _ 
"VALUES " & _ 
" (@ChecklistId, @Type, @ShapeData)" 

// The Parameter List. Note that the Parameter name must exactly match 
// what you use in the query: 
Dim cmd As SqlCommand = New SqlCommand(sql, conn) 
cmd.Parameters.AddWithValue("@CheckListId", checklist_id) 
cmd.Parameters.AddWithValue("@Type", type) 
cmd.Parameters.AddWithValue("@ShapeData", shape.ShapeData) 

cmd.ExecuteNonQuery() 
+0

안녕 마이클, 제안 주셔서 감사합니다. 나는 '?,? ..'을 '@'접두사로 바꾸고 오류는 이제 : "A.사용자 정의 루틴 또는 집계 "지오메트리"실행 중에 NET Framework 오류가 발생했습니다. System.FormatException : 식별 된 항목 중 하나가 잘못된 형식으로되어 있습니다. SqlGeometry ::. DeserializeValidate (IntPtr, Int32, CClrLobContext *) 에서 Microsoft.SqlServer.Types.GeoData.Read (BinaryReader r) 의 System.FormatException : . 문장이 종료되었습니다. "의미는 무엇입니까? – kikiwisaka

+0

결과 컬럼 중 하나에 유효하지 않은 데이터가 있다는 오류가 발생했습니다. 오류로 인해 GEOGRAPHY 데이터 유형 컬럼을 읽으려는 것으로 나타납니다 SQL하지만 거기에 포함 된 값이 유효한 지리적 데이터가 아닌 것 같습니다. –

+0

geometry에서 geograpghy로 데이터 유형을 변경하려고했지만 여전히 작동하지 않습니다. AspMap을 매핑 엔진으로 사용하고 있습니다. SQL Server 2008에서 기하학/지리와 호환되는 데이터 형식이 아닙니다. – kikiwisaka

0

Dim cmd As SqlCommand = New SqlCommand(sql, conn) 열린 연결 conn를 사용 있는지 확인하십시오.

그런 다음 데이터베이스 테이블 정의에 따라 매개 변수 유형을 확인하십시오. 또한, 문자열 유형을 사용하는 경우 삽입 된 텍스트의 앞과 뒤에 '을 추가 할 수 있습니다.

확실하게 cmd.ExecuteNonQuery()을 중단하고 연결된 명령의 값을 복사하여 SQL 관리자 도구로 복사 할 수 있습니다.

마지막으로 cmd을 처리하십시오. http://social.msdn.microsoft.com/Forums/en-US/sqlspatial/thread/9d75106a-b0d4-49cc-ac86-d41cba4ab797

관련 문제