Я думаю, у меня есть прямой вопрос. Я пишу систему, которая позволяет пользователям из компании A осуществлять единый вход в систему, и для этого я возвращаюсь в центральную базу данных пользователей в компании A и проверяю учетные данные пользователя, переданные мне.
В настоящее время моя реализация включает в себя построение моего запроса с использованием строкового редактора, а затем передачу строки в виде текста команды. Мой вопрос: есть ли более хороший способ сделать это. ниже мой код;
public User LoginSSO(string UserName, Int32 sectorCode)
{
using (OdbcConnection con = new OdbcConnection(ConfigurationManager.ConnectionStrings["ComapnyA"].ConnectionString))
{
con.Open();
StringBuilder sb = new StringBuilder();
sb.AppendLine("Select mx.Id, mx.UserName, mx.firstname,mx.surname,mx.sectorCode,");
sb.AppendLine("mx.deleteFlag, dn.sectorGroupCode, dn.region, dn.district");
sb.AppendLine("from users mx");
sb.AppendLine("Inner Join sector dn on dn.sectorCode = mx.sectorCode");
sb.AppendLine("Where (mx.UserName = '{0}')");
string commandText = string.Format(sb.ToString(), UserName, sectorCode);
using (OdbcCommand comm = new OdbcCommand(commandText, con))
{
using (OdbcDataReader reader = comm.ExecuteReader())
{
if (reader.Read())
{
User user = new User();
user.Id = Convert.ToInt32(reader["Id"]);
user.Username = Convert.ToString(reader["UserName"]);
user.Firstname = Convert.ToString(reader["firstname"]);
user.Surname = Convert.ToString(reader["surname"]);
_dealerGroupCode = Convert.ToString(reader["sectorGroupCode"]);
_region = Convert.ToInt32(reader["region"]);
_district = Convert.ToInt32(reader["district"]);
_dealerCode = dealerCode;
_accessLevel = AccessLevel.Sector;
return user;
}
}
}
}
return null;
}
Мне не нравится тот факт, что я создаю свой sql, который в конечном итоге является статическим script. Обратите внимание, что я не могу каким-либо образом манипулировать удаленным сервером или добавлять к нему какие-либо хранимые процедуры. Для остальной части приложения я использовал LINQ, но я предполагаю, что это не вариант.
Вы можете использовать процедуру хранения системы sp_addlinkedserver для связи с сервером удаленного сервера, а затем запустить запрос. следующая команда образца.:
EXEC sp_addlinkedserver
@server = ‘SourceServer’
, @Srvproduct = "
, @Provider = ‘SQLNCLI’
, @datasrc = ‘Remote SQL Server instance name’
Я предлагаю вам обратиться к следующей ссылке, чтобы узнать, как запустить SQL-запрос на удаленном сервере http://ashishkhandelwal.arkutil.com/sql-server/sql-query-to-the-remote-sql-server/
Это самый низкоуровневый способ запроса базы данных с ADO.NET. Откройте соединение, отправьте команду, зачитайте результаты. Однако вы должны использовать параметризованные запросы вместо String.Format, так как это откроет вашу программу для SQL-инъекции. Просто подумайте, что произойдет, если в UserName будет символ. Было бы намного лучше:
string sql = @"Select mx.Id, mx.UserName, mx.firstname, mx.surname,
mx.sectorCode, mx.deleteFlag, dn.sectorGroupCode,
dn.region, dn.district
From users mx
Inner Join sector dn on dn.sectorCode = mx.sectorCode
Where (mx.UserName = ?)";
var command = new OleDbCommand(sql);
command.Parameters.AddWithValue(0, UserName);
Если вам нужен интерфейс более высокого уровня, просмотрите DataSets/DataAdapters. Они не так причудливы, как LINQ, но они дадут вам легкое заполнение/обновление и работу с любым адаптером базы данных. Если вы используете Visual Studio, вы даже можете получить визуальный дизайнер, который может генерировать Typed Datasets в режиме перетаскивания, который даст вы сильно типизировали аксессоры для всех ваших данных.
Вы также можете посмотреть в родные классы соединителей MySql вместо использования ODBC.