У меня есть несколько свободно доступных слоев доступа к данным на моем бизнес-сайте. Я всегда следил за базой данных 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, дает точно такую же ошибку, как указано выше. Таким образом, приведенный здесь код - это исходный код, который успешно используется в моих других слоях доступа к данным.
Не могли бы вы найти ошибку для этого на http://tracker.firebirdsql.org/browse/DNET, потому что это не похоже на то, что должно произойти. –