“不允许更改 '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' 属性。”错误的主要内容,如果未能解决你的问题,请参考以下文章