Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 无法在VB.NET中使用“在重复键更新时插入表值()_Database_Vb.net_Ms Access - Fatal编程技术网

Database 无法在VB.NET中使用“在重复键更新时插入表值()

Database 无法在VB.NET中使用“在重复键更新时插入表值(),database,vb.net,ms-access,Database,Vb.net,Ms Access,我只想将所有记录插入数据库,若有重复的主记录,它将更新主记录。但我不知道为什么它总是说错误缺少分号;在SQL语句的末尾。。我知道在VB.NET中sql语句没有半色,我认为我的sql语句中有错误。当我删除重复键上的部分时,更新StudentID=@StudentID,插入记录OK。请指出我是否遗漏了什么 这是我的密码 Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handl

我只想将所有记录插入数据库,若有重复的主记录,它将更新主记录。但我不知道为什么它总是说错误缺少分号;在SQL语句的末尾。。我知道在VB.NET中sql语句没有半色,我认为我的sql语句中有错误。当我删除重复键上的部分时,更新StudentID=@StudentID,插入记录OK。请指出我是否遗漏了什么

这是我的密码

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\1_Project\Project_of_VB_Net\AccessDatabase\StudentDatabase.accdb"
    cmd.Connection = cnn
    For Each dr In dt.Rows
        cmd.CommandText = "INSERT INTO StudentData(ID,StudentName,StudentID,StudentClass) VALUES(@ID,@StudentName,@StudentID,@StudentClass) ON DUPLICATE KEY UPDATE StudentID=@StudentID"
        cmd.Parameters.AddWithValue("@ID", dr("ID"))
        cmd.Parameters.AddWithValue("@StudentName", dr("StudentName"))
        cmd.Parameters.AddWithValue("@StudentID", dr("StudentID"))
        cmd.Parameters.AddWithValue("@StudentClass", dr("StudentClass"))
        cnn.Open()
        cmd.ExecuteNonQuery()
        cnn.Close()
    Next
End Sub

您不能在Access中使用该语法。它根本不明白。 如果需要检查记录是否存在,则需要类似的内容

私有子btnSave_ClickByVal发送方作为System.Object,ByVal e作为System.EventArgs处理btnSave。单击 Dim update=update StudentData SET StudentName=@StudentName, StudentID=@StudentID,StudentClass=@StudentClass 其中ID=@ID Dim insert=插入学生数据 StudentName、StudentID、StudentClass、ID VALUES@StudentName,@StudentID,@StudentClass,@ID cnn.ConnectionString=。。。。。 cmd.Connection=cnn 对于dt.行中的每个dr '这很重要,在每个循环中都需要再次添加 '参数,而不是让前一个参数仍然存在 "第一位, cmd.Parameters.Clear cmd.CommandText=更新 cmd.Parameters。AddWithValue@StudentName,drStudentName cmd.Parameters。AddWithValue@StudentID,StudentID博士 cmd.Parameters。AddWithValue@StudentClass,学生班 cmd.Parameters。AddWithValue@ID,德里德 有线电视新闻网,开门 Dim count=cmd.ExecuteNonQuery 如果计数=0,则 cmd.CommandText=插入 cmd.ExecuteNonQuery 如果结束 有线电视新闻网,结束 下一个 端接头 换句话说,您尝试使用key=ID更新记录。如果成功,则ExecuteOnQuery的结果将是更新的数字或行数,可能是1。如果不成功,则可以继续插入

还要注意,为了避免复杂的逻辑,我将参数@ID的声明和插入移动到最后一个。这允许您的查询为UPDATE和INSERT命令共享相同的参数集。
在OleDb中,参数不是通过名称识别的,而是通过其位置识别的,因此,ID参数应该是insert和update命令的最后一个参数,以便参数集合中的值具有与参数占位符相同的顺序。

您不能在Access中使用该语法MS Access不是MySQL谢谢您的代码,我检查了它,但我遇到了一个问题,它只是为了第一个记录而运行。我的意思是,当我添加1条记录调用记录A时,count=0->插入记录A ok,然后我更新记录A,count=1->更新记录A ok。现在,如果我插入记录B,count始终等于1->update,并且记录B不会插入数据库My fault。需要在每个循环中清除参数集合。问题再次是由oledb中参数的位置性质引起的。第二个循环添加了另一组参数,但OleDb继续使用具有相同值的第一组参数,因为它们出现在上次添加的参数之前。vn.net是否支持为每个循环清除任何函数?这太神奇了,这正是我所期望的:我尝试了cmd.parameters.clear,它运行得非常完美。我没什么好说的,谢谢你。你可以让它变得更好。例如,可以在循环外部创建参数,而不使用值,仅使用cmd.parameters。Add@name,OleDbType.VarWChar。在循环中,您只需使用cmd设置值。Parameters@name.Value=xxxxx这将避免继续清除参数集合并重新创建它。