2016-12-14 4 views
0

私はVBでupdate Subクラスを作成しています。複数のデータを1回で更新したいので、QueryのUpdateの代わりにinsertクラスを使用しています。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は2つの異なるものです。 – Plutonix

+0

SQL Serverには 'ON DUPLICATE KEY'がありません。これがMySQLの場合は、SQL Serverタグを削除してください。 – cloudsafe

+0

「更新サブクラス」とは何ですか?リテラル値は少し奇妙になりますが、 'ingredientsID = 46、... IngredientName = 'Beans' ...'はうまくいくはずです – Plutonix

答えて

3

まず、決して連結文字列です:

は、ここに私のクエリです。成分のようなものに特殊文字(例:Palmer's Condensed Milk)が含まれていると失敗します。

SQLパラメータもデータ型を保持します.1つのスニペットによれば、文字列は1つのみですが、コードはそれらをすべてテキストに強制しています。さらに(最も重要なのは)SQLパラメータはSQLインジェクションを避けます。

あなたはMySQLのアップサートのために、このようなものが必要:

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リテラルを使用しています各値は、指定されたデータ型を持つパラメータです(MySqlDbType.DateTime
    • Usingブロックは、DbCOnnectionオブジェクトとDbCommandオブジェクトが正しく閉じられ、最後に廃棄されるため、アプリケーションがリソースをリークしないようにします。
    • UPDATE部分は同じパラメータを割り当てることによってデータを取得します。 MySql ON DUPLICATE KEY UPDATE Syntax

  • +0

    私はそのような長いコードを必要としないと思う..クエリにはエラーがあるだけです。 –

    +0

    @ArnoldBarrozoコードの長さの場合はありません。使用することがより安全な場合は、それを行います。コードが少なくてもそれが改善されるわけではありません。より良い、より長い選択肢があれば、それはちょっと面倒です。 – David

    +2

    奇妙なことに、誰かがこの回答を落としました。それで何が起こっているの! – Rahul

    0
    ingredientID= Values() <-- here 
    

    VALUES句が必要とされません。

    Liink - >On Duplicate Key Update same as insert

    +0

    括弧の中に値を入れる必要はありませんか? –

    +0

    エラーメッセージは同じです –

    +0

    どのようなエラーがありますか? MySQLから?またはVBから? –

    関連する問題