Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database “;不允许更改';连接字符串';房地产”;错误_Database_Vb.net_Ms Access - Fatal编程技术网

Database “;不允许更改';连接字符串';房地产”;错误

Database “;不允许更改';连接字符串';房地产”;错误,database,vb.net,ms-access,Database,Vb.net,Ms Access,当我向access数据库添加数据时,出现错误: 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 EventArg

当我向access数据库添加数据时,出现错误:

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


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

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

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

另外,进入project->settings并在那里添加连接字符串-这样您就不必在代码中放置或拥有连接字符串了-(坏主意)

因此,您的代码应该如下所示:

    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
注意以下几点:

没有凌乱的弦乐炫耀

字符串没有乱引号,数字没有引号

干净易读

使用保温材料-安全

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

请注意,我们没有一个单独的conneciton对象-不需要

请注意,command对象非常好。 命令对象具有:

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

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

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

看来你把参数搞混了。我很高兴您尝试使用它们,但它们没有出现在您的sql字符串中,因此它们没有被使用。您不希望将字符串与用户输入连接在一起,因为这有sql注入的风险

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

您需要将数据库对象保持在使用它们的方法的本地。这样,他们可以关闭和处置使用…结束使用块尽快

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

从外观上看,
myconnection.ConnectionString
可能在您尝试将其设置为
connstring
时处于打开状态?有什么事情很难理解,以至于您的连接已经打开了?因此,请删除此项:
myconnection.ConnectionString=connstring
,因为这是要设置为一次的,而不是每次您必须使用命令时都设置为一次。还要尝试打开一次连接(因为我们看到连接变量
myconnection
在其他地方被初始化),这是否回答了您的问题?您的SQL语法和参数都是错误的-它们无法工作。请参阅下面的代码。参数意味着您不必在sql字符串中分配文本框值,也不需要所有的引号、单引号等。请参见下文。