Member 13922470 Ответов: 1

Sqldataadapter не заполняет datatable.


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

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

public DataTable GetAllSessionForDoctor(DateTime dtsession, long locationId)
      {
          SqlCommand cmd = new SqlCommand();
          SqlConnection con = new SqlConnection(Properties.Settings.Default.HMSCon);
          string str = "SELECT  tblEmployee.Employeeid, tblEmployee.EmployeeName + ' ' + tblEmployee.MiddleName + ' ' + tblEmployee.LastName AS [Doctor Name] " +
               " FROM tbluserType INNER JOIN tblEmployee ON tbluserType.utid = tblEmployee.type INNER JOIN " +
               " sessionDoctor ON tblEmployee.Employeeid = sessionDoctor.doctorID INNER JOIN sessionOPD ON sessionDoctor.sessionID = sessionOPD.sessionId INNER JOIN " +
               " tblDoctorCategory ON sessionDoctor.doctorID = tblDoctorCategory.doctorId WHERE (sessionOPD.sessionDate = '" + dtsession + "') AND (tblEmployee.LocationId = " + locationId + ") AND (tbluserType.CEP = 'true') and (tblemployee.EndJob = 'false')";

          SqlDataAdapter da = new SqlDataAdapter(str, con);
          DataTable dt = new DataTable();
          try
          {
              con.Open();
              da.Fill(dt);
              //MessageBox.Show(dt.ToString());
          }
          catch (Exception ex)
          {
              throw new Exception(ex.Message);
          }
          finally
          {
              con.Close();
          }
          return dt;
          //MessageBox.Show(dt.ToString());
      }

F-ES Sitecore

Для построения запроса используйте параметризованные запросы, а не конкатенацию строк. Что само по себе может сделать и проблема исчезнет.

Чтобы опередить ваш следующий вопрос, google "c# ado.net paramterised query", чтобы узнать, как это сделать.

Member 13922470

Спасибо за ваш ответ, но первое, что этот код уже сделал кто-то другой. я работаю над чужим кодом, поэтому не могу делать DROP и DELETE. пожалуйста, дайте мне какое-нибудь другое решение. Еще раз заранее спасибо

F-ES Sitecore

Вам вообще не нужно изменять базу данных, просто обновите код.

Member 13922470

Итак, каков наилучший вариант решения этой проблемы, сэр?

F-ES Sitecore

Я и OriginalGriff уже говорили вам...используйте параметризованные запросы, а не стройте инструкцию SQL в виде одной строки.

Richard Deeming

const string str = "SELECT  tblEmployee.Employeeid, tblEmployee.EmployeeName + ' ' + tblEmployee.MiddleName + ' ' + tblEmployee.LastName AS [Doctor Name] " +
    " FROM tbluserType INNER JOIN tblEmployee ON tbluserType.utid = tblEmployee.type INNER JOIN " +
    " sessionDoctor ON tblEmployee.Employeeid = sessionDoctor.doctorID INNER JOIN sessionOPD ON sessionDoctor.sessionID = sessionOPD.sessionId INNER JOIN " +
    " tblDoctorCategory ON sessionDoctor.doctorID = tblDoctorCategory.doctorId WHERE (sessionOPD.sessionDate = @dtsession) AND (tblEmployee.LocationId = @locationId) AND (tbluserType.CEP = 'true') and (tblemployee.EndJob = 'false')";

SqlDataAdapter da = new SqlDataAdapter(str, con);
da.SelectCommand.Parameters.AddWithValue("@dtsession", dtsession);
da.SelectCommand.Parameters.AddWithValue("@locationId", locationId);

1 Ответов

Рейтинг:
1

OriginalGriff

Не делай ничего подобного. Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Исправьте все ваше приложение, прежде чем вы даже подумаете об этой проблеме, и почти наверняка вы обнаружите, что ваша проблема исчезла в то же самое время!