0

保存ボタンと更新ボタンのコードはありますが、2 つのコマンドを 1 つのボタンに組み合わせる方法はありますか?

たとえば、[SAVE/UPDATE ボタン] をクリックすると、新しいレコードの場合はデータベースに保存され、システムがデータベースに既にレコードがあることが判明した場合は更新され、編集されたデータが保存されます。

保存ボタンのコード

Dim sqlconn As New SqlClient.SqlConnection
    sqlconn.ConnectionString = "server = SKPI-APPS1;" & _
    "Database = EOEMS;integrated security=true"
    Try
        Dim myCommand As New SqlCommand
        sqlconn.Open()
        myCommand = New SqlCommand("INSERT INTO tblOfficeEquipmentProfile(OE_Category,OE_SubCategory,OE_ID,OE_Name,OE_User,OE_Brand,OE_Model,OE_Specs,OE_SerialNo,OE_PropertyNo,OE_MacAddress,OE_Static_IP,OE_Vendor,OE_PurchaseDate,OE_WarrantyInclusiveYear,OE_WarrantyStatus,OE_Status,OE_Dept_Code,OE_Location_Code,OE_Remarks) VALUES('" & cmbCategory.Text & "','" & cmbSubCategory.Text & "','" & txtOEID.Text & "','" & txtName.Text & "','" & txtUser.Text & "','" & cmbBrand.Text & "','" & cmbModel.Text & "','" & txtSpecs.Text & "','" & txtSerialNo.Text & "','" & txtPropertyNo.Text & "','" & txtMacAddress.Text & "','" & txtStaticIp.Text & "','" & txtVendor.Text & "','" & txtPurchaseDate.Text & "','" & txtWarrantyInclusiveYear.Text & "', '" & txtWarrantyStatus.Text & "','" & txtStatus.Text & "','" & cmbDeptCode.Text & "','" & cmbLocationCode.Text & "','" & txtRemarks.Text & "')", sqlconn)
        myCommand.ExecuteNonQuery()
        MessageBox.Show("Office Equipment Profile Successfully Added")
        sqlconn.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

更新ボタンのコード (注: ただし、更新ボタンにはまだ修正中のエラーがあります)

Dim sqlconn As New SqlClient.SqlConnection
    sqlconn.ConnectionString = "server = SKPI-APPS1;" & _
    "Database = EOEMS;integrated security=true"

    Dim myCommand As New SqlCommand


    Try

        'update command
        sqlconn.Open()

        myCommand = New SqlCommand("UPDATE tblOfficeEquipmentProfile SET OE_Category = '" & cmbCategory.Text & "',OE_SubCategory = '" & cmbSubCategory.Text & "', OE_Name = '" & txtName.Text & "', OE_User = '" & txtUser.Text & "', OE_Brand = '" & cmbBrand.Text & "', OE_Model = '" & cmbModel.Text & "', OE_Specs = '" & txtSpecs.Text & "', OE_SerialNo = '" & txtSerialNo.Text & "', OE_PropertyNo = '" & txtPropertyNo.Text & "', OE_MacAddress = '" & txtMacAddress.Text & "', OE_Static_IP = '" & txtStaticIp.Text & "', OE_Vendor = '" & txtVendor.Text & "', OE_PurchaseDate = '" & txtPurchaseDate.Text & "', OE_WarrantyInclusiveYear = '" & txtWarrantyInclusiveYear.Text & "', OE_WarrantyStatus = '" & txtWarrantyStatus.Text & "', OE_Status = '" & txtStatus.Text & "', OE_Dept_Code = '" & cmbDeptCode.Text & "', OE_Location_Code = '" & cmbLocationCode.Text & "', OE_Remarks ='" & txtRemarks.Text & "' WHERE OE_ID ='" & txtOEID.Text & "'", sqlconn)
        Dim iCnt As Integer = myCommand.ExecuteNonQuery()
        MessageBox.Show("Office Equipment Profile Successfully Updated  " & iCnt & "  Records")
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
4

3 に答える 3

0

あなたの質問は、SO に関する長年のお気に入りの質問です: 既存の行を更新する方法、または挿入する方法は? そして、答えは永遠に間違っています。

ifこれを行うための標準 SQL にはステートメントがありません。標準的な方法は、行が存在しないという制約に従って行を挿入し、それを更新することです。

insert into T values (...)
where not exists (
  select 1 from T as t 
  where T.key = t.key
)

オプションで行数をチェックし、それが 0 の場合のみ更新します

update T set ... 
where T.key = value

からの行数を確認しない場合insertupdateは冗長です。

すべてをストアド プロシージャに入れる方が良いですが、そうしない場合でも、両方のステートメントを 1 つの準備済みステートメントに入れ、それを GUI の 1 つのボタンにアタッチできるはずです。

于 2013-04-18T06:18:07.800 に答える
0

レコードが存在するかどうかを確認するストアド プロシージャを記述します。その場合は、更新してください。それ以外の場合は挿入します。

vb.net コードからこのストアド プロシージャを呼び出します。また、クエリ パラメータをストアド プロシージャに送信するように .net コードを変更します。

于 2013-04-18T02:16:27.733 に答える
0

状態を含む列挙型を作成できます。

 Enum DataState
      Editing
      Adding
      None
 End Enum

次に、クラス レベルの変数を設定します。

 private mDataState as DataState

次に、レコードを追加するか編集するかに応じてこれを設定し、Save_Click サブルーチンで If-Then を使用します。

于 2013-04-18T01:51:44.513 に答える