我正在使用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中有一个我已经用Nis保存的数据:123,如果我用相同的Nis保存另一个数据:123程序将停止并给我一个错误,因为已经有Nis值为123
我想做的是:
而不是向我显示错误,我想制作一个编码,向我显示一个消息框“已保存的数据”,以便程序不会因为错误而停止。
如何编写代码?
答案 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