Я попытался подключиться к моей базе данных SQL, размещенной на Plesk, с InterServer, используя C# ASP.NET MVC. Несмотря на многочисленные усилия, он, кажется, никогда не хочет подключаться. Что я делаю неправильно?
Я много раз пытался изменить строку подключения. Служба поддержки Plesk и InterServer просит меня развернуть мой код и получить доступ к базе данных через локальный хост. В связи с этим я пробовал следующие строки подключения:
"SERVER=localhost;DATABASE=databasename;UID=username;PASSWORD=password;"
"SERVER=localhost:3306;DATABASE=databasename;UID=username;PASSWORD=password;"
"SERVER=localhost;PORT=3306;DATABASE=databasename;UID=username;PASSWORD=password;"
"SERVER=(Local);DATABASE=databasename;UID=username;PASSWORD=password;"
Я попытался поменять местами «Сервер» с «Источником данных», среди других изменений ключевых слов. Я также пытался установить для Trusted_Connection значение true и false, а для Integrated Security — значение true и false. Кажется, когда я пытаюсь установить для них значение true, приложение пытается войти в систему, используя мое имя пользователя Plesk, а не идентификатор пользователя, который я указал в строке подключения. Этот пользователь не связан с базой данных, и я не могу связать его с панелью управления Plesk, насколько мне известно.
Я также попытался использовать строку подключения по умолчанию в панели управления Plesk вместе с парой модификаций указанных строк подключения, одна из которых даже была предоставлена службой поддержки InterServer, поскольку они подозревают, что ошибка связана с моими строками подключения. Вот эти строки:
"data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
"Data Source=(IPAddressWasHere)\MSSQLSERVER2017;Initial Catalog=nlstatic;Persist Security Info=True;User ID=username;Password=password"
"Data Source=.\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\db.mdf;Initial Catalog=Portal.Web;Integrated Security=True"
"Data Source=.\SQLExpress;Initial Catalog=localhost;Integrated Security=True"
Я также попытался изменить имя доказывающего с System.Data.SqlClient на MySql.Data.SqlClient, но это, похоже, не изменило сообщение об ошибке. Лично я подозреваю, что проблема связана не с настройкой строки подключения, а с конфигурацией базы данных MySQL или ее настройками.
Несмотря на попытки обратиться в службу поддержки InterServer за помощью по этому поводу, они отказываются разбираться в этом вопросе. Вместо этого они однажды попросили меня «правильно настроить мой VPS» (у меня вообще нет VPS с ними) и попытались убедить меня, что я пытаюсь подключиться через ODBC, когда я четко заявил, что это было через строки подключения.
Если это уместно, вот мой код С# о том, как я использую строку подключения, хотя лично я не считаю это причиной:
public List<string> GetEffectByID(int id)
{
List<string> results = new List<string>();
SqlConnection conn;
string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
conn = new SqlConnection(connectionString);
try
{
using (SqlCommand command = new SqlCommand("getFxById", conn) { CommandType = CommandType.StoredProcedure })
{
conn.Open();
using (SqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
results.Add(dr["myColumn"].ToString());
}
}
conn.Close();
return results;
}
} catch(Exception e)
{
if (conn.State == ConnectionState.Open) conn.Close();
return new List<string>() { e.ToString() };
}
}
Эта хранимая процедура определенно существует в моей базе данных и работает в phpMyAdmin.
Есть ли что-то, что я пропустил на протяжении всего этого процесса? Я ожидаю, что он сможет подключиться и запустить хранимую процедуру, когда мой View вызовет функцию. Несмотря на это, используя методы, предоставляемые Plesk/InterServer, он утверждает, что сервер не найден/не доступен. Когда я пытаюсь использовать созданные мной строки подключения (без использования встроенной безопасности), вместо этого появляется следующее сообщение об ошибке:
System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'Shizuku'. at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource
1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 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, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1 retry) at System.Data.SqlClient.SqlConnection.Open() at (Code file was here) ClientConnectionId:953f6859-a48b-4f58-a0b8-bef0702911a3 Error Number:18456,State:1,Class:14
Мне кажется, что эта ошибка означает, что я сейчас ближе к решению проблемы, но я не совсем уверен. Есть ли что-то, что я не пробовал, или какая-то ошибка, которую я сделал, которую я просто пропустил?
Я обнаружил ошибку: мой хост, InterServer, отклонял соединение, утверждая, что «соединение с локальным хостом было удаленным соединением». После нескольких часов общения со службой поддержки я, наконец, запросил возврат средств.
После этого агент поддержки, наконец, начал отчаянно пытаться заставить его работать, пытаясь найти решение, изменив мой Web.config, поскольку он был убежден, что это моя проблема, а не его. Безрезультатно, он сделал тестовый домен и скопировал мои файлы/базу данных. Конечно, у него не было моего кода C#, и это привело к ошибке «Объект не установлен в ссылку» для оператора создания объекта (с использованием нового ключевого слова). В крайнем случае он создал PHP-файл, который буквально гласил: «Соединение успешно выполнено» и не содержал реального кода, а затем прислал мне ссылку на него, заявив, что «ошибка была не на стороне сервера, понимаете?»
Решение моей проблемы заключалось в том, чтобы не покупать виртуальный хостинг у InterServer и, возможно, даже не использовать InterServer в целом. Их поддержка ужасна, и они используют такие теневые тактики, чтобы клиенты могли устранять неполадки после 30-дневного периода возврата денег. Предостережение для покупателя.