나는 거기에 있었고, 해냈고, 티셔츠를 입었다. 그래서, 제가 당신의 고통을 느낄 때 당신에게 도움이 될만한 코드를 드릴 것입니다.
레코드 업데이트 추가 작업을 위해 저장 프로 시저 (sprocs)를 사용했습니다. 그런 다음 sprocs를 호출하는 클래스 래퍼를 작성했습니다.
ALTER PROCEDURE SP_IU_BATCH (
AUTYPE INTEGER,
BATCHID INTEGER,
MAT_BATCHID INTEGER,
DOS DATE,
FACILITYID INTEGER)
RETURNS (
RTNIDX INTEGER)
AS
BEGIN
IF (:AUTYPE = 0) THEN
BEGIN
FOR
SELECT GEN_ID(GEN_BATCH_ID,1)
FROM RDB$DATABASE
INTO
:RTNIDX
DO
BEGIN
INSERT INTO BATCH (BATCHID, MAT_BATCHID, DOS, FACILITYID)
VALUES (:RTNIDX, :MAT_BATCHID, :DOS, :FACILITYID);
END
END
ELSE
BEGIN
UPDATE BATCH SET MAT_BATCHID=COALESCE(:MAT_BATCHID, MAT_BATCHID), DOS=COALESCE(:DOS, DOS),
FACILITYID=COALESCE(:FACILITYID, FACILITYID)
WHERE BATCHID=:BATCHID;
END
END
당신은이 데이터베이스 래퍼로 액세스 할 것 :
은 sproc에이 코드를 사용하여,
그래서 여기에 코드를 입력 myfbdb.vb
Imports FirebirdSql.Data.Firebird
Imports FirebirdSql.Data.Firebird.Services
Imports FirebirdSql.Data.Firebird.Isql
Imports System.IO
Public Class myfbdb
#Region " Private Variables "
Private dbConn As FbConnection = Nothing, dbBatch As Batch = Nothing
Private Const dbName As String = "yourdatabasename.fdb", dbUser As String = "SYSDBA", dbPass As String = "yourpassword"
#End Region
#Region " Private Methods "
Private Sub Connect()
If dbConn Is Nothing Then
Try
dbConn = New FbConnection(GetConnString)
Catch ex As FbException
RaiseError(ex)
End Try
End If
End Sub
Private Sub Initialize()
dbBatch = New Batch
dbBatch.dbConn = Me
End Sub
#End Region
#Region " Private Functions "
Private Function GetConnString() As String
Dim rtnString As String = Nothing
Dim fbCSB As New FbConnectionStringBuilder
fbCSB.Database = dbName
fbCSB.Password = dbPass
fbCSB.UserID = dbUser
fbCSB.ServerType = 1
rtnString = fbCSB.ToString
fbCSB = Nothing
Return rtnString
End Function
#End Region
#Region " Public Properties "
Public ReadOnly Property cmdb() As FbConnection
Get
Return dbConn
End Get
End Property
Public ReadOnly Property cmBatch() As Batch
Get
Return dbBatch
End Get
End Property
End Property
#End Region
#Region " Public Methods "
#Region " New "
Public Sub New()
Connect()
Initialize()
End Sub
#End Region
#Region " Finalize "
Protected Overrides Sub Finalize()
MyBase.Finalize()
Close()
Unload()
End Sub
#End Region
#Region " Unload "
Public Sub Unload()
If Not dbConn Is Nothing Then
If dbConn.State = Data.ConnectionState.Open Then
dbConn.Close()
End If
dbConn = Nothing
End If
UnInitialize()
End Sub
#End Region
#Region " Open/Close "
Public Sub Open()
Try
If Not dbConn Is Nothing Then
If dbConn.State = Data.ConnectionState.Open Then
dbConn.Close()
End If
dbConn.Open()
End If
Catch ex As Exception
RaiseError(ex)
End Try
End Sub
Public Sub Close()
If Not dbConn Is Nothing Then
dbConn.Close()
End If
End Sub
#End Region
#End Region
End Class
그리고 여기입니다 Sproc의 일괄 래퍼 :
Imports FirebirdSql.Data.Firebird
Imports FirebirdSql.Data.Firebird.Services
Imports FirebirdSql.Data.Firebird.Isql
Public Class Batch
#Region " Private Variables "
Private clsCM As myfbdb
#End Region
#Region " Private Enums "
Private Enum AUType
Add = 0
Update = 1
End Enum
#End Region
#Region " Stored Procedures "
#Region " Add/Update "
Private Function AU_Batch(ByVal itmBatch As cmdbType_Batch, ByVal au As AUType) As Integer
Try
Dim rtnIndex As Integer = -1
'Create Temporary Command
Dim tmpTrans As FbTransaction = clsCM.cmdb.BeginTransaction
Dim tmpSQLCommand As FbCommand = New FbCommand("SP_IU_BATCH", clsCM.cmdb, tmpTrans)
tmpSQLCommand.CommandType = Data.CommandType.StoredProcedure
'Add Parameters
Dim prmAUType As FbParameter = tmpSQLCommand.Parameters.Add("@AUTYPE", FbDbType.Integer)
Dim prmBatchID As FbParameter = tmpSQLCommand.Parameters.Add("@BATCHID", FbDbType.Integer)
Dim prmMAT_BatchID As FbParameter = tmpSQLCommand.Parameters.Add("@MAT_BATCHID", FbDbType.Integer)
Dim prmDOS As FbParameter = tmpSQLCommand.Parameters.Add("@DOS", FbDbType.Date)
Dim prmFacilityName As FbParameter = tmpSQLCommand.Parameters.Add("@FACILITYNAME", FbDbType.VarChar, 250)
Dim prmFacilityID As FbParameter = tmpSQLCommand.Parameters.Add("@FACILITYID", FbDbType.Integer)
Dim prmRtnIdx As FbParameter = tmpSQLCommand.Parameters.Add("@RTNIDX", FbDbType.Integer)
'Specify Output Parameters
prmRtnIdx.Direction = Data.ParameterDirection.Output
'Set the Parameter Values
With itmBatch
prmAUType.Value = CInt(au)
prmBatchID.Value = .BatchID
prmMAT_BatchID.Value = .MAT_BatchID
prmDOS.Value = .DOS
prmFacilityName.Value = clsCM.enc.EncryptString128Bit(.FacilityName, Crypt_Text(clsCM.ivKey))
prmFacilityID.Value = .FacilityID
End With
'Execute the Stored Procedure
tmpSQLCommand.ExecuteNonQuery()
If au = AUType.Add Then
rtnIndex = prmRtnIdx.Value
End If
tmpTrans.Commit()
'Clean up
tmpSQLCommand = Nothing
Return rtnIndex
Catch ex As Exception
RaiseError(ex)
Return Nothing
End Try
End Function
#End Region
#Region " Public Functions "
Public Function AddBatch(ByVal itmBatch As cmdbType_Batch) As Integer
Try
clsCM.Open()
Dim rtnInteger As Integer = AU_Batch(itmBatch, AUType.Add)
clsCM.Close()
Return rtnInteger
Catch ex As Exception
RaiseError(ex)
clsCM.Close()
Return Nothing
End Try
End Function
Public Function UpdateBatch(ByVal itmBatch As cmdbType_Batch) As Integer
Try
clsCM.Open()
Dim rtnInteger As Integer = AU_Batch(itmBatch, AUType.Update)
clsCM.Close()
Return rtnInteger
Catch ex As Exception
RaiseError(ex)
clsCM.Close()
Return Nothing
End Try
End Function
#End Region
#Region " Public Properties "
Public WriteOnly Property dbConn() As CodingModuleDB
Set(ByVal value As CodingModuleDB)
clsCM = value
End Set
End Property
#End Region
End Class
많은 코드가 있었지만 어려운 일을해야했습니다. 격차 해소에 도움이되기를 바랍니다. Firebird는 정말 훌륭한 데이터베이스입니다.
소스 코드를 제공해 주셔서 감사합니다. 어디에 넣어야하는지, DataTable의 행을 업데이트하는 특정 함수를 호출하는 방법을 모르겠습니다. – user529948