JBTALKS.CC

标题: VB.NET疑问 [打印本页]

作者: Kinni    时间: 2013-3-25 08:30 PM
标题: VB.NET疑问
请问下这个Code的问题在哪里?当我输入 ID,Pass,FirstName都符合Database,但是LasNamet不符合的话它也会成功进入Insert Data的情况然后会出现error因为有些Data重复了.


Dim DBCon As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Kini\Documents\Visual Studio 2010\Projects\WindowsApplication1\WindowsApplication1\bin\Debug\VB.accdb")
            Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM Staff WHERE StaffID ='" & txtStaffID.Text & "' and Password = '" & txtPass.Text & "' and  UserFirstName= '" & txtFN.Text & "' and UserLastName= '" & txtLN.Text & "'", DBCon)
            DBCon.Open()
            Dim sdr As OleDbDataReader = cmd.ExecuteReader()
            If (sdr.Read() = True) Then
                MessageBox.Show("The data entered already exist!", "System Information")
                sdr.Close()
                DBCon.Close()
            ElseIf (sdr.Read() = False) Then
                Dim cmd2 As String
                Dim DBCon2 As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Kini\Documents\Visual Studio 2010\Projects\WindowsApplication1\WindowsApplication1\bin\Debug\VB.accdb")
                cmd2 = "INSERT INTO Staff Values ( '" & txtStaffID.Text & "', '" & txtPass.Text & "','" & txtFN.Text & "', '" & txtLN.Text & "')"
                Dim sdr2 As OleDbCommand
                sdr2 = New OleDbCommand(cmd2, DBCon2)
                DBCon2.Open()
                Dim objcmd As OleDbCommand
                objcmd = New OleDbCommand(cmd2, DBCon2)
                objcmd.ExecuteNonQuery()
                DBCon2.Close()
                valid5 = True
            End If
        End If
作者: ぁあぃ←    时间: 2013-3-25 08:35 PM
可能你的primary key 重複~
作者: suki89    时间: 2013-3-25 08:51 PM
lz的error是什么??
作者: Kinni    时间: 2013-3-25 09:50 PM
ぁあぃ← 发表于 2013-3-25 08:35 PM
可能你的primary key 重複~

但是除了描述的问题以外...就不会出现error了@@
作者: Kinni    时间: 2013-3-25 09:57 PM
suki89 发表于 2013-3-25 08:51 PM
lz的error是什么??

你好
比如说:
Type                Database          Insert
ID                     Haha                 Haha
Pass                 Hahaha             Hahaha
FirstaName      Hahahaha         Hahahaha
LastName        Hoho                 Haha
Database是我原有的资料,然后Insert是要加入的资料
因为LastName是Database里面找不到的所以会进入Insert condition
但是因为里面有相同的资料比如 ID=Haha Insert= Haha
出现重复所以不能Insert而cmd.executenonquery()出现错误
但是我已经写了 If sdr= false才可以进入
然后我有试过把每一样东西 ID,Pass,FirstName,LastName都各用一个Valid
然后变成 If valid1, valid2, valid3, valid4= false才进入condition...但是这样过后就Insert不到资料了
作者: suki89    时间: 2013-3-25 10:09 PM
Kinni 发表于 2013-3-25 09:57 PM
你好
比如说:
Type                Database          Insert

error message是什么?
作者: Kinni    时间: 2013-3-25 10:11 PM
suki89 发表于 2013-3-25 10:09 PM
error message是什么?

objcmd.ExecuteNonQuery()出现重复
作者: Kinni    时间: 2013-3-25 10:12 PM
suki89 发表于 2013-3-25 10:09 PM
error message是什么?

顺便问问....为什么我的Error Message是华语??但是User Interface 是英文的= =
作者: suki89    时间: 2013-3-25 10:13 PM
Kinni 发表于 2013-3-25 10:11 PM
objcmd.ExecuteNonQuery()出现重复

你的error message是华语的??!!
作者: suki89    时间: 2013-3-25 10:25 PM
Kinni 发表于 2013-3-25 10:12 PM
顺便问问....为什么我的Error Message是华语??但是User Interface 是英文的= =

去setting调看看吧。
lz你的sdr.Read() = False过后没close reader耶。
把 sdr.Close() 和 DBCon.Close() 加在sdr.Read() = False后,在试试看还会有问题吗。

小小建议:如果DBCon是一样的Connection的话,就不要放那么多,program会变慢,自己看了也乱。
作者: Kinni    时间: 2013-3-25 10:26 PM
suki89 发表于 2013-3-25 10:13 PM
你的error message是华语的??!!

是wor!!!!但是UI是英文的!不知道为什么error message是华语!可能是因为我的access是华语吧~因为我没有英文版本的access
objcmd.ExecuteNonQuery()就是这个东西出问题!!
大师!救救我= =
作者: suki89    时间: 2013-3-25 10:29 PM
Kinni 发表于 2013-3-25 10:26 PM
是wor!!!!但是UI是英文的!不知道为什么error message是华语!可能是因为我的access是华语吧~因为我没有英 ...

那就是reader没关的关系。
把 sdr.Close() 和 DBCon.Close() 加在sdr.Read() = False后,在试试看还会有问题吗。
作者: Kinni    时间: 2013-3-25 10:30 PM
suki89 发表于 2013-3-25 10:25 PM
去setting调看看吧。
lz你的sdr.Read() = False过后没close reader耶。
把 sdr.Close() 和 DBCon.Close ...

因为我怕如果两个用同一个Connection会有问题@@
成功后会把他们改掉!
如果要用同一个Connection是不是要在一开始进入IF condition就直接加入?
现在就试下加 Close!
作者: Kinni    时间: 2013-3-25 10:36 PM
suki89 发表于 2013-3-25 10:29 PM
那就是reader没关的关系。
把 sdr.Close() 和 DBCon.Close() 加在sdr.Read() = False后,在试试看还会有 ...

由于将在索引、 主关键字、或关系中创建重复的值,请求对表的改变没有成功。 改变该字段中的或包含重复数据的字段中的数据,删除索引或重新定义索引以允许重复的值并再试一次。
objcmd.ExecuteNonQuery()
还是一样....我朋友说database的话一定要用row/column 来弄的~是这样的吗?但是我看了很多例子都不用
作者: suki89    时间: 2013-3-25 10:41 PM
Kinni 发表于 2013-3-25 10:36 PM
由于将在索引、 主关键字、或关系中创建重复的值,请求对表的改变没有成功。 改变该字段中的或包含重复数 ...

那是你的primary key一样咯,不能insert一样的primary key啊。
作者: Kinni    时间: 2013-3-25 11:04 PM
suki89 发表于 2013-3-25 10:41 PM
那是你的primary key一样咯,不能insert一样的primary key啊。

什么意思@@请赐教~
作者: suki89    时间: 2013-3-25 11:14 PM
Kinni 发表于 2013-3-25 11:04 PM
什么意思@@请赐教~

你的database里primary key是StaffID吗?
如果是的话,那么你不能insert一样的StaffID,因为primary key不能一样。
作者: Kinni    时间: 2013-3-25 11:23 PM
suki89 发表于 2013-3-25 11:14 PM
你的database里primary key是StaffID吗?
如果是的话,那么你不能insert一样的StaffID,因为primary key ...

哦!了解...我就是想说~为什么我Insert 一样的StaffID但是不一样的LastName也会进入False condition然后Insert??不是应该出现"Data already exist" 吗??
作者: suki89    时间: 2013-3-25 11:41 PM
Kinni 发表于 2013-3-25 11:23 PM
哦!了解...我就是想说~为什么我Insert 一样的StaffID但是不一样的LastName也会进入False condition然后I ...

就拿你的例子来说
Type                Database          Insert
ID                     Haha                 Haha
Pass                 Hahaha             Hahaha
FirstaName      Hahahaha         Hahahaha
LastName        Hoho                 Haha

你的database里有data是(Haha, Hahaha, Hahahaha, Hoho),
但是没有(Haha, Hahaha, Hahahaha, Haha)。
所以你的reader没有read到data,condition那边就是sdr.Read() = False,才会去Insert command。
作者: Kinni    时间: 2013-3-25 11:50 PM
suki89 发表于 2013-3-25 11:41 PM
就拿你的例子来说
Type                Database          Insert
ID                     Haha        ...

原来如此!!要怎么做我才可以让System如果有任何一个相同就不进入Insert command呢?因为我是刚学不久的...真的想不出办法
作者: suki89    时间: 2013-3-25 11:59 PM
Kinni 发表于 2013-3-25 11:50 PM
原来如此!!要怎么做我才可以让System如果有任何一个相同就不进入Insert command呢?因为我是刚学不久的 ...

把你的select statement改去OR而不是AND。
那么如果有任何一个相同的话,就会"The data entered already exist!"。
作者: Kinni    时间: 2013-3-26 11:37 AM
suki89 发表于 2013-3-25 11:59 PM
把你的select statement改去OR而不是AND。
那么如果有任何一个相同的话,就会"The data entered already ...

我都忘记还有or 这个东西!!感谢感谢!!!
可以教多我一样东西吗?比如我要show出一个lable是login过后会出现User's First and LastName的Lable~但是Login时候是用ID and Password的~应该要怎样弄呢?
作者: suki89    时间: 2013-3-26 11:45 AM
Kinni 发表于 2013-3-26 11:37 AM
我都忘记还有or 这个东西!!感谢感谢!!!
可以教多我一样东西吗?比如我要show出一个lable ...

可以知道你的table有什么field吗?(login和password的table,firstname和lastname的table)
作者: Kinni    时间: 2013-3-26 11:55 AM
suki89 发表于 2013-3-26 11:45 AM
可以知道你的table有什么field吗?(login和password的table,firstname和lastname的table)

StaffID
Password
UserFirstName
UserLastName
谢谢你的教导

作者: suki89    时间: 2013-3-26 12:30 PM
Kinni 发表于 2013-3-26 11:55 AM
StaffID
Password
UserFirstName

你可以用reader。
如果sdr.Read() = true,
label.Text = sdr.GetValue(0).ToString() + sdr.GetValue(1).ToString()。

0和1或者是1和2,看你的select statement怎样写。
作者: Kinni    时间: 2013-3-26 12:49 PM
suki89 发表于 2013-3-26 12:30 PM
你可以用reader。
如果sdr.Read() = true,
label.Text = sdr.GetValue(0).ToString() + sdr.GetValue( ...

但是要在不同的Page哦~
这个只能是同一个Page吧??

作者: suki89    时间: 2013-3-26 12:57 PM
Kinni 发表于 2013-3-26 12:49 PM
但是要在不同的Page哦~
这个只能是同一个Page吧??

你有学过Response.Redirect或是Session吗?
作者: Kinni    时间: 2013-3-26 01:04 PM
suki89 发表于 2013-3-26 12:57 PM
你有学过Response.Redirect或是Session吗?

没有呢!因为这个是Assignment...使我自己要先学然后先做~老师还没有教到这么多
因为有些学生一直学不会,所以教到普通Insert一样东西的时候就没有再教新的了~一直重复给他们听咯 ~
是不是打Response.redirect就能在Youtube找到?


请问下有什么情况下会进不到IF EelseIF statement 的Command...
我在做Delete...但是进不到 Else If 里面的东西

Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM Staff WHERE StaffID ='" & txtStaffID.Text & "' and Password = '" & txtPass.Text & "' and  UserFirstName= '" & txtFN.Text & "' and UserLastName= '" & txtLN.Text & "'", DBCon)
            Dim sdr As OleDbDataReader = cmd.ExecuteReader()
            If (sdr.Read() = False) Then
                MessageBox.Show("Record not found!", "System Information")
                DBCon.Close()
                sdr.Close()
            ElseIf (sdr.Read() = True) Then
就是True了过后还是进不到
Dim cmd2 As New OleDbCommand
                cmd2.CommandText = "DELETE * FROM Staff WHERE StaffID='" & txtStaffID.Text & "'and Password='" & txtPass.Text & "'and UserFirstName='" & txtFN.Text & "'and UserLastname='" & txtLN.Text & "'"
                cmd2.CommandText = CommandType.Text
                cmd2.ExecuteNonQuery()
检查了几次~都没有问题啊!之前我试过没有问题。。。今天就不行了
作者: suki89    时间: 2013-3-26 01:25 PM
Kinni 发表于 2013-3-26 01:04 PM
没有呢!因为这个是Assignment...使我自己要先学然后先做~老师还没有教到这么多
因为有些学生 ...

你打VB.NET Response.Redirect咯,因为别的language也是有Response.Redirect。
是不是没close reader所以有问题?
作者: Kinni    时间: 2013-3-26 01:40 PM
suki89 发表于 2013-3-26 01:25 PM
你打VB.NET Response.Redirect咯,因为别的language也是有Response.Redirect。
是不是没close reader所以 ...

谢谢你当我的指路明灯!!这个帮助很大
Dim DBCon As OleDbConnection = New OleDbConnection("rovider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Kini\Documents\Visual Studio 2010\Projects\WindowsApplication1\WindowsApplication1\bin\Debug\VB.accdb")
            DBCon.Open()
            Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM Staff WHERE StaffID ='" & txtStaffID.Text & "' and Password = '" & txtPass.Text & "' and  UserFirstName= '" & txtFN.Text & "' and UserLastName= '" & txtLN.Text & "'", DBCon)
            Dim sdr As OleDbDataReader = cmd.ExecuteReader()
            If (sdr.Read() = False) Then
                MessageBox.Show("Record not found!", "System Information")
                DBCon.Close()
                sdr.Close()
            ElseIf (sdr.Read() = True) Then
                Dim cmd2 As New OleDbCommand
                cmd2.CommandText = "DELETE * FROM Staff WHERE StaffID='" & txtStaffID.Text & "'and Password='" & txtPass.Text & "'and UserFirstName='" & txtFN.Text & "'and UserLastname='" & txtLN.Text & "'"
                cmd2.CommandText = CommandType.Text
                cmd2.ExecuteNonQuery()
                DBCon.Close()
                sdr.Close()
                valid6 = True
            End If
已经关了@@
作者: Kinni    时间: 2013-3-26 01:46 PM
suki89 发表于 2013-3-26 01:25 PM
你打VB.NET Response.Redirect咯,因为别的language也是有Response.Redirect。
是不是没close reader所以 ...

请问下是不是有别的名称?因为我只找到ASP.Net
作者: suki89    时间: 2013-3-26 02:01 PM
Kinni 发表于 2013-3-26 01:40 PM
谢谢你当我的指路明灯!!这个帮助很大
Dim DBCon As OleDbConnection = New OleD ...

要先close reader才可以execute新query。

ElseIf (sdr.Read() = True) Then
                sdr.Close()
                Dim cmd2 As New OleDbCommand
                cmd2.CommandText = "DELETE * FROM Staff WHERE StaffID='" & txtStaffID.Text & "'and Password='" & txtPass.Text & "'and UserFirstName='" & txtFN.Text & "'and UserLastname='" & txtLN.Text & "'"
                cmd2.CommandText = CommandType.Text
                cmd2.ExecuteNonQuery()
                DBCon.Close()
                valid6 = True
            End If
作者: suki89    时间: 2013-3-26 02:05 PM
Kinni 发表于 2013-3-26 01:46 PM
请问下是不是有别的名称?因为我只找到ASP.Net

也是可以,只是要看他的code是VB.NET的还是C#的。如果是C#的有些网站是可以帮你convert去VB.NET的。
作者: Kinni    时间: 2013-3-26 02:07 PM
suki89 发表于 2013-3-26 02:01 PM
要先close reader才可以execute新query。

ElseIf (sdr.Read() = True) Then

还是不行~它没有任何的Error...只是如果是False它就会出现
MessageBox.Show("Record not found!", "System Information")
但是True的话就不能进入Command...就是没有任何的动作~
作者: Kinni    时间: 2013-3-26 02:09 PM
suki89 发表于 2013-3-26 02:05 PM
也是可以,只是要看他的code是VB.NET的还是C#的。如果是C#的有些网站是可以帮你convert去VB.NET的。

谢谢你哦!
作者: suki89    时间: 2013-3-26 02:15 PM
Kinni 发表于 2013-3-26 02:07 PM
还是不行~它没有任何的Error...只是如果是False它就会出现
MessageBox.Show("Record not found!", "Sys ...

因为你delete record过后没有message任何东西,database里的record被delete了是吗?
作者: Kinni    时间: 2013-3-26 02:42 PM
本帖最后由 Kinni 于 2013-3-26 02:43 PM 编辑
suki89 发表于 2013-3-26 02:15 PM
因为你delete record过后没有message任何东西,database里的record被delete了是吗?


其实Full Code是这样的!对不起。。。一开始没有写完
Dim DBCon As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Kini\Documents\Visual Studio 2010\Projects\WindowsApplication1\WindowsApplication1\bin\Debug\VB.accdb")
            DBCon.Open()
            Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM Staff WHERE StaffID ='" & txtStaffID.Text & "' and Password = '" & txtPass.Text & "' and  UserFirstName= '" & txtFN.Text & "' and UserLastName= '" & txtLN.Text & "'", DBCon)
            Dim sdr As OleDbDataReader = cmd.ExecuteReader()
            If (sdr.Read() = False) Then
                MessageBox.Show("Record not found!", "System Information")
                DBCon.Close()
                sdr.Close()
            ElseIf (sdr.Read() = True) Then
                sdr.Close()
                Dim cmd2 As New OleDbCommand
                cmd2.CommandText = "DELETE * FROM Staff WHERE StaffID='" & txtStaffID.Text & "'and Password='" & txtPass.Text & "'and UserFirstName='" & txtFN.Text & "'and UserLastname='" & txtLN.Text & "'"
                cmd2.CommandText = CommandType.Text
                cmd2.ExecuteNonQuery()
                DBCon.Close()
                valid6 = True
            End If
        End If
        If valid6 = True Then
            MessageBox.Show("Record has been deleted!", "System Information")
            txtStaffID.Text = ""
            txtPass.Text = ""
            txtFN.Text = ""
            txtLN.Text = ""
        Else
            MessageBox.Show("Delete record has been rejected", "System Information")
        End If

我开了Database...并没有被删除~其实If statement应该没有什么问题吧?为什么进入不到True Statement but False 可以?
作者: suki89    时间: 2013-3-26 02:51 PM
Kinni 发表于 2013-3-26 02:42 PM
其实Full Code是这样的!对不起。。。一开始没有写完
Dim DBCon As OleDbConnection = New OleDbConn ...

你把ElseIf (sdr.Read() = True) Then换成else试试看。
还有你的delete statement是DELETE FROM,没有*的。
作者: Kinni    时间: 2013-3-26 05:52 PM
suki89 发表于 2013-3-26 02:51 PM
你把ElseIf (sdr.Read() = True) Then换成else试试看。
还有你的delete statement是DELETE FROM,没有*的 ...

谢谢你!看来我要多点了解了...不停的出错
作者: suki89    时间: 2013-3-26 09:53 PM
Kinni 发表于 2013-3-26 05:52 PM
谢谢你!看来我要多点了解了...不停的出错

不客气。加油哦




欢迎光临 JBTALKS.CC (https://www.jbtalks.cc/) Powered by Discuz! X2.5