Запрос удаленного сервера MySql

0

Я думаю, у меня есть прямой вопрос. Я пишу систему, которая позволяет пользователям из компании 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, но я предполагаю, что это не вариант.

Теги:
odbc

2 ответа

0

Вы можете использовать процедуру хранения системы 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/

0

Это самый низкоуровневый способ запроса базы данных с 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.

  • 0
    Привет, Лила, спасибо за ответ на мой вопрос. Я предполагаю, что мой вопрос заключается в том, что кроме схемы БД у меня нет другого доступа к этой базе данных, и в других случаях я использовал linq или хранимые процедуры, где это необходимо (но это было в моей собственной локальной базе данных). Я ненавижу создание sql в stringbuilder в моем коде c #, есть ли альтернатива этому. Я пошел с устройством чтения данных через адаптер данных, потому что где-то читал, что считыватели лучше справляются с производительностью.
  • 0
    DataAdapter (и Linq, и все остальное) использует DataReader внизу. Однако DataAdapter предоставит вам функции, которых у вас нет с DataReader, например, не нужно создавать запрос вручную. Если вы действительно не хотите этого делать, я отредактировал свой комментарий, чтобы привести пример параметризованных запросов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню