[C# i SQL ] Kopiowanie kolumn między Tabelami

Witam Wszystkich, mam problem z kopiowaniem kolumn między tabelami. Chodzi o to, że mam dwie tabele Pracownicy i Wypłaty. Tabela Wypłaty składa się z IDPRAC, Pensji, premii i zarobków. Zależy mi na tym by pobrać dane ID i Pensja w tabeli Pracownicy i “wsadzić” to to tabeli Wypłaty do kolumn IDPRAC i PENSJA. Napisałem coś takiego w SQL Server:

INSERT INTO Wyplaty

                         (ID_PRAC, Pensja)

SELECT ID, Pensja

FROM szczegoly_o_Prac

I jeżeli to wywoluje to tworzy mi moją tabele z ściągnietymi wartościami ID i Pensją do Wypłaty. Ale to działa tylko pod SQL i za każdym razem muszę robić nowy Executing SQL. A mi zależy na tym by przy kliknięciu buttona Wypłaty na mojej formie i otwarciu Formy “Wypłaty” na DGV który się na niej znajduje automatycznie zostały pokazane wartości z Pracownicy. Czyli jak to zrobić pod C# (w kodzie) by pobierało dane z jednej tabeli do drugiej?

Dziękuje za pomoc

Pozdrawiam

Tomek

Nie do końca rozumiem co chcesz osiągnąć i z czym jest taki problem

  1. Czy wypełnić w kodzie DataGridView z użyciem odpowiedniego zapytania: SELECT ID, Pensja FROM szczegoly_o_Prac

  2. Czy wywołać w kodzie instrukcję INSERT, którą wkleiłeś wyżej i która na podstawie danych z jednej tabeli ma wypełnić drugą

Jeśli Ci coś nie działa w kodzie to wklej tutaj właściwy fragment i się poprawi.

Cześć, chodzi mi tylko o to, że chcę z dwóch kolumn jednej tabeli wstawić dane do dwóch kolumn drugiej tabeli używając C#. Nie mam pojęcia jak to zrobić. Mi to bez różnicy czy będzie to 1 sposobem czy 2, byle mi to jakoś zadziałało. Jedno co mi się udało wymyśleć to ten fragment kodu SQL co tutaj wkleiłem. Jeżeli nie jasno się wyrażam to proszę pisz, a ja od razu wytłumaczę.

Pozdrawiam

Tomek

Poniższa metoda wykona ten Twój kod sql:

private int GetPayment(string connectionString)

        {

            string sql = " INSERT INTO Wyplaty (ID_PRAC, Pensja) "

             + " SELECT ID, Pensja "

             + " FROM szczegoly_o_Prac ";


            SqlConnection conn = null;

            SqlCommand cmd = null;


            try

            {

                conn = new SqlConnection(connectionString);

                cmd = new SqlCommand(sql, conn);


                conn.Open();

                return cmd.ExecuteNonQuery();

            }

            catch (Exception ex)

            {

                throw ex;

            }

            finally

            {

                if (conn != null && conn.State != ConnectionState.Closed)

                    conn.Close();

            }

        }

Jako parametr przekazujesz łańcuch połączenia ze swoją bazą danych. Generalnie taki powinien Ci zadziałać (wykorzystane zostanie uwierzytelnienie z użyciem Twojego konta Windows):

"Data Source=(local);Initial Catalog=TU_WSTAW_NAZWE_BAZY_DANYCH;Integrated Security=True"

I jeszcze jedno na początku pliku będziesz musiał dodać następujące przestrzenie nazw:

using System.Data;

using System.Data.SqlClient;

Generalnie sama metoda została napisana przy użyciu czystego ADO .NET

Wstawiłem tę funkcję co napisałeś mi i wszystko kompiluje się bezbłędnie. Problemem dla mnie jest gdzie wstawić ten fragment:

"Data Source=(local);Initial Catalog=TU_WSTAW_NAZWE_BAZY_DANYCH;Integrated Security=True"

Przepraszam za zawracanie Ci głowy.

Pozdrawiam

Tomek

no żeby wywołać tą metodę musisz podać jako parametr łańcuch połączenia ze swoją bazą danych, czyli wywołanie tej metody to będzie:

int rowsAffected = GetPayment("Data Source=(local);Initial Catalog=TU_WSTAW_NAZWE_BAZY_DANYCH;Integrated Security=True");

Metoda zwraca informację o tym ile rekordów zostało skopiowanych między tabelami.

Mogę Tobie wleić tutaj to co mam dla formy Wypłaty, zobaczysz co robię nie tak?

jasne, na ile będę mógł na tyle pomogę. Powiedz mi jeszcze jaką masz wersję tego SQL Servera. W sensie, czy jest to wersja Express, czy też jakaś inna?

Wersja 2008 express. A poniżej mój kod

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 Biuro

{

    public partial class Wyplaty : Form

    {

        public Wyplaty()

        {

            InitializeComponent();

        }


        private void Wyplaty_Load(object sender, EventArgs e)

        {


            // TODO: This line of code loads data into the 'szczeg_o_pracDataSet3.Wyplaty' table. You can move, or remove it, as needed.

            this.wyplatyTableAdapter.Fill(this.szczeg_o_pracDataSet3.Wyplaty);

            int rowsAffected = GetPayment("Data Source=TOMEK-PC\SQLEXPRESS;Initial Catalog=szczeg_o_prac;Integrated Security=True;Pooling=False");  

        }


        private int GetPayment(string connectionString)

        {


            string sql = " INSERT INTO Wyplaty (ID_PRAC, Pensja) "

             + " SELECT ID, Pensja "

             + " FROM szczegoly_o_Prac ";


            SqlConnection conn = null;

            SqlCommand cmd = null;


            try

            {

                conn = new SqlConnection(connectionString);

                cmd = new SqlCommand(sql, conn);


                conn.Open();

                return cmd.ExecuteNonQuery();

            }

            catch (Exception ex)

            {

                throw ex;

            }

            finally

            {

                if (conn != null && conn.State != ConnectionState.Closed)

                    conn.Close();

            }

        }

        private void btnDopisz_Click(object sender, EventArgs e)

        {

            /*DialogResult result = MessageBox.Show("Czy na pewno chcesz zminić istniejące dane?", "Zmiana danych o pracowniku", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);

            if (result != DialogResult.No) dataGridView1.Rows.RemoveAt(dataGridView1.CurrentCell.RowIndex);*/

           // this.wyplatyTableAdapter.Update(this.szczeg_o_pracDataSet3.Wyplaty);

            //this.wyplatyTableAdapter.Fill(this.szczeg_o_pracDataSet3.Wyplaty);


            int id = int.Parse(txtID_Prac.Text);

            int pensja= int.Parse(txtPensja.Text);

            int premia = int.Parse(txtPremia.Text);

            int zarobki= premia + pensja;


            wyplatyTableAdapter.Insert(id, pensja, premia, zarobki);

            this.wyplatyTableAdapter.Fill(this.szczeg_o_pracDataSet3.Wyplaty);



        }


        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

        {

            txtID_Prac.Text = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();

            txtPensja.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();


        }




        private void txtPremia_Click_1(object sender, EventArgs e)

        {

            txtPremia.Text = "";

        }

    }

}

Na tę metodę odnosnie przyciku nie patrz, bo ją muszę jeszcze zmodyfikować.

W zdarzeniu Load formy podmień kolejność wykonywanych działań:

private void Wyplaty_Load(object sender, EventArgs e)

        {


            // TODO: This line of code loads data into the 'szczeg_o_pracDataSet3.Wyplaty' table. You can move, or remove it, as needed.

int rowsAffected = GetPayment("Data Source=TOMEK-PC\SQLEXPRESS;Initial Catalog=szczeg_o_prac;Integrated Security=True;Pooling=False"); 

            this.wyplatyTableAdapter.Fill(this.szczeg_o_pracDataSet3.Wyplaty);

        }

i napisz, czy pomogło

Podkreśla mi S przy express i przy kompilacji wyskakuje taki błąd Unrecognized escape sequence. Nie mam pojęcia dlaczego.

racja przeoczyłem … podmień ten aktualny łańcuch połączenia na taki:

"Data Source=TOMEK-PC\\SQLEXPRESS;Initial Catalog=szczeg_o_prac;Integrated Security=True;Pooling=False"

Działa! !!

nie no bez przesady … a co do tego drugiego “”. Niektóre znaki w C# uznawane są za znaki specjalne i jeśli są umieszczane w stringu to należy je poprzedzić właśnie “”, bo inaczej wystąpi wspomniany przez Ciebie wyżej błąd w trakcie kompilacji. Jest jeszcze jeden sposób jak sobie z tym poradzić, tj. przy użyciu operatora “@”, ale to już najwyżej sam sobie doczytasz.

co do tego dublowania … no bo masz tą metodę GetPayment wywoływaną przy każdym ładowaniu formy Wyplaty, Musisz ją umieścić w takim miejscu, żeby wywoływana była tylko raz. Ja nie wiem, gdzie najlepiej powinieneś to wrzucić, bo nie znam Twojego programu.

Pozdrawiam

Dzięki za tę informację, ale serio jak dla mnie jesteś Mistrzem :), dziękuje Ci raz jeszcze.

Aha mam pytanie, czy mógłbym prosić Cię o Twój email w razie czego jakbym miał kiedyś jeszcze jakieś pytania?

Najlepiej pisz na forum, bo jeśli nie ja pomogę to ktoś inny. Ewentualnie prywatna wiadomość też poprzez forum.

Swoją drogą, żeby poradzić sobie z tym dublowaniem w najłatwiejszy sposób, mógłbyś zrobić coś takiego:

  1. w bazie danych umieść procedurę, która najpierw będzie czyścić całą tabelę Wyplaty i potem od razu wypełniać ją rekordami z tabeli szczegoly_o_Prac

  2. w kodzie napisz metodę, która wywoła tą procedurę

  3. wywołaj tą metodę najlepiej przy starcie aplikacji

Procedura mogłaby wyglądać następująco (musisz wywołać poniższy kod na bazie danych):

USE [TU_WSTAW_NAZWE_BAZY_DANYCH]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE PROCEDURE GetPayment

AS

BEGIN

    SET NOCOUNT ON;

	DELETE FROM Wyplaty


	SET NOCOUNT OFF;

	INSERT INTO Wyplaty (ID_PRAC, Pensja)

	SELECT ID, Pensja

	FROM szczegoly_o_Prac

END

GO

Wówczas nowa metoda w C# wywołująca tą procedurę wyglądałaby tak:

private int GetPayment(string connectionString)

        {

            SqlConnection conn = null;

            SqlCommand cmd = null;


            try

            {

                conn = new SqlConnection(connectionString);

                cmd = new SqlCommand("GetPayment", conn);

                cmd.CommandType = CommandType.StoredProcedure;


                conn.Open();

                return cmd.ExecuteNonQuery();

            }

            catch (Exception ex)

            {

                throw ex;

            }

            finally

            {

                if (conn != null && conn.State != ConnectionState.Closed)

                    conn.Close();

            }

        }

Ok wielkie dzięki, na pewno przyjże się temu ze szczególną uwagą :). Sorry, że nie odpisałem wcześniej, ale nie zauważyłem, że zrobiła się już następna strona.

Jeszcze raz wielkie dzięki

Pozdrawiam

Tomek

Bym zapomniał, ten kod w SQL to napisać w SQL Server czy jest możliwość w Visualu to wklepać?

Najlepiej wklep to w SQL Server Management Studio 2008 (jeśli tego nie masz to sobie ściągnij i zainstaluj, wersję Express można pobrać za free ze strony Microsoftu). W tym programiku klikasz prawym przyciskiem myszy na nazwę tej bazy danych, gdzie masz te tabele i wybierasz New Query. Otworzy się nowe okienko, w którym wklepujesz cały ten kod SQL, co wkleiłem wyżej i potem klikasz na przycisk Execute (taki z czerwonym wykrzyknikiem). Jeśli pojawi się komunikat “Command(s) completed successfully.” tzn, że kod zadziałał. Poza tym to nie ma za co :slight_smile:

Pozdrawiam

Tomek11000 , nazwij proszę temat konkretnie, bez zbędnych problemów w nazwie. Inaczej wyciągnę konsekwencje. Przeczytaj ten temat.

viewtopic.php?f=16&t=394978

Nie wiem jak to zmienić (czyt. Nazwę tematu). Próbowałem i nie dałem rady.

Dodane 12.07.2010 (Pn) 23:03

Cześć Matzu, zaglądasz jeszcze do tego wątku? Potrzebuje Twojej pomocy. Mam problem z usunięciem zaznaczonego wiersza w tabeli wypłaty, a robię tak samo jak w innych częściach swojego programu. Zaczyna mnie to już irytować. Jeżeli ktoś jest skłonny mi pomóc, to proszę pisać, a cały problem tutaj objaśnię.

Dzięki wielkie

pozdrawiam

Tomek