2016-07-17 8 views
0

Я пытаюсь загрузить данные в ComboBox из SQL Server.Неверный синтаксис Рядом с '='. [WindowsForm]

Это метод, в котором возникает ошибка.

Хотя отлажена, это исключение ловится после следующей строки:

metroComboBoxFilterResultsCustomer.ValueMember = "[CD_Id]"; 

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

try 
{ 
    string cDateFrom = DateTime.Parse(metroDateTimeCFrom.Text).ToString("yyyy-MM-dd"); 
    string cDateTo = DateTime.Parse(metroDateTimeCTo.Text).ToString("yyyy-MM-dd"); 
    dbconnection.Open(); 
    DataTable dtName = new DataTable(); 
    string query = "SELECT CD_Id, CD_Customer_Name, CD_Effective_From, CD_Is_Active FROM ADM_Customer_Details WHERE CD_Is_Active = 1 AND CD_Effective_From BETWEEN @cDateFrom AND @cDateTo"; 
    SqlCommand com = new SqlCommand(query, dbconnection); 
    com.Parameters.Add("@cDateFrom", SqlDbType.DateTime).Value = cDateFrom; 
    com.Parameters.Add("@cDateTo", SqlDbType.DateTime).Value = cDateTo; 
    SqlDataReader reader = com.ExecuteReader(); 
    if (reader.Read()) 
    { 
     dtName.Load(reader); 
    } 
    var listNames = CustomerName.ConvertDataTableToList<CustomerIdNameHolder>(dtName) 
       .Where(x => x.CD_Customer_Name == metroTextBoxFilterCName.Text).ToList(); 
    metroComboBoxFilterResultsCustomer.DisplayMember = "[CD_Customer_Name]"; 
    metroComboBoxFilterResultsCustomer.ValueMember = "[CD_Id]"; 
    metroComboBoxFilterResultsCustomer.DataSource = listNames; 
} 
catch (SqlException ex) 
{ 
    throw ex; 
} 
finally 
{ 
    if (dbconnection.State == ConnectionState.Open) 
     dbconnection.Close(); 
} 

ДЛЯ ВЕДЕНИЯ

Пожалуйста, ссылки на следующие файлы классов, которые предполагает использование с этим кодом.

Класс файла: CustomerName.cs

public static class CustomerName 
{ 
    private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new() 
    { 
     T item = new T(); 
     foreach (var property in properties) 
     { 
      if (property.PropertyType == typeof(System.DayOfWeek)) 
      { 
       DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString()); 
       property.SetValue(item, day, null); 
      } 
      else 
      { 
       property.SetValue(item, row[property.Name], null); 
      } 
     } 
     return item; 
    } 
    public static List<T> ConvertDataTableToList<T>(this DataTable table) where T : new() 
    { 
     IList<PropertyInfo> properties = typeof(T).GetProperties().ToList(); 
     List<T> result = new List<T>(); 

     foreach (var row in table.Rows) 
     { 
      var item = CreateItemFromRow<T>((DataRow)row, properties); 
      result.Add(item); 
     } 
     return result; 
     //var customerName = dt.AsEnumerable().Select(dataRow => new CustomerName { Name = dataRow.Field<string>("SUQ_Question") }).ToList(); 
    } 

} 

Класс файла: CustomerIdNameHolder

class CustomerIdNameHolder 
{ 
    public int CD_Id 
    { 
     get; set; 
    } 

    public string CD_Customer_Name 
    { 
     get; set; 
    } 
} 

Project Файл

Если учесть более подробную информацию, загрузите исходный код частичного проекта here.

Пожалуйста, войдите в систему. Я включил оба приложения (отладки) и SQL-скрипты, чтобы вы столкнулись с той же проблемой, что и я.

Пожалуйста, дайте мне знать, если кто-нибудь исправит эту проблему.

Большое спасибо.

+1

Попробуйте снять квадратные скобки, имена столбцов в свойствах DisplayMember и ValueMember. –

+0

Обратите внимание, что вы не запускаете reader.Read, а затем DataTable.Load (reader) (если вы не хотите пропустить первую строку, возвращаемую из строк DataTable) – Steve

+0

@DanGuzman - я попробовал ваше предложение. По-прежнему такая же ошибка. – Muruga

ответ

0

Проблема не в коде, показанном но в обработчик события

metroComboBoxFilterResultsCustomer_SelectedValueChanged 

этот обработчик события вызывается после того, как вы установите свойство ValueMember или DisplayMember в коде выше.Первое, что делает код, чтобы попытаться выбрать

string query = @"SELECT * FROM ADM_Customer_Details 
       WHERE CD_Is_Active=1 AND CD_Id = " + 
       metroComboBoxFilterResultsCustomer.SelectedValue; 

Но в этот момент SelectedValue из metroComboBoxFilterResultsCustomer является недействительным, и это дает неверную строку SQL:

"SELECT * FROM ADM_Customer_Details WHERE CD_Is_Active=1 AND CD_Id = " 

И правильно это причина из неправильного синтаксиса у «=» (Вы можете попробовать это положить точку останова в обработчике события, чтобы увидеть порядок кодов событий)

Просто исправить Код добавления тест на нуль

private void metroComboBoxFilterResultsCustomer_SelectedValueChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     if (metroComboBoxFilterResultsCustomer.SelectedValue == null) 
      return; 
     .... 

SIDE ПРИМЕЧАНИЕ: Посмотрев на свой код, который я действительно предлагаю Вам удалить эту глобальную связь со всеми чеками для открытия/закрытия. Соединение является одноразовым объектом, который содержит Неуправляемые ресурсы, которые должны храниться в течение минимального времени.
Шаблон кодирования здесь CREATE/OPEN/USE/CLOSE/ОТЧУЖДАТЬ и это сценарий, в котором using statement вокруг одноразового объекта является обязательным

+0

Спасибо, Стив. Теперь я изменил вызов события Combobox 'SelectedValueChanged' из кода дизайнера на событие нажатия кнопки. Таким образом, это работает правильно. Я бы также изменил sql-инструкции в рамках блока. Приветствия. – Muruga

0

У вас есть несколько вопросов:

Вы не должны использовать «[» и «]» при указании имен свойств для отображения и ценности членов COMBOBOX в.

Вы не можете использовать Readed.Read перед загрузкой данных в DataTable.

DateTime cDateFrom = DateTime.Parse(metroDateTimeCFrom.Text); 
    DateTime cDateTo = DateTime.Parse(metroDateTimeCTo.Text); 
    dbconnection.Open(); 
    DataTable dtName = new DataTable(); 
    string query = "SELECT CD_Id, CD_Customer_Name, CD_Effective_From, CD_Is_Active 
        FROM ADM_Customer_Details WHERE CD_Is_Active = 1 AND CD_Effective_From 
        BETWEEN @cDateFrom AND @cDateTo"; 
    SqlCommand com = new SqlCommand(query, dbconnection); 
    com.Parameters.Add("@cDateFrom", SqlDbType.DateTime).Value = cDateFrom; 
    com.Parameters.Add("@cDateTo", SqlDbType.DateTime).Value = cDateTo; 
    SqlDataReader reader = com.ExecuteReader(); 
    dtName.Load(reader); 
    var listNames = CustomerName.ConvertDataTableToList<CustomerIdNameHolder>(dtName) 
       .Where(x => x.CD_Customer_Name == metroTextBoxFilterCName.Text).ToList(); 
    metroComboBoxFilterResultsCustomer.DisplayMember = "CD_Customer_Name"; 
    metroComboBoxFilterResultsCustomer.ValueMember = "CD_Id"; 
    metroComboBoxFilterResultsCustomer.DataSource = listNames; 
+0

Привет, я пробовал без и с "[", "]" брекетами, но ошибка все равно остается прежней. – Muruga

+0

@Muruga проверяет обновление, вам не нужно анализировать дату на строку. Поскольку вы указали параметр даты. – user3185569

+0

Все еще ошибка такая же. Я подтвердил результаты с помощью SSMS и запроса C#. Список заполняется, когда я проверял режим отладки. – Muruga