Member 13268442 Ответов: 1

{"Не разрешено изменять свойство connectionstring. Текущее состояние соединения открыто."}


Sub SaveData()
        MainForm.Cursor = Cursors.WaitCursor
        Dim SqlStr As String = ""

        'If IsOpenForAlter = True Then
        SqlStr = "UPDATE Assets SET [dbo].[AssetID]=@AssetID [AssetBarcode]=@AssetBarcode,[AssetName]=@AssetName,[AssetType]=@AssetType,[AssetDesc]=@AssetDesc,[Store]=@Store,[AssetLocation]=@AssetLocation,[Manufacture]=@Manufacture,[Brand]=@Brand,[Model]=@Model,[AssetMore]=@AssetMore,[AssetSNo]=@AssetSNo,[AssetTotal]=@AssetTotal,[Status]=@Status,[Condition]=@Condition,[AssetExpiry]=@AssetExpiry,[AssetNotes]=@AssetNotes,[PhotoPath]=@PhotoPath,[AssetVendor]=@AssetVendor,[AssetPurRate]=@AssetPurRate,[AssetScrap]=@AssetScrap,[AssetYear]=@AssetYear,[AssetPurDate]=@AssetPurDate,[AssetServiceStartDate]=@AssetServiceStartDate,[AssetWarranty]=@AssetWarranty,[AssetDepreciation]=@AssetDepreciation,[AssetDepreciationRate]=@AssetDepreciationRate, WHERE AssetName=N'" & OpenedAssetName & "'"
        'Else
        SqlStr = "INSERT INTO [dbo].[Assets] ([AssetID],[AssetBarcode],[AssetName],[AssetType],[AssetDesc],[Store],[AssetLocation],[Manufacture],[Brand],[Model],[AssetMore],[AssetSNo],[AssetTotal],[Status],[Condition],[AssetExpiry],[AssetNotes],[PhotoPath],[AssetVendor],[AssetPurRate],[AssetScrap],[AssetYear],[AssetPurDate],[AssetServiceStartDate],[AssetWarranty],[AssetDepreciation],[AssetDepreciationRate])     VALUES " _
     & " (@AssetID,@AssetBarcode,@AssetName,@AssetType,@AssetDesc,@Store,@AssetLocation,@Manufacture,@Brand,@Model,@AssetMore,@AssetSNo,@AssetTotal,@Status,@Condition,@AssetExpiry,@AssetNotes,@PhotoPath,@AssetVendor,@AssetPurRate,@AssetScrap,@AssetYear,@AssetPurDate,@AssetServiceStartDate,@AssetWarranty,@AssetDepreciation,@AssetDepreciationRate) "

        'End If
        Try
            MAINCON.ConnectionString = ConnectionStrinG
            MAINCON.Open()
            Dim DBF As New SqlClient.SqlCommand(SqlStr, MAINCON)
            With DBF.Parameters

                If Integer.TryParse(TxtAssetID.Text, id) Then
                    DBF.Parameters.AddWithValue("@AssetID", id)
                Else
                    '' The text in the textbox was not a valid integer representation.
                    '' You may have to handle that case here.
                End If
                .AddWithValue("@AssetID", Integer.Parse(TxtAssetID.Text))
                .AddWithValue("@AssetBarcode", TxtAssetBarcode.Text)
                .AddWithValue("@AssetName", TxtAssetName.Text)
                .AddWithValue("@AssetType", TxtAssetType.Text)
                .AddWithValue("@AssetDesc", TxtDescr.Text)
                .AddWithValue("@Store", TxtStoreName.Text)
                .AddWithValue("@AssetLocation", TxtLocation.Text)
                .AddWithValue("@Manufacture", TxtManufacture.Text)
                .AddWithValue("Brand", TxtBrand.Text)
                .AddWithValue("@Model", TxtModel.Text)
                .AddWithValue("@AssetMore", TxtMoreInfo.Text)
                .AddWithValue("@AssetSNo", TxtSerialNumber.Text)
                .AddWithValue("@AssetTotal", TxtQty.Text)
                .AddWithValue("@Status", TxtAssetStatus.Text)
                .AddWithValue("@Condition", txtCondition.Text)
                .AddWithValue("AssetExpiry", TxtExpiry.Value)
                .AddWithValue("@AssetNotes", TxtNote.Text)
                .AddWithValue("@PhotoPath", PhotoPathForLedgers & "\Others\" & TxtAssetName.Text & ".jpg")
                .AddWithValue("@AssetVendor", TxtVendorName.Text)
                .AddWithValue("@AssetPurRate", TxtPurRate.Text)
                .AddWithValue("@AssetScrap", TxtScrapValue.Text)
                .AddWithValue("@AssetYear", TxtYears.Text)
                .AddWithValue("@AssetPurDate", TxtpurchaseDate.Value)
                .AddWithValue("@AssetServiceStartDate", TxtServiceStartDate.Value)
                .AddWithValue("@AssetWarranty", TxtWarrantyDate.Value)
                .AddWithValue("@AssetDepreciation", TxtDepreMethod.Text)
                .AddWithValue("@AssetDepreciationRate", TxtDepRate.Text)


            End With
            DBF.ExecuteNonQuery()
            DBF = Nothing
            MAINCON.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Dim OpenedID As Integer = 1
        Dim cnn As SqlConnection
        cnn = New SqlConnection(ConnectionStrinG)
        cnn.Open()
        Dim ds As New DataSet()
        MainForm.Cursor = Cursors.WaitCursor


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

я понятия не имею об этом никто мне не поможет заранее спасибо

MadMyche

Помогите нам помочь вам, отформатировав ваш код и поместив его в кодовый блок. Чем легче нам читать, тем легче помочь вам

Richard Deeming

".. [AssetDepreciationRate]=@AssetDepreciationRate, WHERE AssetName=N'" & OpenedAssetName & "'"


Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Вы уже знаете, как использовать параметры; вы делаете это буквально для всего остального в этом запросе. Так почему же вы сдались в конце концов?

Кроме того, в этом запросе есть случайная запятая между последним параметром и WHERE.

1 Ответов

Рейтинг:
1

OriginalGriff

Посмотрите на сообщение об ошибке:

Цитата:
Не разрешается изменять свойство connectionstring. Текущее состояние соединения открыто.
Это не может быть яснее: вы пытаетесь установить свойство ConnectionString объекта SqlConnection, который открыт. Это означает, что вы открыли его, и каким-то образом, где-то, вы никогда не закрывали его.

- Куда же? Не знаю - может быть где угодно в вашем коде. Лучшее решение-выбросить "глобальный" объект conncetion и создать его, когда он вам понадобится, внутри объекта conncetion. Использование Оператора (Visual Basic) | Microsoft Docs[^] - таким образом, он автоматически закрывается и утилизируется, когда вы закончите с ним.