2013-01-09 2 views
0

이것은 데이터베이스에 데이터를 삽입하려고 시도하는 코드 조각입니다. 구문 오류가 발생하지 않았지만 데이터를 제출하지 않았습니다.내 코드에서 예외에 관한 해결책이 필요합니다.

System.Data.OleDb.OleDbException : INSERT INTO 문의 구문 오류

Sub submit(ByVal sender As Object, ByVal e As EventArgs) Dim objConn As New OleDbConnection Dim objCmd As New OleDbCommand Dim strConnString, strSQL As String strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Server.MapPath("Mydatabase.mdb") & "" strSQL = "INSERT INTO tblRecord (CNIC,Names,City,Address,Number) " & " VALUES " & " ('" & cnic.Text & "','" & name.Text & "','" & city.Text & "','" & postal.Text & "','" & phone.Text & "')" objConn.ConnectionString = strConnString objConn.Open() With objCmd .Connection = objConn .CommandText = strSQL .CommandType = CommandType.Text End With Try objCmd.ExecuteNonQuery() Label1.Text = "Record Inserted Sucessfully." Label1.Visible = True Catch ex As Exception Label1.Visible = True Label1.Text = "Record Cannot Insert" & ex.ToString() End Try objConn.Close() End Sub 

내가 얻을 예외입니다.
System.Data.OleDb.OleDbCommand.ExecuteCommandText에서 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult의 시간)에서 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult
(tagDBPARAMS dbParams, & executeResult 개체)에서

(System.Data.OleDb.OleDbCommand.ExecuteCommand (CommandBehavior를 동작에서
, System.Data에서) System.Data.OleDb.OleDbCommand.ExecuteReaderInternal에서
(CommandBehavior를 행동, 문자열 방법)
을 & executeResult 객체 객체 & executeResult). OleDb.OleDbCommand.Execut eNonQuery() ASP.registration_aspx.submit (개체 보낸 사람, 전자 EventArgs입니다) C에서에서
: \ 문서 및 설정 \ 마이 라 ALVI은 \ 내 문서 \ 비주얼 스튜디오 2005 \ 웹 사이트를 설정 \ WEBSITE3 Registration.aspx \ 라인 (32)

+0

SQL Management Studio에서 SQL을 직접 실행하면 어떻게됩니까? –

+0

'INSERT INTO 문에서 구문 오류가 발생했습니다 .' 실행 전에'strSQL'의 값을 확인하십시오. 구문 오류가 있습니다. – Oded

+3

그건 그렇고 -이 코드는 [SQL 주입] (http://en.wikipedia.org/wiki/SQL_injection)에 열려 있습니다. [매개 변수가있는 쿼리] (http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html)를 사용해야합니다. 당신도 가지고있는 문제. – Oded

답변

0

구문 오류가 있습니다. 예외로 표시됩니다. SQL Insert 문에 대해 작성중인 문자열을 살펴보십시오. 어딘가 끝에 '이 없다는 것이 확실합니다.

기본적으로 SQL 문을 작성하는 것은 매우 나쁜 방법입니다. string.Format을 사용하면이 기능을 향상시킬 수 있지만 SQL Injection 공격을받을 수는 있습니다.

매개 변수를 사용하여 값을 추가하는 것이 훨씬 좋습니다. Here's an example of how to do it right.

+0

Insert INSERT INTO tblRecord (CNIC, 이름, 도시, 주소, 번호) VALUES ('31201-1234567-9 ','jj ','hjkhj ' , 'hjhkj', '12345678910') 이것은 strSQL의 값입니다 –

+0

전화 필드의 크기는 얼마입니까? 11자를 삽입 한 것처럼 보입니다. 대부분의 전화 번호는 10 자리이므로 열이 넘칠 수 있습니다. – CodeRedick

1

내 생각에 입력 필드 중 하나에 이스케이프 처리되지 않은 문자 (예 : ')가 포함되어 있습니다. 매개 변수화 된 쿼리로 전환하면 문제를 해결할 수있을뿐 아니라 SQL 주입과 같은 다른 문제를 방지 할 수 있습니다.

//change query to use parameters 
strSQL = "INSERT INTO tblRecord (CNIC,Names,City,Address,Number) VALUES (?,?,?,?,?);" 

... 

With objCmd 
    .Connection = objConn 
    .CommandText = strSQL 
    .CommandType = CommandType.Text 
    //add parameters using inputs for values 
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = cnic.Text; //assumes varchar(50) 
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = name.Text; //assumes varchar(50) 
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = city.Text; //assumes varchar(50) 
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = postal.Text; //assumes varchar(50) 
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = phone.Text; //assumes varchar(50) 
End With 
관련 문제