Sql server 在visual basic 2012上使用相同的主键保存数据时,如何防止错误/错误?

Sql server 在visual basic 2012上使用相同的主键保存数据时,如何防止错误/错误?,sql-server,vb.net,visual-studio-2012,Sql Server,Vb.net,Visual Studio 2012,我正在使用visual studio 2012和microsoft SQL server 2012创建一个保存函数 我的编码如下: 表格: 阶级 SQL查询: Create Table siswa ( Nis varchar (40) primary key, Nisn varchar (40), Nama_Siswa varchar(40), Jenis_Kelamin varchar (10), Kota_Lahir varchar (10), Tanggal_Lahir date, Ag

我正在使用visual studio 2012和microsoft SQL server 2012创建一个保存函数

我的编码如下:

表格:

阶级

SQL查询:

Create Table siswa 
(
Nis varchar (40) primary key,
Nisn varchar (40),
Nama_Siswa varchar(40),
Jenis_Kelamin varchar (10),
Kota_Lahir varchar (10),
Tanggal_Lahir date,
Agama varchar (10),
Berat_Badan varchar (10),
Tinggi_Badan varchar (10)
)
Nis是主键

在windows窗体datagridview中,有一个数据是我用Nis:123保存的,如果我用相同的Nis:123保存另一个数据,程序将停止并给我一个错误,因为已经有值为123的Nis

我想做的是:

我不想向我显示错误,而是想编写一个代码,向我显示已保存的messagebox数据,这样程序就不会因为错误而停止

如何进行编码来实现这一点?

如果主键重复,您的RekamData方法将抛出一个异常号为2627的SqlException。在您的btnSave\u Click方法中捕获它:


只有在表中不存在新的主键值时,才能使用插入行的查询

插入到siswa值中 选择@Nis ,@Nisn ,@Nama_Siswa ,@Jenis_Kelamin ,@Kota_Lahir ,@Tanggal_Lahir ,@Agama ,@Berat_Badan ,@Tinggi_Badan 如果不存在,请从siswa中选择1,其中Nis=@Nis 我认为检查现有主键是插入新行的函数的任务。 基于返回受影响行数的SqlCommand.ExecuteOnQuery方法 您可以将Sub RekamData更改为返回插入行的true或false(如果不是)的函数

公共共享函数RekamDataByVal\u Cn为SqlClient.SqlConnection为Boolean Dim query As String=此处复制上面的查询 Dim insertedQnt作为Int32 将sqlcom用作新的SqlClient.SqlCommandquery,\u Cn sqlcom.CommandType=CommandType.Text 使用Sql.Parameters .AddWithValue@Nis,Nis .AddWithValue@Nisn,Nisn .AddWithValue@Nama_Siswa,Nama_Siswa .AddWithValue@Jenis_Kelamin,Jenis_Kelamin .AddWithValue@Kota_Lahir,Kota_Lahir .AddWithValue@Tanggal_Lahir,Tanggal_Lahir .AddWithValue@Agama,阿加玛 .AddWithValue@Berat_Badan,伯拉图巴丹 .AddWithValue@Tinggi_Badan,丁吉乌巴丹 以 insertedQnt=sqlcom.ExecuteNonQuery 终端使用 返回insertedQnt>0 端函数 然后使用它

“你的代码 如果ClassSiswa.RekamDataClassSiswa.opencon=True,则 MsgBoxData siswa Berhasil Disimpan 其他的 Nis的MsgBoxValue已存在 如果结束 在这个示例中,我使用SqlParameter将值传递给数据库查询。 我认为这是使用参数的良好实践。 例如,参数将有助于解决

您确定不想在记录已经存在时更新它吗?MsgBoxData siswa Berhasil Disimpan将确认所有数据都已保存。我尝试了编码,结果成功了。唯一的问题是,当我保存完数据后,messagebox MsgBoxData siswa Berhasil Disimpan没有出现来通知我所有数据都已保存。抱歉-我犯了一个错误,在代码中注释掉了MsgBox。我已经修好了。我还对捕获重复密钥的地方做了一个更改:如果您有其他类型的SQL异常也应该报告,在异常报告之后,我添加了一个Exit子项。
Public Shared Sub RekamData(ByVal _Cn As SqlClient.SqlConnection)
        Dim sql As SqlClient.SqlCommand
        sql = New SqlClient.SqlCommand
        sql.Connection = _Cn
        sql.CommandType = CommandType.Text
        sql.CommandText = "Insert into siswa values('" & Nis & "','" & Nisn & "','" & Nama_Siswa & "','" & Jenis_Kelamin & "','" & Kota_Lahir & "','" & Tanggal_Lahir & "','" & Agama & "','" & Berat_Badan & "','" & Tinggi_Badan & "')"
        sql.ExecuteNonQuery()
    End Sub
Create Table siswa 
(
Nis varchar (40) primary key,
Nisn varchar (40),
Nama_Siswa varchar(40),
Jenis_Kelamin varchar (10),
Kota_Lahir varchar (10),
Tanggal_Lahir date,
Agama varchar (10),
Berat_Badan varchar (10),
Tinggi_Badan varchar (10)
)
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    If Len(Trim(txt_nis.Text)) = 0 Or Len(Trim(txt_nisn.Text)) = 0 Or Len(Trim(txt_namasiswa.Text)) = 0 Or Len(Trim(cmb_kelaminsiswa.Text)) = 0 Or Len(Trim(txt_kotalahir.Text)) = 0 Or Len(Trim(DTP_siswa.Value)) = 0 Or Len(Trim(cmb_agamasiswa.Text)) = 0 Or Len(Trim(txt_beratsiswa.Text)) = 0 Or Len(Trim(txt_tinggisiswa.Text)) = 0 Then
        MsgBox("Data Belum Lengkap")
        Exit Sub
    End If
    ClassSiswa.Nis = txt_nis.Text
    ClassSiswa.Nisn = txt_nisn.Text
    ClassSiswa.Nama_Siswa = txt_namasiswa.Text
    ClassSiswa.Jenis_Kelamin = cmb_kelaminsiswa.Text
    ClassSiswa.Kota_Lahir = txt_kotalahir.Text
    ClassSiswa.Tanggal_Lahir = DTP_siswa.Value
    ClassSiswa.Agama = cmb_agamasiswa.Text
    ClassSiswa.Berat_Badan = txt_beratsiswa.Text
    ClassSiswa.Tinggi_Badan = txt_tinggisiswa.Text
    Try
        ClassSiswa.RekamData(ClassSiswa.opencon)
        datagridview()
    Catch ex As SqlException
        If ex.Number = 2627 Then
            MsgBox("Duplicate key")
        Else
            MsgBox("SQL exception " & ex.Message)
        End If
        Exit Sub
    End Try
    ' Sorry - I don't know what this means :)
    MsgBox("Data siswa Berhasil Disimpan")
End Sub