2016-04-10 2 views
-1

В настоящее время я работаю над заданием колледжа, в котором у меня возникают проблемы с чтением данных из базы данных SQL Server. Я пытаюсь прочитать столбец Dentist Name, а затем добавить эти имена в поле со списком.Не удается прочитать из базы данных SQL Server в C#

Однако при вводе имени столбца отображается ошибка.

Моя таблица называется dentistInfo с колоннами Dentist ID, Dentist Name, Dentist Surname, DOB и Gender.

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

public partial class Dentist_Info : Form 
{ 
    Surgery mySurgery = new Surgery(); 
    private SqlConnection conn; 
    private SqlCommand cmd; 
    private SqlDataAdapter da; 
    Surgery _formsSurgery; 

    public Dentist_Info(Surgery SurgeryToDisplay) 
    { 
     _formsSurgery = SurgeryToDisplay; 
    } 

    public void FillCombo() 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True"); 
     SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 

     SqlDataReader myreader; 
     conn.Open(); 

     try 
     { 
      myreader = SelectCommand.ExecuteReader(); 

      while (myreader.Read()) 
      { 
       string dname = myreader.GetString("Dentist Name"); 
       comboBox1.Items.Add(dname); 
      } 

      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message, ex); 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       conn.Close(); 
      } 
     } 
    } 
+0

изменение этой строки 'строка DNAME = myreader.GetString ("Dentist Name"); 'to 'string dname = (string) myreader [" Dentist Name "];' обязательно помогло бы, если бы мы знали, что такое ошибка. – MethodMan

+2

у вас есть пробелы как часть имен ваших столбцов, и это вызовет ошибку при оценке SQL-запроса.Если ваша база данных - это SQL Server, попробуйте этот «SELECT [Dentist ID], [Dentist Name], [Dentist Surname], DOB, Gender From DentistInfo». Если это MySQL, то используйте вместо этого квадратные скобки гравюрный акцент. – derloopkat

+0

Необходимо отправить сообщение об ошибке. Это как в гараже и говорить, что мой «автомобиль сломан, исправьте его» –

ответ

0

Попробуйте это: Я рекомендую вам положить [] в Стоматолог Имени, так как оно имеет место между этими двумя словами, что может привести вас ошибку или изменить имя из базы данных в DentistName

public void FillCombo() 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True"); 
     SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 
     conn.Open(); 
     DataSet ds = new DataSet(); 
     SqlDataAdapter da = new SqlDataAdapter(SelectCommand); 
     da.fill(ds); 

     foreach(DataRow dr in ds.Tables[0].Rows) 
     { 
      comboBox1.Items.Add(dr["[Dentist Name]"].ToString()); 
     } 
     conn.Close(); 
    } 

в соответствии с добавлением вместо использования conn.Open() и conn.Close(), в качестве ответа первого пользователя вы можете окружить соединение внутри, используя так:

using(SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True")) 
{ 
    //your codes here no need for conn.Open() and conn.Close() 
} 
+0

Еще раз спасибо за ответы ... У меня введен код JC Borlagdan, однако мне была дана следующая ошибка: Аргумент 1: невозможно преобразовать из System.Data.SqlClient.SqlCom и в строку. на этом бите кода указывается: DataSet ds = new DataSet (SelectCommand); Элемент SelectCommand в скобках подчеркнут. – Griff

+0

aaah мой плохой ... отредактировал sir –

+0

Brilliant thanks JC - Имена заселены в combobox - Большое спасибо за вашу помощь. – Griff

1

Pro-совет: Если вы хотите спросить об ошибке, вывесить ошибку.

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

Таким образом, либо вам необходимо передать индекс столбца (myreader.GetOrdinal("Dentist Name")), либо вам необходимо использовать индекс ((string)myreader["Dentist Name"]). В любом случае убедитесь, что вы правильно обрабатываете возможные значения NULL - считыватель данных просто выдает исключение, если вы пытаетесь прочитать значение NULL SQL.

Как и в сторону, ваш try ... catch можно упростить (и полезнее):

  • Если вы хотите повторно выдать исключение, используйте throw; (нет «аргумент»). Обведите исключение только в том случае, если у вас есть какая-либо информация для добавления.
  • Статья catch не требуется. Кажется, что вы используете его только для finally - это прекрасно, просто используйте try ... finally без catch.
  • conn никогда не может быть null в предложении finally - ваш try не хватает.
  • Для рисунка, подобного этому, вы хотите использовать using вместо try ... finally в любом случае. Вы также должны использовать using для устройства чтения данных.
+0

Считыватель данных может читать нулевой штраф, пока вы читаете что-то, что может обрабатывать нули. Прочитайте объект, проверьте, является ли строка строкой, если она есть. –

+0

@LorenPechtel, который известен как «обработка возможных значений NULL правильно». 'GetString' (и друзья) будет метать, индексщик вернет' DBNull.Value'. Самый простой (и самый дешевый) способ - просто использовать метод IsDBNull. – Luaan

+0

Спасибо за все ответы. Я гарантирую, чтобы приложить ошибку к дальнейшим проблемам. Я буду пытаться ответить на эти вопросы, когда я вернусь домой. Именно поэтому я понимаю, происходит ли ошибка, когда она попадает null, и у меня не было исключения для этого – Griff

Смежные вопросы