Member 13264296 Ответов: 2

Как я параметризовал запросы VB.NET код


Мне нужно параметризовать свои запросы в целях безопасности.

Что я уже пробовал:

 Private Sub Save_Click(sender As Object, e As EventArgs) Handles Save.Click
       
        MyNonQuery(String.Format("insert into boyscout_pos.tblproducts (Purchase_Invoice,Product_Code,Product_Name,Category,Size,Product_Price,Selling_Price,Qty_Stock) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')", txtpurchaseinvoice.Text, txtproductcode.Text, txtproductname.Text, txtproductcategory.Text, TextBoxSize.Text, txtproductprice.Text, txtsellingprice.Text, txtproductquantity.Text))

        MessageBox.Show("Successfully Saved")

        TxtSearchCode.Clear()
        cboproductsize.Items.Clear()
        txtproductcode.Clear()
        txtproductname.Clear()
        txtproductcategory.Clear()
        txtproductprice.Clear()
        txtsellingprice.Clear()
        TextBoxSize.Clear()
        cboproductsize.Text = ""
        txtproductquantity.Clear()
End Sub
    
Public Sub MyNonQuery(ByVal SQCommand As String)
       Dim conn As New 
       MySqlConnection("server=localhost;userid=root;password=;database=boyscout_pos")
       Dim SQLCMD As New MySqlCommand(SQCommand, conn)
       conn.Open()
       SQLCMD.ExecuteNonQuery()
       conn.Close()
End Sub

Patrice T

А, д Что говорит гугл на вашем месте ?

Dave Kreskowiak

Тип "vb.net параметризуйте запросы mysql" в Google, и вы увидите, что это было задокументировано много-много раз.

2 Ответов

Рейтинг:
15

OriginalGriff

Вы хотите в конечном итоге получить такой код:

Using con As New MySqlConnection(strConnect)
	con.Open()
	Using com As New MySqlCommand("INSERT INTO myTable (myColumn1, myColumn2) VALUES (@C1, @C2)", con)
		com.Parameters.AddWithValue("@C1", myValueForColumn1)
		com.Parameters.AddWithValue("@C2", myValueForColumn2)
		com.ExecuteNonQuery()
	End Using
End Using
Это означает, что то, как вы это делаете, не будет работать - вы не можете просто передать строку в "универсальную" функцию.


Рейтинг:
0

Richard Deeming

Если вы используете Visual Studio 2015 или выше и ориентируетесь на .NET 4.6 или более позднюю версию, то что-то вроде этого будет работать:

Public Shared Function CreateCommand(ByVal connection As IDbConnection, ByVal commandText As FormattableString, Optional ByVal commandType As CommandType = CommandType.Text) As IDbCommand
    Dim result As IDbCommand = connection.CreateCommand()
    
    Dim parameterNames As New List(Of String)(commandText.ArgumentCount)
    For Each parameter As Object In commandText.GetArguments()
        Dim parameterName As String = "@p" & parameterNames.Count
        parameterNames.Add(parameterName)
        
        Dim p As IDbDataParameter = result.CreateParameter()
        p.ParameterName = parameterName
        p.Value = parameter
        result.Parameters.Add(p)
    Next
    
    result.CommandText = String.Format(commandText.Format, parameterNames.ToArray())
    result.CommandType = commandType
    Return result
End Function

Public Sub MyNonQuery(ByVal commandText As FormattableString, Optional ByVal commandType As CommandType = CommandType.Text)
    Using connection As New MySqlConnection("server=localhost;userid=root;password=;database=boyscout_pos")
        Using command As IDbCommand = CreateCommand(connection, commandText, commandType)
            connection.Open()
            command.ExecuteNonQuery()
        End Using
    End Using
End Sub

...

MyNonQuery($"insert into boyscout_pos.tblproducts (Purchase_Invoice, Product_Code, Product_Name, Category, Size, Product_Price, Selling_Price, Qty_Stock) values ({txtpurchaseinvoice.Text}, {txtproductcode.Text}, {txtproductname.Text}, {txtproductcategory.Text}, {TextBoxSize.Text}, {txtproductprice.Text}, {txtsellingprice.Text}, {txtproductquantity.Text})")

Такое использование интерполяция строк[^] передать текст команды и параметры как один объект. Путем передачи его в качестве FormattableString[^], он способен извлекать значения параметров и передавать их должным образом, а не объединять их в текст команды.

(NB: Я не придумал эту идею - я видел ее в статье, которая, по-моему, была где-то на CodeProject. К сожалению, я не сохранил ссылку и не могу найти ее сейчас. Если автор заметит это и захочет, чтобы я добавил ссылку, дайте мне знать.)