Имена параметров в ODB C не имеют значения. Важен порядок, в котором параметры, отображаемые в команде sql, должны соответствовать порядку, в котором они добавляются в блоки ParametersCollection
.
Using...End Using
и закрывать объекты базы данных даже в случае ошибки. .
Мне пришлось угадывать имена полей и типы данных, чтобы проверить фактические значения в вашей базе данных и соответствующим образом скорректировать код. Если какое-либо из полей имеет числовой тип c, вам не нужно преобразовывать свойство .Text
текстового поля в соответствующий тип.
Обычно поля первичного ключа никогда не обновляются, поэтому удалите обновление поля PK из код. Если поле будет автоматически увеличено, вы не вставите значение для этого поля. Настройте код, удалив любую вставку в поле автоматического номера.
Private Function GetConnectionString() As String
Dim strConn As String
If GlobalVariables.logProd = 1 Then
strConn = "Driver={PostgreSQL ANSI};database=SacredSelections;server=127.0.0.1;port=5432;uid=SSApp;sslmode=disable;readonly=0;protocol=7.4;User ID=SSApp;password=Cordova123;"
Else
strConn = "Driver={PostgreSQL ANSI};database=SacredSelectionsTest;server=127.0.0.1;port=5432;uid=SSApp;sslmode=disable;readonly=0;protocol=7.4;User ID=SSApp;password=Cordova123;"
End If
Return strConn
End Function
Private Sub Check4Duplicate(strEditType As String)
Dim DupMessage As String
Dim DupTitle As String
Try
Dim dt As New DataTable
Using DupConn As New OdbcConnection(GetConnectionString())
Using cmdDups As New OdbcCommand("select auction_name from auctions where auction_name = ?;", DupConn)
cmdDups.Parameters.Add("@auction_name", OdbcType.VarChar).Value = txt_auction_name.Text
dt.Load(cmdDups.ExecuteReader)
End Using
End Using
If dt.Rows.Count = 0 Then
DupTitle = "Unique Record - Save Allowed"
If strEditType = "Edit" Then
DupMessage = "This will save changes to an existing Unique record for Auction ID " + txt_auction_id.Text + " and Auction Name " + txt_auction_name.Text + " and Location Name " + txt_location_address.Text
UpdateAuction()
Else
DupMessage = "This will create a Unique record for Auction ID " + txt_auction_id.Text + " and Auction Name " + txt_auction_name.Text + " and Location Name " + txt_location_address.Text
InsertAuction()
End If
Else
DupTitle = "Duplicate Record - Save NOT Allowed"
DupMessage = $"A record already exists with Auction ID {txt_auction_id.Text} and Auction Name {txt_auction_name.Text} and Location Name {txt_location_address.Text}"
MessageBox.Show(DupMessage, DupTitle)
End If
Catch ex As Exception
DupTitle = "Connection failed"
DupMessage = "Unable to Open Auction Information Connection to check for Existing Records"
MessageBox.Show(DupMessage, DupTitle)
End Try
End Sub
Private Sub InsertAuction()
Using DupConn As New OdbcConnection(GetConnectionString())
Using cmd As New OdbcCommand("Insert Into auctions (auction_id, auction_name, auction_address) Values (?,?,?)")
cmd.Parameters.Add("id", OdbcType.VarChar).Value = txt_auction_id.Text
cmd.Parameters.Add("name", OdbcType.VarChar).Value = txt_auction_name.Text
cmd.Parameters.Add("address", OdbcType.VarChar).Value = txt_location_address.Text
DupConn.Open()
cmd.ExecuteNonQuery()
End Using
End Using
End Sub
Private Sub UpdateAuction()
Using DupConn As New OdbcConnection(GetConnectionString())
Using cmd As New OdbcCommand("Update auctions Set auction_id = ?, auction_name = ?, auction_address = ? Where aution_name = ?")
cmd.Parameters.Add("id", OdbcType.VarChar).Value = txt_auction_id.Text
cmd.Parameters.Add("name", OdbcType.VarChar).Value = txt_auction_name.Text
cmd.Parameters.Add("address", OdbcType.VarChar).Value = txt_location_address.Text
cmd.Parameters.Add("name2", OdbcType.VarChar).Value = txt_auction_name.Text
DupConn.Open()
cmd.ExecuteNonQuery()
End Using
End Using
End Sub
Может показаться, что дублирование кода повторяет построение соединений и команд, но сохранение этих элементов локально по отношению к методу, в котором они используются, позволяет нам чтобы быть уверенным, что они закрыты и утилизированы.