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

时间:2015-05-30 03:55:59

标签: sql-server vb.net visual-studio-2012

我正在使用visual studio 2012和microsoft SQL server 2012来创建保存功能。

我的编码是这样的:

形式:

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
        ClassSiswa.RekamData(ClassSiswa.opencon)
        MsgBox("Data siswa Berhasil Disimpan")
        datagridview()
    End Sub

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

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中有一个我已经用Ni​​s保存的数据:123,如果我用相同的Nis保存另一个数据:123程序将停止并给我一个错误,因为已经有Nis值为123

我想做的是:

而不是向我显示错误,我想制作一个编码,向我显示一个消息框“已保存的数据”,以便程序不会因为错误而停止。

如何编写代码?

2 个答案:

答案 0 :(得分:0)

如果主键重复,您的RekamData方法将抛出SqlException,异常号为2627。使用btnSave_Click方法抓住它:

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

答案 1 :(得分:0)

只有在表

中不存在新的主键值时,才可以使用插入行的查询
INSERT INTO siswa VALUES 
(SELECT @Nis
, @Nisn
, @Nama_Siswa
, @Jenis_Kelamin
, @Kota_Lahir
, @Tanggal_Lahir
, @Agama
, @Berat_Badan
, @Tinggi_Badan 
WHERE NOT EXISTS (SELECT 1 FROM siswa WHERE Nis = @Nis))

我认为检查已存在的主键是插入新行的功能的作用 基于返回受影响行数的方法SqlCommand.ExecuteNonQuery 您可以将Sub RekamData更改为Function,返回插入行的true或否则返回false。

Public Shared Function RekamData(ByVal _Cn As SqlClient.SqlConnection) As Boolean
    Dim query As String = "here copy query above"
    Dim insertedQnt As Int32
    Using sqlcom As New SqlClient.SqlCommand(query, _Cn)
        sqlcom.CommandType = CommandType.Text
        With 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", Agama)
            .AddWithValue("@Berat_Badan", Berat_Badan)
            .AddWithValue("@Tinggi_Badan", Tinggi_Badan)
        End With
        insertedQnt = sqlcom.ExecuteNonQuery()
    End Using
    Return (insertedQnt > 0)
End Function

然后使用它

'your code
If ClassSiswa.RekamData(ClassSiswa.opencon) = True Then
    MsgBox("Data siswa Berhasil Disimpan")
Else
    MsgBox("Value of Nis already exist")
End If

在示例中,我使用SqlParameter将值传递给数据库查询 我认为这是使用参数的好习惯 例如,参数将有助于Sql Injection的问题 How-does-sqlparameter-prevent-sql-injection