복붙노트

[SQL] 어떻게 SQL 문에 사용자가 제공 한 입력을 추가 할 수 있습니까?

SQL

어떻게 SQL 문에 사용자가 제공 한 입력을 추가 할 수 있습니까?

나는 사용자가 제공 한 데이터를 사용하여 SQL 문을 만들려고하고 있습니다. 나는 C #에서 다음과 유사한 코드를 사용 :

var sql = "INSERT INTO myTable (myField1, myField2) " +
          "VALUES ('" + someVariable + "', '" + someTextBox.Text + "');";

var cmd = new SqlCommand(sql, myDbConnection);
cmd.ExecuteNonQuery();

그리고 VB.NET이 :

Dim sql = "INSERT INTO myTable (myField1, myField2) " &
          "VALUES ('" & someVariable & "', '" & someTextBox.Text & "');"

Dim cmd As New SqlCommand(sql, myDbConnection)
cmd.ExecuteNonQuery()

하나,

어떻게하면이 "올바른 방법"을해야합니까?

해결법

  1. ==============================

    1.사용 SQL을 매개 변수화.

    사용 SQL을 매개 변수화.

    (이러한 예는 C #에있는 VB.NET 버전은 아래 참조).

    ... @로 문자열 회씩 연결 바꾸기 자리하고, 그 후, 당신하는 SqlCommand에 값을 추가합니다. 당신은 확실히 그들이 @ 기호로 시작 있는지 확인 자유롭게 자리의 이름을 선택할 수 있습니다. 귀하의 예는 다음과 같습니다

    var sql = "INSERT INTO myTable (myField1, myField2) " +
              "VALUES (@someValue, @someOtherValue);";
    
    using (var cmd = new SqlCommand(sql, myDbConnection))
    {
        cmd.Parameters.AddWithValue("@someValue", someVariable);
        cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text);
        cmd.ExecuteNonQuery();
    }
    

    같은 패턴은 SQL 문의 다른 종류를 위해 사용된다 :

    var sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;";
    
    // see above, same as INSERT
    

    또는

    var sql = "SELECT myField1, myField2 FROM myTable WHERE myField3 = @someValue;";
    
    using (var cmd = new SqlCommand(sql, myDbConnection))
    {
        cmd.Parameters.AddWithValue("@someValue", someVariable);
        using (var reader = cmd.ExecuteReader())
        {
            ...
        }
        // Alternatively: object result = cmd.ExecuteScalar();
        // if you are only interested in one value of one row.
    }
    

    주의의 단어 : AddWithValue 좋은 출발점이며, 대부분의 경우에서 잘 작동합니다. 그러나 필요에 전달 값이 정확하게 대응하는 데이터베이스 필드의 데이터 유형과 일치하는 것이다. 그렇지 않으면 변환이 인덱스를 사용하는 쿼리를 방지하는 상황에서 끝낼 수 있습니다. 참고 또는 날짜 (이전 "n"은 제외) 등의 문자 / VARCHAR와 같은 일부 SQL Server 데이터 유형은 해당 .NET 데이터 형식이없는 것을. 이러한 경우, 올바른 데이터 유형 추가 대신 사용해야합니다.

    왜 그렇게해야합니까?

    다른 데이터베이스 액세스 라이브러리

  2. ==============================

    2.이 옵션 엄격한 켜기 및 옵션 완전 추론에 가정, vb.net에서 위키 답변에 대한 예제 코드입니다.

    이 옵션 엄격한 켜기 및 옵션 완전 추론에 가정, vb.net에서 위키 답변에 대한 예제 코드입니다.

    끼워 넣다

    Dim sql = "INSERT INTO myTable (myField1, myField2) " & 
              "VALUES (@someValue, @someOtherValue);"
    
    Using cmd As New SqlCommand(sql, myDbConnection)
        cmd.Parameters.AddWithValue("@someValue", someVariable)
        cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text)
        cmd.ExecuteNonQuery()
    End Using
    

    최신 정보

    Dim sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;"
    
    ' see above, same as INSERT
    

    고르다

    Dim sql = "SELECT myField1, myField2 FROM myTable WHERE myField3 = @someValue;"
    
    Using cmd As New SqlCommand(sql, myDbConnection)
        cmd.Parameters.AddWithValue("@someValue", someVariable)
        Using reader = cmd.ExecuteReader()
            ' ...
        End Using
        ' Alternatively: Dim result = cmd.ExecuteScalar()
        ' if you are only interested in one value of one row.
    End Using
    
  3. from https://stackoverflow.com/questions/35163361/how-can-i-add-user-supplied-input-to-an-sql-statement by cc-by-sa and MIT license