2016-09-21 14 views
0

私はDatagridviewを使用しており、セル値を取得しています。私がする必要があるのは、DatagridViewのセルの中にpiecesという文字列の値がある場合、私はそれを 'None'という名前で変更します。私はすでにcaseクエリを使用しています、そして、私はこれが私の問題を解決する正解ではないと思います。みんな助けてくれますか? これは私のコードですが、私はすでに何をしていますか。MySqlクエリ内でvb.net条件を追加するには

For k As Integer = 0 To dtgOrder.RowCount - 1 
       objconn.Open() 
       cmbQuery = "SELECT product_quantity.Quantity As 'quant_test' from product_quantity 
          INNER join product_table on product_quantity.Product_ID = product_table.Product_ID 
          where product_size.Size_Name 
          = '" & If dtgOrder.Rows(k).Cells(3).Value = "pieces" Then 
            dtgOrder.Rows(k).Cells(3).Value = "None" 
            End If & "'" 
       objcmd = New MySqlCommand(cmbQuery, objconn) 
       objdr = objcmd.ExecuteReader 
       While objdr.Read 
        quantitytesting = objdr.GetInt32("quant_test") 
       End While 
       objconn.Close() 
Next 

そして、これは、MySQLを使用してCaseにすでに私のクエリであると私はまた私の上記のクエリですでにそれを適用します。

SELECT product_quantity.Quantity As 'quant_test' from product_quantity 
    INNER join product_table on product_quantity.Product_ID = product_table.Product_ID 
    where product_size.Size_Name 
= (Case when '"& dtgOrder.Rows(k).Cells(3).Value = "pieces" &"' Then 'None' Else '"& dtgOrder.Rows(k).Cells(3).Value &"')" 
+0

SQL Serverでは、VBからの値を渡して、SQLのコードを次のように記述します。 'WHERE product_size.Size_Name = coalesce(nullif(@ Cell3Value、' pieces ')' None ') ' MySqlには 'NULLIF()'関数があります。 ... ...うーん、すばらしいGoogle検索ではそうだと言います。 –

答えて

0

最初に、そしてこれまでで最も重要なことで、理解する事は、あなたがSQLクエリに値を入れるNEVER使用の文字列の連結をべきであるということです。あなたが今までに持っているコードは、あなたのDBをハックするよう求めています。

ここには2つの解決策があります。 VBで

Const SQL As String = _ 
    "SELECT product_quantity.Quantity As 'quant_test' " & 
    " FROM product_quantity " & 
    " INNER join product_table on product_quantity.Product_ID = product_table.Product_ID " & 
    " WHERE product_size.Size_Name = @SizeName" 
         = ' 
Using cn As New MySlConnection("connection string here"), 
     cmd As New MySqlCommand(SQL, cn) 

    Dim p As MySqlParameter = cmd.Parameters.Add("@SizeName", MySqlDbType.VarString) 
    cn.Open() 

    For Each row As DataGridViewRow In dtgOrder.Rows 
     p.Value = If(row.Cells(3).Value = "pieces", "None", row.Cells(3).Value) 
     Using objdr As MySqlDataReader = cmd.ExecuteReader() 
      While objdr.Read 
       quantitytesting = objdr.GetInt32("quant_test") 
      End While 
     End Using 
    Next 
End Using 

あり、元を超えるこのコードへの重要な改善点の数があるので、将来の使用のためのパターンを研究。しかし私がここにいる間、DataGridViewを使ってこのようなクエリをループ内で見ることは非常に奇妙であると付け加えます。そのDataGridViewの行はほとんど確実にデータベースから来ています。つまり、ループを一切必要とせずに、結果を生成するための単一のクエリを構築できるはずです。これを単一のクエリにすることは、より多く、これを複数回実行するよりもはるかに良いになります。 SQLで

:私は最初のを好む2つのIのオプションの

Const SQL As String = _ 
    "SELECT product_quantity.Quantity As 'quant_test' " & 
    " FROM product_quantity " & 
    " INNER join product_table on product_quantity.Product_ID = product_table.Product_ID " & 
    " WHERE product_size.Size_Name = COALESCE(NULLIF(@SizeName, 'pieces'),'None')" 
         = ' 
Using cn As New MySlConnection("connection string here"), 
     cmd As New MySqlCommand(SQL, cn) 

    Dim p As MySqlParameter = cmd.Parameters.Add("@SizeName", MySqlDbType.VarString) 
    cn.Open() 

    For Each row As DataGridViewRow In dtgOrder.Rows 
     p.Value = row.Cells(3).Value 
     Using objdr As MySqlDataReader = cmd.ExecuteReader() 
      While objdr.Read 
       quantitytesting = objdr.GetInt32("quant_test") 
      End While 
     End Using 
    Next 
End Using 

...クライアントアプリは、この特定の仕事ではなく、データベースの操作を行います。私はこれを投稿しています。なぜなら、これを単一のSQL文にしようとすると、このロジックが必要になるかもしれないからです。

+0

ああ。大丈夫です。挿入時にはどうなりますか?エラーが発生しました:objcmdの場合 .Connection = cn .CommandText = "Order_table(Order_ID、Product_ID、Order_Quantity、Size_ID、Order_Date)の値をNULLに挿入します(product_tableからProduct_IDを選択します。Product_Name ="& "@ Prod、クワント、CURRENT_TIMESTAMPを(Size_Name = @SizeNam product_sizeからSize_IDを選択)); – Rhamnold

+0

同じことと " .ExecuteNonQuery() 終了:あなたのSQLを構築するために、**、ない文字列の連結**パラメータ化クエリを使用すると。 INSERT文のvalues節をSELECT文で置き換えることができます。INSERT INTO Order_Table(Product_ID、Order_Quantity、Size_ID、Order_date)SELECT Product_ID、@Quant、Size_ID、current_timestamp FROM Product_Table p INNER JOIN Product_Size ON ...どこに... –

関連する問題