2017-01-23 2 views
1

У меня есть несколько свободно доступных слоев доступа к данным на моем бизнес-сайте. Я всегда следил за базой данных Firebird на своем сайте и теперь решил создать новый уровень доступа к данным для этого механизма базы данных.Проблема с Firebird ADO.NET с загрузкой набора данных из FbDataAdapter

Я использую поставщика ADO.NET, рекомендованного на сайте Firebird (https://www.firebirdsql.org/en/net-provider/). Используемая версия - 5.5.

Я разработал простую хранимую процедуру для обработки возвращаемых нескольких столбцов данных, которые были успешно протестированы в моем диспетчере баз данных. Он также был успешно протестирован с считывателем данных в тестовом клиенте, который я создаю для своего уровня доступа к данным Firebird.

Однако, когда я пытаюсь проверить хранимую процедуру против возвращения набора данных, я постоянно получаю ошибку при слежении ...

Невозможно привести объект типа «System.String», чтобы ввести 'System.Byte []'

Даже простой встроенный запрос с параметром дает ту же ошибку.

Однако эти же тесты отлично работают с моими процессами чтения данных.

Эта ошибка всегда возникает, когда дело доходит до моего кода в процессе, который «заполняет» набор данных из адаптера данных Firebird.

Код я тестирую ниже

Public Overloads Function ExecuteDataSet(ByVal psConnectionString As String, _ 
             ByVal psQuery As String, _ 
             ByRef poParameterStructures As ArrayList) As DataSet 

    Dim loParameterStructures As New ArrayList() 

    Dim loDataSet    As DataSet 
    Dim loFbSqlConnection  As FbConnection = Nothing 
    Dim loFbSqlParameter   As FbParameter 
    Dim loFbSqlCommand   As FbCommand = Nothing 
    Dim loFbSqlDataAdapter  As FbDataAdapter = Nothing 


    Try 
     'DataTable dt = new DataTable(); 
     'FbDataAdapter da = new FbDataAdapter("select_mytable", ConfigurationManager.ConnectionStrings["mydb"].ConnectionString); 
     'da.SelectCommand.CommandType = CommandType.StoredProcedure; 
     'da.SelectCommand.Parameters.Add("@id", 123); 
     'da.Fill(dt); 

     loFbSqlConnection = Get_DBConnection(psConnectionString) 

      loFbSqlCommand = New FbCommand(psQuery, loFbSqlConnection) 
      loFbSqlCommand.CommandTimeout = ciTimeOut 

      ' check for parameterized inline SQL or stored-procedure 
      If ((psQuery.IndexOf("@") > -1) Or _ 
       (psQuery.ToUpper().IndexOf("SELECT ") > -1)) Then 
       loFbSqlCommand.CommandType = CommandType.Text 
      Else   
       loFbSqlCommand.CommandType = CommandType.StoredProcedure  
      End If 


      ' create parameters for stored-procedure 
      If (Not poParameterStructures Is Nothing) Then 
       For Each loFbSqlHelperParameterStructure As FbSqlHelperParameterStructure In poParameterStructures 
        loFbSqlParameter = New FbParameter() 

         loFbSqlParameter.ParameterName = loFbSqlHelperParameterStructure.PARAMETER_NAME 
         loFbSqlParameter.DbType = loFbSqlHelperParameterStructure.PARAMETER_FBSQLDBTYPE 
         loFbSqlParameter.Direction = loFbSqlHelperParameterStructure.PARAMETER_DIRECTION 

         Select Case loFbSqlParameter.Direction 
          Case ParameterDirection.Input: 
           loFbSqlParameter.Value = loFbSqlHelperParameterStructure.PARAMETER_VALUE 
           loFbSqlParameter.Size = loFbSqlHelperParameterStructure.PARAMETER_SIZE 

          Case ParameterDirection.Output: 
           loFbSqlParameter.Size = loFbSqlHelperParameterStructure.PARAMETER_SIZE 
         End Select 

        loFbSqlCommand.Parameters.Add(loFbSqlParameter) 
       Next 
      End If 

     loFbSqlDataAdapter = New FbDataAdapter()     
     loFbSqlDataAdapter.SelectCommand = loFbSqlCommand 

     loDataSet = New DataSet() 
     loFbSqlDataAdapter.Fill(loDataSet) 
    Catch loFbSqlException As FbException 
     Throw loFbSqlException 
    Catch loException As Exception 
     Throw loException 
    Finally 
     loFbSqlCommand.Dispose() 
     loFbSqlConnection.Close() 
     loFbSqlConnection.Dispose() 
    End Try 


    poParameterStructures = loParameterStructures 

    Return (loDataSet) 
End Function 

Код выше также был успешно использован с другими моими слоями доступа к данным, которые поддерживают SQL Server, SQL Server CE, MySQL и PostgreSQL.

Однако, в случае с базой данных Firebird, независимо от того, какая настройка кода из всей документации, полученной мной при приобретении набора данных из базы данных Firebird, дает точно такую ​​же ошибку, как указано выше. Таким образом, приведенный здесь код - это исходный код, который успешно используется в моих других слоях доступа к данным.

ответ

0

я, наконец, нашел проблему с кодом выше ...

Если вы посмотрите на мой «Наконец» заявление вы увидите следующую строку кода ... «loFbSqlCommand.Dispose()»

Несмотря на то, что эта строка кода была успешно использована в других распространяемых нами платах доступа к данным, для поставщика данных Firebird ADO.NET она разбивает цепочку опорных указателей на возвращаемый набор данных, который является полностью отдельным объектом из FbDataAdapter.

Удалите эту строку кода или прокомментируйте ее, и код работает нормально.

+0

Не могли бы вы найти ошибку для этого на http://tracker.firebirdsql.org/browse/DNET, потому что это не похоже на то, что должно произойти. –

Смежные вопросы