Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос к базе через SqlClient в dataGridView. Заполнение dataGridView. 
:(
    Опции темы
NURMS
Дата 10.12.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Народ привет!
Для консоли я пишу так: ( через using System.Data.SqlClient )
Код

static void Main(string[] args)
        {
            SqlConnection Con = new SqlConnection("Server=.; Database = DB1-Proc; Trusted_Connection = yes");
            Con.Open();
            SqlCommand cmd = new SqlCommand("SELECT * FROM CPU", Con);
            SqlDataReader Read = cmd.ExecuteReader();
            while (Read.Read())
            {
                Console.WriteLine(Read.GetString(0) + " | " + Read.GetInt32(1) + " | " + Read.GetString(2));
            }
            Console.ReadLine();
        }


Теперь для WindowsApp это всё нужно проделать в dataGridView. Но что-то в голову ничего не приходит, а чёртов MSDN загнулся. Да и я просмотрел остальные темы, но полной картины не встретил.

PM MAIL   Вверх
HAL707
Дата 10.12.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.9.2007

Репутация: нет
Всего: 4



Ну можно так сделать:
Код

SqlConnection Con = new SqlConnection("Server=.; Database = DB1-Proc; Trusted_Connection = yes");
            Con.Open();
            SqlCommand cmd = new SqlCommand("SELECT * FROM CPU", Con);
            SqlDataReader Read = cmd.ExecuteReader();
            DataTable dt = new DataTable(Read);
            dataGridView.DataSource = dt;

PM MAIL   Вверх
NURMS
Дата 10.12.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Что-то не покатило. 
Никакого действия не проявила прога. Никакой реакции. 
PM MAIL   Вверх
unicuum
Дата 11.12.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(HAL707 @  10.12.2007,  16:56 Найти цитируемый пост)
Ну можно так сделать:
Выделить всё код C#

SqlConnection Con = new SqlConnection("Server=.; Database = DB1-Proc; Trusted_Connection = yes");
            Con.Open();
            SqlCommand cmd = new SqlCommand("SELECT * FROM CPU", Con);
            SqlDataReader Read = cmd.ExecuteReader();
            DataTable dt = new DataTable(Read);
            dataGridView.DataSource = dt;

Что-то я не понимаю, почему SqlDataReader находится в конструкторе DataTable? Единственный перегруженный конструктор у DataTable с одним аргументом типа String - название таблицы, так что код работать не будет.

Ради интереса написал следующий пример. Чтобы он заработал нужно задать имя своего компьютера, вместо ComputerName и кинуть на форму DataGridView. Ещё в примере использовалась база Northwind, надо или её установить как я написал в следующем топике

http://forum.vingrad.ru/forum/topic-184719.html

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

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            String cn = "Data Source=ComputerName\\sqlexpress;Initial Catalog=Northwind;Integrated Security=True;";
            String qr = "SELECT * FROM dbo.Customers";
            DataTable dt = new DataTable();
            dataGridView1.DataSource = SelectRows(dt, cn, qr);
        }

        private static DataTable SelectRows(DataTable datatable, string connectionString, string queryString)
        {
            using (SqlConnection connection =
                new SqlConnection(connectionString))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(queryString, connection);
                adapter.Fill(datatable);
                return datatable;
            }
        }
    }
}



--------------------
user posted image
обычный день на винграде
PM   Вверх
NURMS
Дата 11.12.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Что-то я не врубаюсь. Кажется, что не находит базу что-ли. У меня SQL Server 2005 и для ConsoleApplication писал "Server=.; Database = DB1-Proc; Trusted_Connection = yes", всё круто шло, а тут вообще не реагирует. Тоже самое и с "Data Source = ComputerName\\sqlexpress (соответствующее); Initial Catalog=Northwind; Integrated Security=True;". 
PM MAIL   Вверх
HAL707
Дата 11.12.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.9.2007

Репутация: нет
Всего: 4



To unicuum
Цитата

Что-то я не понимаю, почему SqlDataReader находится в конструкторе DataTable

Ой сори. Писал на коленке и забыл что через Load данные грузятся.
Код

...
DataTable dt = new DataTable();
dt.Load(Read);
...

PM MAIL   Вверх
unicuum
Дата 11.12.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(HAL707 @  11.12.2007,  17:41 Найти цитируемый пост)
Ой сори. Писал на коленке и забыл что через Load данные грузятся.

Вот дозаливка посредством Load уже похоже на правду. smile 


Цитата(NURMS @  11.12.2007,  17:35 Найти цитируемый пост)
Что-то я не врубаюсь. Кажется, что не находит базу что-ли. У меня SQL Server 2005 и для ConsoleApplication писал "Server=.; Database = DB1-Proc; Trusted_Connection = yes", всё круто шло, а тут вообще не реагирует. Тоже самое и с "Data Source = ComputerName\\sqlexpress (соответствующее); Initial Catalog=Northwind; Integrated Security=True;".

И что дальше? Точка после сервер, это значит ты берёшь текущий комп, а база данных соответственно имя базы. Как хочешь так и делай, я вообще строку не пишу, а беру её значение из Settings. smile 


--------------------
user posted image
обычный день на винграде
PM   Вверх
NURMS
Дата 12.12.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Всё спасибо получилось. 
PM MAIL   Вверх
NURMS
Дата 13.12.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Это всё круто. А когда сеть не найдена он выносит фатальную для юзера ошибку. Есть ли функция, которая проверяет наличие сервера?
PM MAIL   Вверх
thomas
Дата 13.12.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



NURMS
SQLDMO
Код

Imports SQLDMO
Module SQLServersDMO
    Public Sub LoadSQLServers()
        Dim intCounter As Integer
        Dim SQLName As NameList
        Try
            Dim SQLApp As New Application
            SQLName = SQLApp.ListAvailableSQLServers
            If SQLName.Count = 0 Then
                'Предпологаем, что SQLDMO все же установлен на клиенте ;-)
                Console.WriteLine("(local)")
            End If
            For intCounter = 1 To SQLName.Count
                Console.WriteLine(SQLName.Item(intCounter))
            Next
        Catch ex As Exception
            'Обработайте исключение
        End Try
    End Sub
    Sub Main()
        LoadSQLServers()
        Console.ReadLine()
    End Sub
End Module 

SMO:
Код

Imports System.Data
Imports Microsoft.SqlServer.Management.Smo
Module SMOTest
    Sub Main()
        Dim dt As DataTable = SmoApplication.EnumAvailableSqlServers(False)
        If dt.Rows.Count > 0 Then
            For Each dr As DataRow In dt.Rows
                Console.WriteLine(dr("Name"))
            Next
        End If
        Console.ReadLine()
    End Sub
End Module

реестр Windows (только для локальных серверов) :
Код

Imports Microsoft.Win32
Module SMOTest
    Sub Main()
        Dim rk As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Microsoft SQL Server")
        Dim instances As String() = CType(rk.GetValue("InstalledInstances"), String())
        If (instances.Length > 0) Then
            For Each element As String In instances
                If element = "MSSQLSERVER" Then
                    Console.WriteLine(System.Environment.MachineName)
                Else
                    Console.WriteLine(System.Environment.MachineName + "\" + element)
                End If
            Next
        End If
        Console.ReadLine()
    End Sub
End Module 

Успехов.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
unicuum
Дата 13.12.2007, 21:19 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Можно конечно проверить машину, типа как у thomas, хотя я его код не проверял, впрочем есть несколько вариантов, но зачем. Лучше использовать отлов исключений, так как принцип инкапсуляции ООП применительно к этому случаю гласит, нет необходимости использовать доступ к хостам, когда работаешь с БД.
Код

Инкапсуляция 
    Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейс (т. е. список декларируемых свойств и методов) класса и не вникать в его внутреннюю реализацию. Этот принцип (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов.

Говоря по простому, разработчики .NET Framework весь необходимый функционал для работы с БД зашили в классы отвечающие за работу БД, и находить хост есть смысл только если выбираешь его из многих, а если он заранее известен, то хватит и классов для работы с SQL Server.

Недавно наткнулся на занятный документ Как правильно задавать вопросы. Если следовать их логике то такой вопрос задан не верно.
Цитата(NURMS @  13.12.2007,  14:00 Найти цитируемый пост)
А когда сеть не найдена он выносит фатальную для юзера ошибку. Есть ли функция, которая проверяет наличие сервера? 

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


--------------------
user posted image
обычный день на винграде
PM   Вверх
NURMS
Дата 14.12.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



О. спасибо. Поищю похожее и в С#. 

И ещё Вопросик. У меня на базе стоят ограничения. Теперь при неправильном заполнении полей через C# он выносит ERROR C# - овской формы. Можно ли ошибки, которые выдаёт SQL Server передать на форму.
PM MAIL   Вверх
thomas
Дата 14.12.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



NURMS
Приветствую.
Цитата

Можно ли ошибки, которые выдаёт SQL Server передать на форму. 

В принципе я делаю все обращения к БД через конструкцию
Код

try
{
                dbCon.Open();
                dbCmd.CommandText = sql;
                dbCmd.CommandType = CommandType.Text;
                dbCmd.ExecuteNonQuery();
}
catch (Exeption ex)
{
                MessageBox.Show("ExecuteNonQuery fout :" + ex.Message, "fout Quary");
}
finally
{
                dbCon.Close();
}

А если ты используешь на MS SQL Server хранимые процедуры, то они могут возвращать return value. На основании того, что оно вернуло можно писать свои исключения. Обратись к vlsaf он как раз не давно это дело очень хорошо освоил. 
Успехов.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1115 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.