Вопросы по Listbox, Msql и конект

  • Автор темы Niceday
  • Дата начала
N

Niceday

Гость
#1
собственно вот текст программы:

Код:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;

class MainForm : Form
{
public MainForm()
{
Text = "Products";
list = new ListBox();
list.Location = new Point(15, 15);
list.Size = new Size(200, 200);
this.Controls.Add(list);
using (SqlConnection connection = new SqlConnection("server=сервер;Type System Version=SQL Server 2005;User ID=юзер;database=база"))
{
connection.Open();
if (String.Format("{0}", connection.State) == "Open")
{
MessageBox.Show(String.Format("Connection Status: {0} \nServer: {1} \nServer Version: {2} \nBase Name: {3}", connection.State, connection.DataSource, connection.ServerVersion, connection.Database));
SqlCommand command = new SqlCommand("SELECT [ProductName] FROM [Products]", connection);
SqlDataReader reader = command.ExecuteReader();

while (reader.Read())
{
list.Items.Add(String.Format("{0}", reader[0]));
}

}
}
}

public static void Main(string[] args)
{
Application.Run(new MainForm());
}

private ListBox list;
}
А теперь вопросы:
1) В случае с if (String.Format("{0}", connection.State) == "Open") все работает нормально, а вот если ввести плохое имя базы даже скомпилить нельзя до конца, как этого избежатьи заменить в случае с кривым адресом просто на месаг бокс типо "can't connect"

2) Как обрабатывать сообщения от лист бокса, понимаю что это что-то типо сообщения от кнопки в с++, но в мсдн ничего разумного найти не смог

3) Как обратиться к определенному элементу таблицы MSQL
while (reader.Read())
{
list.Items.Add(String.Format("{0}", reader[0]));
}
добавляет их все в листбокс, а вот по клику в лист боксе мне нужно будет вывести MessageBox'ом все остальные поля для данного элемента таблицы.

Если кто чем поможет, зарание спасибо
 
N

NikSoft

Гость
#2
Хороший тон в программировании - ложить строку Connection в файл конфигураций
 
P

Pasha

Гость
#3
1a. Допечатка же срабатывает: connection.State == ConnectionState.Open.
1b. Имя базы действительна надо вынести в конфиг, почитайте в любой книге про использование System.Configuration.
1c. Почитайте в тож же книге про обработку исключений. Сразу станет понятно как показать MessageBox при ошибке соединения.

2. Поставить обработчик на событие ListBox.SelectedIndexChanged Event. Но лучше воспользуйтесь средствами студии.

3. Почитайте про работу с DataSet и Master/Details страницами.
 
N

NikSoft

Гость
#4
В случае с if (String.Format("{0}", connection.State) == "Open") все работает нормально, а вот если ввести плохое имя базы даже скомпилить нельзя до конца, как этого избежатьи заменить в случае с кривым адресом просто на месаг бокс типо "can't connect"
Можно сделать, например, так

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;

namespace Niceday
{
public partial class Form1 : Form
{
private ListBox list;

public Form1()
{
InitializeComponent();

Text = "Products";
list = new ListBox();
list.Location = new Point(15, 15);
list.Size = new Size(200, 200);
this.Controls.Add(list);

SqlConnection connection = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=NorthWind;Type System Version=SQL Server 2005;");
try
{
connection.Open();

if (connection.State == ConnectionState.Open)
{
MessageBox.Show(String.Format("Connection Status: {0} \nServer: {1} \nServer Version: {2} \nBase Name: {3}", connection.State, connection.DataSource, connection.ServerVersion, connection.Database));
SqlCommand command = new SqlCommand("SELECT ProductName FROM Products", connection);
SqlDataReader reader = command.ExecuteReader();

while (reader.Read())
{
list.Items.Add(String.Format("{0}", reader["ProductName"]));
}
}
}
catch (SqlException)
{
if (connection.State != ConnectionState.Open)
{
MessageBox.Show("Failed to open a connection");
}
}
finally
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}

}
}

}
 
N

NikSoft

Гость
#5
Для: Niceday
Ты положил код выборки данных в конструктор формы( MainForm). Но конструктор формы предназначен для инициализации полей обьекта. Положи код выборки данных в метод
Код:
private void Form1_Load(object sender, EventArgs e)
{
...
}
 
N

Niceday

Гость
#6
Пришел я к одному выводу, книжка нужна, т.к. вопросы возникают и возникают, простые по шарпу не катят т.к. они тока про консольные приложения и формы рассказывают что и так понятно, а кто может подсказать где скачать хорошую кнужку по программированию на c# для msql где сама тема рассматривается от начала и до конца с примерами кода?