Заполните базу данных SQL результирующими изменениями Windows Forms DataGridView - PullRequest
1 голос
/ 14 сентября 2011

Здравствуйте, я прочитал несколько статей, но не получил ответ на свой вопрос. Я хочу сделать двойной процесс. 1. Заполните представление данных из запроса, а не таблицы напрямую, кнопкой, которая выполняет запрос для заполнения. 2. Измените значения в сетке данных, чтобы передать BACK базе данных, чтобы внести изменения. Проблема, с которой я сталкиваюсь, это пример, который я нахожу, предполагая, что у вас есть СТАТИЧЕСКАЯ вселенная, а НЕ та, которая может измениться. Я уже знал часть населения, но мне любопытно, как вы используете сетку данных для установления соединения с базой данных и говорите: «Делайте то, что я показываю в данный момент в качестве изменений, и сохраняйте их в той базе данных, из которой они изначально были».

Код, который я следовал немного: http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-database Они использовали метод Access, а я использую SQL, но это не должно иметь большого значения.

EG: я могу установить элемент dataAdapter в одном экземпляре процесса, но другой экземпляр НЕ знает об этом. Я предполагаю, что что-то может быть сделано, поскольку вы можете сделать это довольно легко с помощью перетаскивания с наборами данных Возможно, я тоже ошибаюсь, и некоторые элементы должны быть статическими, а некоторые динамическими. Все, что я действительно хочу, это доказать, что я могу изменить значения в VALUE на что-то другое и передать это обратно в базу данных с источником привязки. Однако источник привязки неизвестен в другом случае, и статическая настройка некоторых вещей провалилась так, как я их определил. Любая помощь очень ценится, спасибо!

НАСТРОЙКА:

  1. Создание тестовой базы данных с одной таблицей, определенной как:

    Создать таблицу Test (ID int Identity, VALUE varchar (2)) вставить в тестовые значения («A»), («B»), («C»)

  2. Создание приложения Windows Form в Visual Studio 2010 (должно работать в 2008 или более ранней версии, поскольку я не верю, что я что-то делаю явно .NET 4.0). Форма Windows должна иметь две кнопки: «btnPopulate» б. 'BtnUpdate'; текстовое поле: 'txtquery', заполненное текстом: 'select * from Test'; и сетка данных: «сетка».

Фактический код, используемый за формой:

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

namespace DataGridTestDBUpdater
{
    public partial class TestDataGrid : Form
    {
        public string con = "Integrated Security=SSPI;Persist Security Info=False;Data Source =(local);Initial Catalog=Test";

        public TestDataGrid()
        {
            InitializeComponent();
        }

        private void btnPopulate_Click(object sender, EventArgs e)
        {
            string query = txtquery.Text;

            using (SqlConnection cn = new SqlConnection(con))
            {
                using (SqlCommand cmd = new SqlCommand(query, cn))
                {
                    using (SqlDataAdapter adapter = new SqlDataAdapter())
                    {
                        using (DataTable table = new DataTable())
                        {
                            cn.Open();

                            using (BindingSource bs = new BindingSource())
                            {
                                adapter.SelectCommand = cmd;

                                adapter.Fill(table);

                                bs.DataSource = table;

                                gridview.DataSource = bs.DataSource;
                            }

                            cn.Close();
                        }
                    }
                }
            }
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            using (BindingSource bs = new BindingSource())
            {
                bs.DataSource = gridview.DataSource;

                using (DataTable table = new DataTable())
                {
                    using(SqlDataAdapter adpt = new SqlDataAdapter())
                    {
                        bs.DataSource = gridview.DataSource;

                        /// ALL OF MY WORK IS FAILING FROM HERE ON ///
                        /// WANT TO GET UPDATE TO WORK HERE: ///
                        /// 

                        ///adpt.Update(bs.DataSource);

                    }
                }
            }

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Я понял, вам просто нужно установить частные экземпляры SqldataAdapter и BindingSource.Тогда один экземпляр узнает о другом.Кроме того, я НЕ должен был использовать (использовать) ссылку.В большинстве случаев это разумный выбор, поскольку он реализует метод dispose, но в этом случае мне нужен другой метод, чтобы увидеть экземпляр, который я объявил в заполнении.Ответ я сделал (это не будет работать с несколькими таблицами или таблицами, где вы не определяете первичный ключ).

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

namespace TestEntryForm
{
    public partial class Form1 : Form
    {
        private BindingSource bs = new BindingSource();
        private SqlDataAdapter da = new SqlDataAdapter();
        private string cnc = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Test;Data Source=localhost";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            datadridview.DataSource = bs;
        }

        private void SelectCommand(string selectcmd)
        {
            da = new SqlDataAdapter(selectcmd, cnc);

            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(da);

            DataTable table = new DataTable();

            table.Locale = System.Globalization.CultureInfo.InvariantCulture;
            da.Fill(table);
            bs.DataSource = table;

            datadridview.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);

        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            SelectCommand(txtQuery.Text);
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            da.Update((DataTable)bs.DataSource);
        }
    }
}
0 голосов
/ 15 сентября 2011

Возможно, я неправильно понял ваш вопрос.Не стесняйтесь исправлять, если это так.Из того, что я понял, вы хотите очень постоянное соединение вашего приложения с вашей базой данных.То есть, если что-то изменяется в одном экземпляре вашего приложения, другой экземпляр должен автоматически знать об этом изменении и обновлять представление соответствующих данных.

Если мое понимание вашего вопроса верно, к сожалению, естьнет прямого решения этого вопроса.То, что вы показываете в своей сетке в одном экземпляре вашего приложения, является представлением IN MEMORY (в вашем случае объекта DataTable) базовых данных, которые были заполнены значениями базы данных во время вызова метода btnPopulate_Click.Любые изменения в базе данных после этого НЕ будут прозрачны для вашего экземпляра, пока базовая таблица данных не будет обновлена ​​снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...