“不允许更改 'ConnectionString' 属性。”错误

Posted

技术标签:

【中文标题】“不允许更改 \'ConnectionString\' 属性。”错误【英文标题】:“Not allowed to change the 'ConnectionString' property.” error“不允许更改 'ConnectionString' 属性。”错误 【发布时间】:2021-05-31 15:20:41 【问题描述】:

当我添加数据以访问数据库时,我得到了错误:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    TB2.Clear()
    NameofG.Clear()
    NunberofG.Clear()
    UnitofG.Clear()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    pro = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Piyawat\Desktop\PPCC\Stock.accdb;"
    connstring = pro
    myconnection.ConnectionString = connstring
    If myconnection.State = ConnectionState.Closed Then
        myconnection.Open()
    End If
    command = "insert into Stock([InvoiceID],[Type],[Item],[Amout],[Unit]) Value ('" & TB2.Text & "','" & CB1.Text & "','" & NameofG.Text & "','" & NunberofG.Text & "','" & UnitofG.Text & "')"
    Dim cmd As OleDbCommand = New OleDbCommand(command, myconnection)
    cmd.Parameters.Add(New OleDbParameter("InvoiceID", CType(TB2.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Type", CType(CB1.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Item", CType(NameofG.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Amout", CType(NunberofG.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Unit", CType(UnitofG.Text, String)))
    MsgBox("Record Save")
    Try
        cmd.ExecuteNonQuery()
        cmd.Dispose()
        TB2.Clear()
        CB1.Text.DefaultIfEmpty
        NameofG.Clear()
        NunberofG.Clear()
        UnitofG.Clear()
    Catch ex As Exception
        MsgBox("Mistake")

    End Try

End Sub

如何修复错误?请帮忙。谢谢

【问题讨论】:

从外观上看,myconnection.ConnectionString 可能在您尝试将其设置为 connstring 时已打开? 您的连接已经打开,有什么难理解的?所以,删除这个:myconnection.ConnectionString = connstring 设置为一次,而不是每次你必须使用你的命令。也尝试打开你的连接一次(因为我们看到连接变量myconnection 在其他地方初始化) 这能回答你的问题吗? Not allowed to change the 'ConnectionString' property. The connection's current state is open 您的 SQL 语法和您拥有的参数都是错误的——它们将不起作用。请参阅下面的代码。参数意味着您不必将文本框值放在 sql 字符串中 - 并且您不需要所有引号、单引号等。见下文。 【参考方案1】:

我会确保在您使用连接后关闭它。

但是,您可以让 .net 自动为您执行此操作。

另外,进入项目->设置并在那里添加你的连接字符串——这样你就不必在代码中放置或有连接字符串——(坏主意)。

因此,您的代码应该看起来像这样:

    Dim strSQL As String = "INSERT INTO Stock([InvoiceID],[Type],[Item],[Amout],[Unit]) " &
                           "VALUES (@TB2, @CB1, @NameofG, @NunberofG, @UnitofG)"

    Using cmd As New OleDbCommand(strSQL, New OleDbConnection(My.Settings.Test44))


        cmd.Parameters.Add("@TB2", OleDbType.VarWChar).Value = TB2.Text
        cmd.Parameters.Add("@CB1", OleDbType.VarWChar).Value = CB1.Text
        cmd.Parameters.Add("NameofG", OleDbType.VarWChar).Value = NameofG.Text
        cmd.Parameters.Add("@NumberofG", OleDbType.Integer).Value = NunberofG.Text
        cmd.Parameters.Add("@UnitofG", OleDbType.Integer).Value = UnitOfG.Text

        cmd.Connection.Open()

        Try
            cmd.ExecuteNonQuery()
            MsgBox("Record Save")
        Catch ex As Exception
            MsgBox("Error = " & ex.Message)
        End Try


    End Using

注意以下几点:

没有杂乱的字符串浓度。

字符串没有凌乱的引号,数字没有引号。

干净易读。

使用参数 - 安全。

使用 using 块,我们不必处理或关闭连接 - 这对您来说是自动的。所以总是假设它是关闭的。

请注意我们没有单独的连接对象 - 不需要。

注意命令对象是多么的好。 命令对象有:

a connection object - you don't need to create a new one

command text

a reader!!! - you can use command object - no need to load + create a reader

【讨论】:

【参考方案2】:

我将数据库代码移到了一个单独的方法中。

从用户界面代码开始,您首先要验证输入。我不得不猜测数据类型,因为您的代码使它们看起来都像字符串。我希望这不是真的。

您似乎与参数混淆了。我很高兴您尝试使用它们,但它们没有出现在您的 sql 字符串中,因此它们没有被使用。您不想将字符串与用户输入连接起来,因为它有 sql 注入的风险。

参数名称前的@符号只是一种便于识别的约定。

您需要将数据库对象保留在使用它们的方法的本地。这样它们就可以尽快关闭并使用 Using...End Using 块进行处理。

Private ConStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Piyawat\Desktop\PPCC\Stock.accdb;" '"Your connection string"

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Validate input
    Dim ID As Integer
    Dim Amt As Decimal
    Dim Unt As Integer
    Dim message = "Please enter a number for the"
    If Not Integer.TryParse(TB2.Text, ID) Then
        MessageBox.Show(message & " Invoice ID.")
        Return
    End If
    If Not Decimal.TryParse(NunberofG.Text, Amt) Then
        MessageBox.Show(message & " Amount.")
        Return
    End If
    If Not Integer.TryParse(UnitofG.Text, Unt) Then
        MessageBox.Show(message & " Unit")
        Return
    End If
    'Call the insert method
    Try
        InsertInvoice(ID, CB1.Text, NameofG.Text, Amt, )
    Catch ex As Exception
        MsgBox(ex.Message)
        Return
    End Try
    MessageBox.Show("Record Saved")
    TB2.Clear()
    CB1.Text.DefaultIfEmpty
    NameofG.Clear()
    NunberofG.Clear()
    UnitofG.Clear()
End Sub

Private Sub InsertInvoice(InvoiceID As Integer, Type As String, Item As String, Amount As Decimal, Unit As Integer)
    Dim Command = "insert into Stock([InvoiceID],[Type],[Item],[Amout],[Unit]) Value (@InvoiceID,@Type,@Item,@Amount,@Unit)"
    Using myconnection As New OleDbConnection(ConStr),
            cmd As New OleDbCommand(Command, myconnection)
        With cmd.Parameters
            .Add("@InvoiceID", OleDbType.Integer).Value = InvoiceID
            .Add("@Type", OleDbType.VarChar).Value = Type
            .Add("@Item", OleDbType.VarChar).Value = Item
            .Add("@Amout", OleDbType.Decimal).Value = Amount
            .Add("@Unit", OleDbType.Integer).Value = Unit
        End With
    End Using
End Sub

【讨论】:

以上是关于“不允许更改 'ConnectionString' 属性。”错误的主要内容,如果未能解决你的问题,请参考以下文章