2010-12-03 5 views
0

어제 .NET Provider로 Firebird를 사용해 보았습니다. Firebird는 SQL Compact Edition을 능가 할 것입니다. 나는 그 기능과 정밀도에 놀랐다. 그러나 .NET 공급자에서 업데이트 가능한 RecordSet/ResultSet 기능을 찾을 수 없을 때 슬프다. FBResultSet은 아무것도 포함하지 않고 행 추가, 생성, 수정, 아무것도 포함하지 않습니다. 이 기능이 Firebird의 Ado .Net 제공 업체에 존재하는지는 누구도 알지 못합니다. 문서가 없기 때문입니다. 내 프리웨어 응용 프로그램에서 파이어 버드를 통합하기 위해 기다리고 있기 때문에 도움을 받고 싶습니다. 또한, 업데이트 가능한 RecordSet, ResultSet을 구현하기위한 대체 함수가있는 경우. 도와주세요.업데이트 가능한 결과 집합과 레코드 집합이 Firebird .NET 공급자에 있습니까?

감사합니다.

답변

1

나는 거기에 있었고, 해냈고, 티셔츠를 입었다. 그래서, 제가 당신의 고통을 느낄 때 당신에게 도움이 될만한 코드를 드릴 것입니다.

레코드 업데이트 추가 작업을 위해 저장 프로 시저 (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는 정말 훌륭한 데이터베이스입니다.

+0

소스 코드를 제공해 주셔서 감사합니다. 어디에 넣어야하는지, DataTable의 행을 업데이트하는 특정 함수를 호출하는 방법을 모르겠습니다. – user529948

관련 문제