vs2019 c# веб-сервис msaccess - PullRequest
0 голосов
/ 05 мая 2020

в vs2019 (c#) Я использую очень простой код

OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=D:\\Data\\000_TEST.accdb";
conn.Open();
conn.Close();

и работаю нормально: я имею в виду - при запуске этого кода «000_TEST.accdb» этот файл генерирует «000_TEST.laccdb», а через 60-80 секунд удаляется автоматически; Я могу повторять это много раз, и все в порядке.

но когда я пытаюсь использовать этот код в веб-сервисе и вызывающем методе, он снова работает правильно, также генерируется файл «000_TEST.laccdb», а после 60 -80 секунд удалено, но есть 1 проблема: до того, как будет виден файл «000_TEST.laccdb», вызов этого метода возможен, и я могу вызывать этот метод много раз, но через 60-80 секунд - когда «000_TEST.laccdb» "файл удален и не отображается, когда я пытаюсь вызвать этот метод, я получаю сообщение об ошибке:

System.Runtime.InteropServices.SEHException: External component has thrown an exception.
   at System.Data.OleDb.DataSourceWrapper.InitializeAndCreateSession(OleDbConnectionString constr, SessionWrapper& sessionWrapper)
   at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
   at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OleDb.OleDbConnection.Open()
   at WSTest.WebService1.Incr(String conStr, Int32 a) in D:\My Documents\VS Projects\WSTest\WSTest\WebService1.asmx.cs:line 41

Примечание: строка 41 -" conn.Open (); "

1 Ответ

0 голосов
/ 06 мая 2020

это 1 метод ниже этого возврата идентификатора пользователя, если имя пользователя и пароль верны; он работает нормально в первый раз и позже, когда файл laccdb виден, но если я подожду, пока этот файл laccdb не станет видимым (это примерно 60-80 секунд), и вызывая этот метод, я получаю ошибку (которую я описываю в первом сообщении)

но этот код метода не важен. Я получаю ту же ошибку, когда открываю и закрываю соединение только без каких-либо данных; также не зависят от файла доступа, если я открываю файл доступа, который пуст (внутри нет таблиц), такая же ошибка.

, поэтому проблема с открытием и закрытием соединения из веб-службы. тот же код из c# windows форма работает нормально.

 [WebMethod]
        public int GetToken(string UserName, string Password)
        {
            string queryString = "SELECT ID FROM CORE_Staffs WHERE PID='" + UserName + "' and Password='" + Password + "'";
            DataSet ds = new DataSet();
            OleDbConnection conn = new OleDbConnection(connectionString);
            OleDbCommand cmd = new OleDbCommand(queryString, conn);
            conn.Open();
            OleDbDataAdapter Adapter = new OleDbDataAdapter(cmd);
            Adapter.Fill(ds);
            if (ds.Tables[0].Rows.Count == 0)
            {
                conn.Close();
                return 0;
            }
            else
            {
                string S;
                S = ds.Tables[0].Rows[0][0].ToString();
                conn.Close();
                return Int32.Parse(S);
            }
        }
...