С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448

Считать с базы данных поля

18.06.2014, 22:38. Показов 6396. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начну с общего. Задание: разработать систему отслеживания ошибок для компании, занимающейся разработкой ПО.
Диаграммы и т.д. (всё, что нужно для организации) сделал, но, думаю, они не понадобятся.
Пишу программу в Visual Studio 2012. Создал БД с двумя таблицами (Actors,Code).
В таблице Actors колонки:Id(smallint - ключ),Name(nchar),Login(nchar),Password( nchar),Speciality(nchar (Или "Тестер" или "Разработчик").Создал первую форму,которая должна появляться при запуске программы - инициализация работника.
В ней пользователь (работник) вводит свои логин и пароль (объекты textBox) и кнопку "Ок" для входа.Получается хочу,чтобы при нажатии кнопки "Ок" считывались логин и пароль с БД и в соответствии Специальности выводилась соответствующая форма.Я вот двое суток сижу на msdn, читаю о DataSet и т.д. Все примеры там только о создании таблиц и БД; нету считывания полей с готовой БД (ни в одной статье). До сих пор не знаю как выполнить эту авторизацию работника, ибо с БД мы не учились работать (в ВУЗе дали только базовые знания о Windows-приложениях).Точнее не знаю как сравнить считанные строки с textBox-ов с строками в БД.Я добавил в форму объект bindingSource и соответственно создался DataSet (назвал "dataBaseDataSet").
Вот код формы (думаю поймёте над чем и как мучаюсь,судя по закомментированным частям кода, и поможете советами).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;
namespace WindowsFormsApplication2
{
    
    public partial class Form1 : Form
    {
       DataTable Actor = new DataBaseDataSet.ActorsDataTable();
       // foreach(DataRow row in Actor.Rows)
      //  DbContext db = new DbContext("DataBase.mdf");
       //     db = new DataContext("DataBase.mdf");
        string Login;
        string Password;
        public Form1()
        {
            InitializeComponent();
         //   SqlDataAdapter dataAdapter = new SqlDataAdapter();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Login = textBox1.Text;
            Password = textBox2.Text;
            
        }
 
        private void bindingSource1_CurrentChanged(object sender, EventArgs e)
        {
            DataTable Actor = new DataTable("Actors");
           // if(Login == Actor.Rows["Login"])
           // for(int i<0;i<DataBaseDataSet.ActorsDataTable.Rows.Count;i++)
          //  if (Login == DataBaseDataSet.ActorsDataTable.Rows.Login)
           
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
        
        }
    }
}
И вопрос: в строке
C#
1
  DataTable Actor = new DataTable("Actors");
Создаётся пустая таблица,но с колонками как в таблице Actors,или копия этой таблицы (с теми ж строками)?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2014, 22:38
Ответы с готовыми решениями:

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

Как считать из базы данных обьект image?
У меня в базе данных MS SQL 2008 храниться картинка. Как мне ее вывести в picturebox?

Считать содержимое BLOB поля из базы данных SQlite, используя API функций С/С++
Добрый день, необходимо корректно считать содержимое BLOB поля в программу и как-то удостовериться, что содержимое поля считано правильно. ...

5
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
19.06.2014, 00:28
БД MYSql или MSSQL?
Вы в обще sql запросы знаете? или в принципе не знаете синтаксис и как их писать?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  
using(var connection = new SqlConnection(connectionString))//connectionString - Ваша строка подключения 
            using (var command = connection.CreateCommand())
            {
                command.CommandType = CommandType.StoredProcedure;//StoredProcedure если вызов хранимки.
                command.CommandText = "[dbo].[CreateExRequest]";//Название хранимки
                command.Parameters.AddWithValue("InputMethodId", inputMethodId);//параметры хранимки
                    using (var reader = command.ExecuteReader())
                    {
                                               while (reader.Read()) // если несколько строк вернули
                        {
var ss = reader["Key"]; //Key - это название поля в бд которые вернул запрос select
 
}
}
Если просто sql запрос
C#
1
2
                          command.CommandType = CommandType.Text;
                command.CommandText = "SELECT * FROM [dbo].[GetInputMethodParams] WHERE [Key] = 12 ";
Остальное то же самое что и выше

Добавлено через 5 минут
Если с SQL не знакомы то как вариант.
"Проект>Добавить новый источник данных>База данных>Новый набор данных" подробнее как с этими вещами работать можно почитать в инете. В 1 пост не влезет.
0
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
19.06.2014, 00:31  [ТС]
Цитата Сообщение от Kill100 Посмотреть сообщение
Вы в обще sql запросы знаете?
Да,знаю.5 было по T-SQL
БД MSSQL
Получается в БД надо добавить хранимую процедуру,параметрами которой являются две строки (логин и пароль) и возвращает булиновскую переменную их совпадения?
0
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
19.06.2014, 00:55
Цитата Сообщение от triadec_96 Посмотреть сообщение
Получается в БД надо добавить хранимую процедуру,параметрами которой являются две строки (логин и пароль) и возвращает булиновскую переменную их совпадения?
Как вариант. Вариантов очень много
Возвращать лучше не булиановскую переменную а в Бд создать еще один объект Session
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---Сессия пользователя
CREATE TABLE [dbo].[Session] (
    [SessionId]      UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [CreateDate]     DATETIME         DEFAULT (getutcdate()) NOT NULL,
    [UpdateDate]     DATETIME         DEFAULT (getutcdate()) NOT NULL,
    [SessionStateId] NVARCHAR (16)    DEFAULT ('Created') NOT NULL,
-- SessionState Статус сессии. Возможные значения 
-- Created - Создана, - возможно вобще не нужно
-- Active - Активна, возможно использование для вызова методов, просмотра страниц
-- Closed - Закрыта пользователем
-- Expired - Истек срок жизни
    [UserId]        BIGINT           NULL,
    [ExpireDate]    DATETIME         DEFAULT (dateadd(minute,(60),getutcdate())) NOT NULL,
    PRIMARY KEY CLUSTERED ([SessionId] ASC)
);
GO
И возвращать все поля из него если все ок.
Если не совпадает можно плеваться в хранимке ексепшеном и делать откат транзакции.
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('[dbo].[__Template]') IS NOT NULL
    DROP PROCEDURE [dbo].[__Template]
GO
CREATE PROCEDURE [dbo].[__Template]-- __Template название вашей хранимки
AS
BEGIN
    SET NOCOUNT ON;
 
    DECLARE @ProcID CHAR(36) = NEWID();
 
    DECLARE @TranCount Int = @@TranCount;
 
    IF (@TranCount = 0)
        BEGIN TRANSACTION;
    ELSE
        SAVE TRANSACTION @ProcID;
 
    BEGIN TRY
        -- TODO: Procedure body comes here
        
        
        
        -- Завершаем транзакцию
        IF (@@TranCount > @TranCount)
            COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        IF (@@TranCount > 0)
        BEGIN
            IF (@@TranCount = @TranCount AND XACT_STATE() <> -1)
                ROLLBACK TRANSACTION @ProcID;
            ELSE IF (@@TranCount > @TranCount)
                ROLLBACK TRANSACTION;
        END
        EXEC ReThrowException;
        RETURN;
    END CATCH
END
GO
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
CREATE PROCEDURE [dbo].[ThrowException] 
    @Code NVarChar(50),             -- Код исключения (см. таблицу Exception)
    @Param0 Sql_Variant = NULL,     -- Параметры, используемые
    @Param1 Sql_Variant = NULL,     -- в сообщении об ошибке
    @Param2 Sql_Variant = NULL,
    @Param3 Sql_Variant = NULL
AS
BEGIN
    SET NOCOUNT ON;
 
    -- Ищем код исключения
 
    DECLARE @Message NVarChar(2048);
    DECLARE @State   Int;
 
    SELECT  @Message = [Message],
            @State   = [State]
    FROM    Exception
    WHERE   Code = @Code;
 
    IF @@RowCount <> 1
    BEGIN
        EXEC ThrowException 'EXCEPTION_CODE_NOT_FOUND', @Code;
        RETURN;
    END
    
    -- Возбуждаем исключение
 
    DECLARE @NVCParam0 NVarChar(128); SET @NVCParam0 = RTrim(Cast(@Param0 as NVarChar(128)));
    DECLARE @NVCParam1 NVarChar(128); SET @NVCParam1 = RTrim(Cast(@Param1 as NVarChar(128)));
    DECLARE @NVCParam2 NVarChar(128); SET @NVCParam2 = RTrim(Cast(@Param2 as NVarChar(128)));
    DECLARE @NVCParam3 NVarChar(128); SET @NVCParam3 = RTrim(Cast(@Param3 as NVarChar(128)));
 
    RaisError(@Message, 18, @State, @NVCParam0, @NVCParam1, @NVCParam2, @NVCParam3);
    RETURN;
END
GO
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ALTER PROCEDURE [dbo].[ReThrowException] 
AS
BEGIN
    DECLARE @Number    Int;
    DECLARE @Severity  Int;
    DECLARE @State     Int;
    DECLARE @Message   NVarChar(4000);
    DECLARE @Procedure NVarChar(126);
    DECLARE @Line      Int;
    
    SELECT  @Number    = ERROR_NUMBER(),
            @Severity  = ERROR_SEVERITY(),
            @State     = ERROR_STATE(),
            @Message   = ERROR_MESSAGE(),
            @Procedure = ERROR_PROCEDURE(),
            @Line      = ERROR_LINE();
 
    IF @Number = 50000
    BEGIN
        RaisError(@Message, @Severity, @State);
        RETURN;
    END
    ELSE
    BEGIN
        IF (Len(@Procedure) > 0) SET @Message = @Message + ' in «' + @Procedure + '»';
        IF (@Line > 0) SET @Message = @Message + ', line ' + Cast(@Line AS NVarChar(32));
        RaisError(@Message, @Severity, 127); -- SERVER_ERROR
        RETURN;
    END
END
GO
T-SQL
1
2
3
4
5
6
7
8
--- Таблица содержащаая в себе коды исклчений и их описание
CREATE TABLE [dbo].[Exception](
     [Code]        NVARCHAR(64)   NOT NULL, 
     [Message]     NVARCHAR(2048) NOT NULL,
     [State]       INT            NOT NULL,
     PRIMARY KEY CLUSTERED ([Code] ASC)
);
GO
PS конечно этот код может и не нужен в этом проекте. Но если пилить что то серьёзное то лучше делать так

Добавлено через 8 минут
Ну и соответственно хранимки,
CreateSession -- создаёт если данные верны и возвращает ее , GetSession получает сессию по её id дергается каждый раз при запросе требующиго от пользователя определенных привелегий в ней проверяется стухла сессия или нет, есть ли такая или нет. Если Стухла то плюёмся эксепшеном и ставим тухлый статус если еще не стоит. Если не найдена то опять плюёмся эксепшеном.
Если все ок то отдаём сессию и продляем время работы (если надо сессия по активности юзера)

Добавлено через 2 минуты
Бл походу я что то слишком сложно все сделал
В реале все можно упростить и без эксепшенов делать. Просто если стухла или нету возвращать селектом пустоту. Правда с откатом транзакций засада тогда будет. А откат это оч полезная вещь.
1
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
19.06.2014, 01:13  [ТС]
Цитата Сообщение от Kill100 Посмотреть сообщение
Как вариант. Вариантов очень много
Ну я писал,что создал объект DataSet и думаю,что обращаясь к строкам в этом датасете было б проще,чем создавать новые процедуры и т.д.,ведь T-SQL я почти забыл (давно учили) и хотел делать всё чисто на C#.Мой вопрос заключался в том,как через датасет считывать поля БД (и естественно сравнивать их с полями программы).
Но и на этом спасибо.Сейчас буду разбираться в коде,что вы мне написали.

Добавлено через 9 минут
Цитата Сообщение от Kill100 Посмотреть сообщение
конечно этот код может и не нужен в этом проекте. Но если пилить что то серьёзное то лучше делать так
Честно,этот код не нужен. Проэкт учебный, то исключения там не нужны и,думаю, без транзакций обойдусь.

Добавлено через 1 минуту
Цитата Сообщение от Kill100 Посмотреть сообщение
PS конечно этот код может и не нужен в этом проекте. Но если пилить что то серьёзное то лучше делать так
+я спрашивал как считать через датасет поля,а получил болле сотни кода на SQL ексепшина,который мне вроди-бы не нужен.
0
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
19.06.2014, 01:26
Ну тогда самый простой вариант
"Проект>Добавить новый источник данных>База данных>Новый набор данных"
В наборе данных что тебе надо и на форму (смотри на сущности)
потом если что лишнее удалить можно В итоге с генерируется НазваниеСущностиDataSet , НазваниеДБTableAdapter
В конструкторе источника данных можно создавать у объектов собственные методы всего несколькими кликами
И дергать их в коде что то типа
C#
1
 this.testTableAdapter.FillBySearch(this.testdbDataSet2.test, "%" + textBox1.Text + "%");
Результат запроса будет тут this.testdbDataSet2.test
И делать инсерты то же можно В конструкторе ну там несложно методом тыка можно за час разобраться
Но как это с точки зрения безопасности, надежности и возможностей итд я не знаю
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2014, 01:26
Помогаю со студенческими работами здесь

Динамические поля и обработка данных базы данных (mdb)
У меня вопрос. Создал базу данных mdb Acceess. Там таблицы и запросы. В Delphi создал форму для работы с данными БД, форма содержит...

Как считать список таблиц базы данных ?
... из кода VB.NET Заранее благодарен

Считать информацию с базы данных и вывести ее и ListBox или treeview
Добрый день, помогите пожалуйста считать информацию с базы данных и вывести ее и ListBox или treeview, база которую использую SQLite ...

Можно ли и как считать связи с базы данных между таблицами
Помогите пожалуйста ответить на вопрос, можно ли считать(загрузить) связи между таблицами с базы данных Sql Server

Базы данных и графические поля
Всем добрый день! Подскажите, есть ли альтернатива BLOB - полям с графическими данными, чтоб не снижать производительность. База достаточно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru