문제

나는 하나 이상의 문장을 포함하는 데이터베이스에 일부 필드를 저장하고 편집하고 있습니다. 텍스트 상자에 단일 견적을 입력하고 저장하려면 예외가 발생합니다." 'l'근처의 잘못된 구문. 캐릭터 문자열 이후의 깔끔한 따옴표 ''."그것을 피할 아이디어가 있습니까?

편집하다:쿼리는 다음과 같습니다.

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + 
    tbQuestion.Text + "]', Answer = '[" + 
    tbAnswer.Text + "]', LastEdit = '" + 
    CurrentUser.Login + 
    "'WHERE ID = '" + CurrentQuestion.ID + "'");
도움이 되었습니까?

해결책

KM이 말했듯이 이것을하지 마십시오!

하다 이것 대신에:

private static void UpdateQuestionByID(
    int questionID, string question, string answer, string lastEdited)
{
    using (var conn = new SqlConnection(connectionString))
    {
        conn.Open();
        const string QUERY =
            @"UPDATE Questions " +
            @"SET Question = @Question, Answer = @Answer, LastEdit = @LastEdited " +
            @"WHERE ID = @QuestionID";
        using (var cmd = new SqlCommand(QUERY, conn))
        {
            cmd.Parameters.AddWithValue("@Question", question);
            cmd.Parameters.AddWithValue("@Answer", answer);
            cmd.Parameters.AddWithValue("@LastEdited", lastEdited);
            cmd.Parameters.AddWithValue("@QuestionID", questionID);
            cmd.ExecuteNonQuery();
        }
    }
}

다른 팁

단일 견적을 SQL 필드에 포함시키려면 단일 따옴표를 사용하여 탈출하십시오.

'''Test''' = 'Text'

이것은 SQL Server 용입니다.

필드 편집을 수행하기 위해 저장된 신경을 작성하고 SQL 매개 변수를 사용하여 값을 저장하십시오. 따옴표는 중요하지 않습니다. 저장된 Proc를 원하지 않는 경우 적어도 매개 변수 마커로 SQL 텍스트를 빌드하고 SQL 매개 변수를 사용하십시오.

사용중인 데이터베이스 또는 응용 프로그램 언어를 나열하지 않기 때문에 구체적인 답변을 제공하기가 어렵습니다.

SQL을 동적으로 구축해야하며 Sting 내의 인용문은 문자열의 끝으로 해석됩니다. 사용중인 데이터베이스에 따라 SQL 명령에서 사용하려는 각 문자열 내에서 단일 따옴표를 피해야합니다. 쿼리를 실행하기 전에 인쇄하여 볼 수 있습니다.

귀하는 데이터베이스에서 호출하는 응용 프로그램에 대해서는 언급하지 않지만 명령을 작성할 때는 언어로 작성하거나 제공하는 Fix_Quotes () 명령을 사용해야합니다.

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + FIX_QUOTES(tbQuestion.Text) + "]', Answer = '[" + FIX_QUOTES(tbAnswer.Text) + "]', LastEdit = '" + FIX_QUOTES(CurrentUser.Login) + "'WHERE ID = '" + FIX_QUOTES(CurrentQuestion.ID) + "'"); – A

이러한 유형의 동적 쿼리는 매우 쉽습니다. SQL 주입 공격. 저장된 절차 또는 매개 변수 목록이있는 데이터베이스를 호출하는 것이 좋습니다.

MSSQL에서는 인용문을 두 배로 올릴 수 있습니다.

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''

일부 사람들이 이미 말했듯이, 추가 인용문을 추가하면 트릭이됩니다. 이것이 Oracle의 경우에도 그러한 경우임을 확인할 수 있습니다 (다른 사람들은 MSSQL 및 SQL Server에 유효한이 답변을 제공했습니다). 저장된 절차를 사용하는 것이이를 위해 과잉이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top