2016-12-14 1 views
0

VB에서 update Sub 클래스를 만들고 여러 데이터를 한 번에 업데이트하려고하기 때문에 Query에서 Update 대신 Insert를 사용합니다.삽입 명령을 사용하여 MySQL DB로 업 그레 이드

이 여러 데이터를 업데이트 내 참조입니다 : SQL - Update multiple records in one query

하지만 난 그것을 실행할 때 오류 메시지가 있습니다.

"SQL 문의 끝에 세미콜론 (;)이 누락되었습니다."

하지만 검색어 끝에는 세미콜론이 있습니다.

Insert into IngredientStock(IngredientID,CategoryId,UnitID,IngredientName,Price) 
values(46,2,1,'Beans', 100) ON DUPLICATE KEY 
UPDATE 
    ingredientID= Values(IngredientID), 
    CategoryID = Values(CategoryID), 
    UnitID = Values(UnitID), 
    IngredientName = Values(IngredientName), 
    Price = values(Price); 

가 여기에 SQL 쿼리를 작성하는 내 업데이트 하위 클래스

Sub UpdateInfo(ByVal table As String, ByVal PrimaryKey As String, ByVal C1 As String, ByVal C2 As String, ByVal C3 As String, ByVal C4 As String, ByVal Datas As String) 
    con.Close() 
    con.Open() 
    Query = "Insert into " & table & "(" & PrimaryKey & "," & C1 & "," & C2 & "," & C3 & "," & C4 & ") values (" & Datas & ") ON DUPLICATE KEY UPDATE " & PrimaryKey & "= Values(" & PrimaryKey & "), " & C1 & " = values(" & C1 & ")," & C2 & " = values(" & C2 & "), " & C3 & " = values(" & C3 & ")," & C4 & " = values(" & C4 & ");" 
    cmd = New OleDbCommand(Query, con) 
    DR = cmd.ExecuteScalar 
    con.Close() 
End Sub 
+0

데이터베이스를 선택하십시오 : SQL Server와 MySQL은 서로 다른 두 가지입니다. – Plutonix

+0

SQL Server에 '중복 키 없음'이 없습니다. 이것이 MySQL 인 경우 SQL Server 태그를 제거 할 수 있습니까? – cloudsafe

+0

이제 "업데이트 하위 클래스"가 무엇인지 설명하십시오. 리터럴 값으로 인해 약간 이상하지만, 'ingredientID = 46, ... IngredientName ='Beans' ...가 작동해야합니다. – Plutonix

답변

3

첫째, 결코 이제까지 CONCAT 문자열입니다 :

여기 내 쿼리입니다. 성분과 같은 특수 문자 (예 : Palmer's Condensed Milk)가 있으면 실패합니다.

SQL 매개 변수도 데이터 유형을 보존합니다. 하나의 스 니펫에 따르면 하나의 항목 만 문자열이지만 코드는 모두 텍스트로 강제 전송합니다. 또한 (가장 중요한 것은) SQL 매개 변수는 SQL 주입을 피합니다.

Dim sql = <sql> 
      INSERT INTO SampleZ 
        (Id, Name, Country, Animal, Color, Price, ItemDate, Active) 
      VALUES 
        (@id, @n, @c, @a, @clr, @p, @dt, @act) 
      ON DUPLICATE KEY UPDATE 
        [email protected], [email protected], 
        [email protected], [email protected], [email protected], 
        [email protected], [email protected] 
       WHERE id = @id 
      </sql>.Value 

Using dbcon As New MySqlConnection(connStr) 
    Using cmd As New MySqlCommand(sql, dbcon) 

     cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = thisID 
     If thisID = -1 Then 
      cmd.Parameters("@id").Value = DBNull.Value 
     End If 

     cmd.Parameters.Add("@n", MySqlDbType.String).Value = TextBox1.Text 
     cmd.Parameters.Add("@c", MySqlDbType.String).Value = ComboBox1.Text 
     cmd.Parameters.Add("@a", MySqlDbType.String).Value = TextBox2.Text 
     cmd.Parameters.Add("@clr", MySqlDbType.String).Value = TextBox3.Text 

     cmd.Parameters.Add("@p", MySqlDbType.Decimal).Value = NumericUpDown1.Value 
     cmd.Parameters.Add("@dt", MySqlDbType.DateTime).Value = DateTimePicker1.Value 
     cmd.Parameters.Add("@act", MySqlDbType.Bit).Value = chkActive.Checked 

     dbcon.Open() 
     Dim rows = cmd.ExecuteNonQuery() 

    End Using 
End Using 

중요 사항 : 쿼리 의미를

  • 를 만들기 위해 포맷 할 수 있도록 위의 리터럴 XML을 사용

    • 당신은 MySQL의 Upsert이 같은 뭔가가 필요 각 값은 지정된 데이터 유형의 매개 변수입니다 (MySqlDbType.DateTime

    • Using 블록은 DbCOnnection 및 DbCommand 개체가 제대로 닫히고 마지막에 처리되므로 응용 프로그램에서 누출 리소스가 누출되지 않습니다.
    • UPDATE 부분은 동일한 매개 변수를 할당하여 데이터를 가져옵니다. MySql ON DUPLICATE KEY UPDATE Syntax

  • +0

    내가 긴 코드를 필요로하지 않는다고 생각합니다. 내 쿼리에는 오류가 있습니다. –

    +0

    @ArnoldBarrozo 코드의 길이는 아닙니다. 사용하는 것이 더 안전하고 효과가 있다면 작동하십시오. 코드가 적어지면 더 나아지지 않으며 더 좋고 더 오래 걸리는 대안이 있다면 게으르다. – David

    +2

    이상한 사람은이 대답을 downvoted. 무슨 일 이니? – Rahul

    0
    ingredientID= Values() <-- here 
    

    값 절은 필요하지 않습니다.

    Liink ->On Duplicate Key Update same as insert

    +0

    그래서 괄호 안에 값을 넣을 필요가 없습니까? –

    +0

    오류 메시지가 여전히 동일합니다. –

    +0

    어떤 오류가 있습니까? MySQL로부터? 또는 VB에서? –

    관련 문제