Member 14925015 Ответов: 1

Visual basic 2017 - system.invalidoperationexception


я не очень хороший программист, но я использую vb.net 2005 и теперь хотите перейти на vb.net 2017 год. l я использую средства библиотеки Microsoft enterprise library для работы с хранимыми процедурами, но каждый раз, когда я запускаю свой проект, чтобы попытаться сохранить запись в sql server, я получаю следующую ошибку:

Система.InvalidOperationException: 'Фабрика поставщика баз данных не установлена для статического DatabaseFactory. Установите фабрику поставщиков, вызывающую метод DatabaseFactory.SetProviderFactory, или указав пользовательские сопоставления, вызвав DatabaseFactory.Метод SetDatabases.

я установил
Install-Package EnterpriseLibrary.Data -Version 6.0.1304
я использую трехуровневый подход и вот что я сделал в своем BusinessLogik:

Что я уже пробовал:

1) Класс Поставщиков
Imports Microsoft.Practices.EnterpriseLibrary.Common
Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports System.Data.Common
Imports System.Data
Public Class Suppliers

#Region "variables"
    Private dbs As Database
#End Region
#Region "Properties"
    Public Property SupplierID() As Long
    Public Property Company() As String
    Public Property Contact() As String
    Public Property Landline() As String
    Public Property Mobile() As String
    Public Property Physical_address() As String
    Public Property Postal_address() As String
    Public Property Vat_no() As String
    Public Property UserID() As Integer

#End Region
#Region "Constructor"
    Public Sub New(ByVal conn As String)
        dbs = DatabaseFactory.CreateDatabase(conn)
    End Sub
#End Region
#Region "Methods"
    Public Function SaveSuppliers() As Boolean
        Dim cmd As DbCommand = dbs.GetStoredProcCommand("sp_saveSuppliers")
        dbs.AddInParameter(cmd, "@supplierID", DbType.Int64, SupplierID)
        dbs.AddInParameter(cmd, "@company", DbType.String, Company)
        dbs.AddInParameter(cmd, "@contact", DbType.String, Contact)
        dbs.AddInParameter(cmd, "@landline", DbType.String, Landline)
        dbs.AddInParameter(cmd, "@mobile", DbType.String, Mobile)
        dbs.AddInParameter(cmd, "@physical_address", DbType.String, Physical_address)
        dbs.AddInParameter(cmd, "@postal_address", DbType.String, Postal_address)
        dbs.AddInParameter(cmd, "@vat_no", DbType.String, Vat_no)
        Try
            Dim ds As DataSet = dbs.ExecuteDataSet(cmd)
            MsgBox("Supplier saved successfully.", MsgBoxStyle.Information, "FinanceSys")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Information, "FinanceSys")
        End Try
        Return True
    End Function
#End Region
End Class


2) приложение кон
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
  </configSections>
  <connectionStrings>
    <add name="BusinessLogik.My.MySettings.FINConnectionString" connectionString="Data Source=FINANCE-SERVER;Initial Catalog=financial;Persist Security Info=True;User ID=sa;Password=password" />
  </connectionStrings>
  <section name="dataConfiguration"
 type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,
           Microsoft.Practices.EnterpriseLibrary.Data"/>
    <system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
            <source name="DefaultSource" switchName="DefaultSwitch">
                <listeners>
                    <add name="FileLog"/>
                    <!-- Uncomment the below section to write to the Application Event Log -->
                    <!--<add name="EventLog"/>-->
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="DefaultSwitch" value="Information" />
        </switches>
        <sharedListeners>
            <add name="FileLog"
                 type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                 initializeData="FileLogWriter"/>
            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
        </sharedListeners>
    </system.diagnostics>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
  </startup>
</configuration>


Пожалуйста, помогите, и я был бы рад, если бы кто-то также мог помочь в методе SaveSuppliers. верно ли последнее утверждение "Return True"?? В моем графическом проекте, где я вызываю функцию, я хочу вернуть сообщение.

1 Ответов

Рейтинг:
2

OriginalGriff

Цитата:
я был бы счастлив, если бы кто-то также мог помочь в методе SaveSuppliers. верно ли последнее утверждение "Return True"?

Что ж... скорее всего, нет.
Так как это единственный Return утверждение в целом методе означает, что внешний мир только когда-либо получает True как "код результата". Что довольно глупо, когда вы думаете об этом - зачем иметь метод, который только каждый раз возвращает одно и то же независимо от того, что происходит? Это просто означает, что "нет никакого смысла проверять или иным образом иметь дело с тем, что возвращает этот метод". Если он терпит неудачу и вы получаете исключение, то, возможно, он должен вернуться False чтобы вызывающий метод знал, что он не работает должным образом, и предпринял соответствующие действия.

И если это приложение с трехслойной моделью - а это хорошая идея, - то почему метод слоя данных вообще каким-то образом взаимодействует с пользователем? MessageBox - это хорошо, но в слое данных вы не должны "знать", в какой среде работает слой презентации, а MessageBox работает не во всех средах. Например, в веб - приложении MessageBox отображается на сервере, а не на клиенте-так что они оба не могут его увидеть или нажать кнопку "ОК"!
Вероятно, вам вообще не следует обрабатывать исключение, потому что вы не можете сделать с ним ничего, что имеет смысл для PL - так что пусть это произойдет, и пусть PL решит, нужно ли ему предупреждение, файл LoG2File и / или MessageBox.