Połączenie z bazą sql

0

Szukałem, patrzyłem ale jakoś nie dociera do mnie to co jest w necie...

może ktoś jak dla głupiego napisać mi w jaki sposób stworzyć bazę danych mdf w visual studio w języku c# ?

chce zrobić taką bazę i dodawać do niej rekordy. stworzyć chyba umiem.. bo sie tworzy mojanazwa.mdf
problem pojawia się gdy chce coś dodać do tej bazy w poziomu kodu..

nie mam pojęcia jak poprawnie skonfigurować connectionstringa aby mi wszystko dodawało.

w app.config mam tak:

<appSettings>
    <add key="conn" value="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\bazauserow.mdf;Integrated Security=True;User Instance=True""/>

  </appSettings>


<connectionStrings>
       
        <add name="cupit.Properties.Settings.bazauserowConnectionString1"
            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\bazauserow.mdf;Integrated Security=True;User Instance=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>

w bazie jest tabela o nazwie TABELA i kolumnach id, A, B

i teraz chce coś do tej tabeli dodać.

robie tak:


SqlCommand dodaj = new SqlCommand();
                        dodaj.Connection = new SqlConnection(ConfigurationSettings.AppSettings["conn"]);
                        dodaj.CommandText = "INSERT INTO TABELA (A, B)" +
                            " VALUES ('" + t_1.Text + "', '" + t_2.Text + "', '" )";
                        dodaj.Connection.Open();
                        dodaj.ExecuteNonQuery();
                        dodaj.Connection.Close();

i nic... błędu nie wywala a tabela jak pusta była tak jest... pomoże ktoś ?

0

ConfigurationSettings.AppSettings["conn"] zamien na ConfigurationManager.ConnectionStrings["cupit.Properties.Settings.bazauserowConnectionString1"].ConnectionString

connection stringa wez z server explorera z wlasciwosci bazy ,albo wyklikaj w sqldatasourcie.

zapytanie tez masz trochę dziwnie stworzone zrob SqlParametry i np. @id

0

kurde cos nie tak ..
ConfigurationManager
mi pokreśla z blędem i info, ze nie istnieje coś...

connection stringa wez z server explorera z wlasciwosci bazy ,albo wyklikaj w sqldatasourcie.

no znalazłem coś takiego:
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\uzytkownicy.mdf;Integrated Security=True;User Instance=True
tylko co z tym zrobić ? bo nie bardzo rozumiem...

zapytanie tez masz trochę dziwnie stworzone zrob SqlParametry i np. @id

to już chyba dla mnie za trudne ;]

0

Widać ,że zaczynasz z .NET :) Prawdopodobnie nie dodałeś usinga.

Dodaj using System.Configuration; pod innymi usingami i powinno nie wywalać błędu, a na przyszłość wciskaj alt+F10 będzie szybciej. Chyba ,ze to nie o to chodzi bo przy ConfigurationSection Ci błędu nie wywaliło.

<appSettings>
    <add key="conn" value="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\bazauserow.mdf;Integrated Security=True;User Instance=True""/>

  </appSettings>
  • wywal ten klucz. Connection stringa nie powinno się, a może nawet nie można przechowywać w zmiennych aplikcji. Jest do tego specjalna sekcja Connection Strings i masz tam poprawnie zapisanego connection stringa tylko nazwa niepotrzebnie taka dluga daj se jakies "Db1"

Ja bym twój kod zapisał mniej więcej tak (po zmianie nazwy connection stringa):

 string query = "INSERT INTO TABELA (A, B) VALUES (@a, @b)"
        SqlCommand dodaj = new SqlCommand(query);
        dodaj.Parameters.Add(new SqlParameter("a",t_1.Text ));
        dodaj.Parameters.Add(new SqlPatameter("b",t_2.Text));
        dodaj.CommandType = CommandType.Text;
        using (SqlConnection scon =new SqlConnection(ConfigurationManager.ConnectionStrings["Db1"].ConnectionString))
        {
            dodaj.Connection = scon;
            scon.Open();
            
            dodaj.ExecuteNonQuery();
       }
   

Chociaż pewnie da się to jeszcze lepiej bądź prościej zapisać :)

0

Nom i przeszukaj dokladnie internet,msdna, jakies tutoriale czy książki ,bo nie trzeba być jasnowidzem ,żeby zauważyć ,że jeszcze tego dokladnie nie zrobiłeś ;-)

0

no włąsnie problem mam taki, że mi wywala błąd z usingiem przy ConfigurationManager. Może jakiś inny using jest ?

0

poszukałem troche.

zrobiłem tak:

dodałem:

 public static class ConfigurationManager
        {
        }

i teraz mi się podświetlił ConnectionStrings

Error	3	'cupit.Form1.ConfigurationManager' does not contain a definition for 'ConnectionStrings'	C:\Users\Maciej\Desktop\cupit\cupit\Form1.cs	42	75	cupit

jak to wywale to mam:

Error	3	The name 'ConfigurationManager' does not exist in the current context	C:\Users\Maciej\Desktop\cupit\cupit\Form1.cs	40	54	cupit

;///

0

Wklej cały kod a nie kombinuj z tworzeniem klas o nazwach takich jak wbudowane klasy, których chcesz użyć. :|

0

no przeciez wkleilem... problem taki, ze wyskakuje mi blad...

0

Jeśli tych parę linijek to jest cały Twój plik z kodem, to nic dziwnego, że się nie kompiluje. ;]

0

zle zrozumialem Ciebie, sorki.

using System;
using System.Data.SqlClient;
using System.Configuration;
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.IO;






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


        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'uzytkownicyDataSet.uzytkownicy' table. You can move, or remove it, as needed.
            this.uzytkownicyTableAdapter.Fill(this.uzytkownicyDataSet.uzytkownicy);



        }

        private void b_id_Click(object sender, EventArgs e)
        {
            string query = "INSERT INTO uzytkownicy (id_id) VALUES (@a)";
        SqlCommand dodaj = new SqlCommand(query);
        dodaj.Parameters.Add(new SqlParameter("a",t_id.Text ));
        dodaj.CommandType = CommandType.Text;
        using (SqlConnection scon =new SqlConnection(ConfigurationManager.ConnectionStrings["bazauserow"].ConnectionString))
        {
            dodaj.Connection = scon;
            scon.Open();
            
            dodaj.ExecuteNonQuery();
       }


        }
    }
}

błąd, który się pojawia:

Error	1	The name 'ConfigurationManager' does not exist in the current context	C:\Users\Maciej\Desktop\cupit\cupit\Form1.cs	44	54	cupit

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>

  
  
    <connectionStrings>
        <add name="cupit.Properties.Settings.uzytkownicyConnectionString"
            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\uzytkownicy.mdf;Integrated Security=True;User Instance=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>

 
  
  
</configuration>

i tyle... wiecej nie mam, bo póki co nie mogę się z bazą połączyć ;p

0

Lol, a o czym ja pisałem ? W kodzie koszystasz z configa bazauserow mimo ,że w webconfigu masz cupit.Properties.Settings.uzytkownicyConnectionString. Zmień tam nazwę na "bazauserow" i powiedz czy Ci działa :)

Trzeci raz nie będe się powtarzał :)

0

Druga sprawa ,to co to właściwie za webcofnig ? czy tak wyglada twoje webconfig czy wkleiłes nam fragment ? Chyba nie napisałeś go sobie w notatki i dołączyłeś do projektu :)

0
jaceeeek22 napisał(a)

i tyle... wiecej nie mam, bo póki co nie mogę się z bazą połączyć ;p

Nie masz dodanej referencji do System.Configuration. (PPM na nazwie projektu w Solution Explorer -> Add Reference -> wybierz co trzeba)

0

kurde chyba umre z tym c# :)

ok dodałem już referencje, juz wiem o co chodzi :)

błędów żadnych nie mam już ale podczas dodawania do bazy wartosci z texboxa wyskakuje mi blad w linijce:
using (SqlConnection scon =new SqlConnection(ConfigurationManager.ConnectionStrings["cupit"].ConnectionString))

zmieniłem już tam nazwy aby do siebie pasowały.

wkleje raz jeszcze cały kod:

Form1

using System;
using System.Data.SqlClient;
using System.Configuration;
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.IO;






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


        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'uzytkownicyDataSet.uzytkownicy' table. You can move, or remove it, as needed.
            this.uzytkownicyTableAdapter.Fill(this.uzytkownicyDataSet.uzytkownicy);



        }

        private void b_id_Click(object sender, EventArgs e)
        {
            string query = "INSERT INTO uzytkownicy (id_id) VALUES (@a)";
        SqlCommand dodaj = new SqlCommand(query);
        dodaj.Parameters.Add(new SqlParameter("a",t_id.Text ));
        dodaj.CommandType = CommandType.Text;
        using (SqlConnection scon =new SqlConnection(ConfigurationManager.ConnectionStrings["cupit"].ConnectionString))
        {
            dodaj.Connection = scon;
            scon.Open();
            
            dodaj.ExecuteNonQuery();
       }


        }
    }
}

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
  
  
  
    <connectionStrings>
        <add name="cupit.Properties.Settings.uzytkownicyConnectionString"
            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\uzytkownicy.mdf;Integrated Security=True;User Instance=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>

 
  
  
</configuration>

mój app.config tak wygląda, bo póki co to jest prawie pusty program... chyba, że o coś innego Ci chodziło.. ?

błąd, który się pojawia przy próbie dodawania np: 1 do bazy, w momencie wciśnięcia buttona to:

System.NullReferenceException was unhandled
  Message="Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu."
  Source="cupit"
  StackTrace:
       w cupit.Form1.b_id_Click(Object sender, EventArgs e) w C:\Users\Maciej\Desktop\cupit\cupit\Form1.cs:wiersz 44
       w System.Windows.Forms.Control.OnClick(EventArgs e)
       w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       w System.Windows.Forms.Control.WndProc(Message& m)
       w System.Windows.Forms.ButtonBase.WndProc(Message& m)
       w System.Windows.Forms.Button.WndProc(Message& m)
       w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       w System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       w System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       w System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       w System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       w System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       w cupit.Program.Main() w C:\Users\Maciej\Desktop\cupit\cupit\Program.cs:wiersz 18
       w System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       w Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       w System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
0

Omg chyba ja też umre :D Miałem trzeci raz nie powtarzać ,więc tego nie zrobie :) Dalej nie zrobiłeś tego co miałeś i jeszcze się upierasz ,że zrobiłeś :)

0

aaaaaaaaaa widzisz :D ok już to zrobiłem. Błędów żadnych nie mam. Niby wszystko gra a baza pusta ;/ wchodze do "show table data" i nic nie dodaje;/

w server explorer baza nazywa sie uzytkownicy.mdf

Tables:

uzytkownicy
id int - klucz główny
id_id nvarchar(50)

baza jest normalnie widoczna.

tylko dlaczgo nic mi nie dodaje ? ;///

jeszcze raz kod:P :

using System;
using System.Data.SqlClient;
using System.Configuration;
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.IO;






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


        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'uzytkownicyDataSet.uzytkownicy' table. You can move, or remove it, as needed.
            this.uzytkownicyTableAdapter.Fill(this.uzytkownicyDataSet.uzytkownicy);



        }

        private void b_id_Click(object sender, EventArgs e)
        {
            string query = "INSERT INTO uzytkownicy (id_id) VALUES (@a)";
        SqlCommand dodaj = new SqlCommand(query);
        dodaj.Parameters.Add(new SqlParameter("a",t_id.Text ));
        dodaj.CommandType = CommandType.Text;
        using (SqlConnection scon = new SqlConnection(ConfigurationManager.ConnectionStrings["cupit.Properties.Settings.uzytkownicyConnectionString"].ConnectionString))
        {
            dodaj.Connection = scon;
            scon.Open();
            
            dodaj.ExecuteNonQuery();
       }


        }
    }
}

w formie1 mam tylko button i texbox...

0

Hmm. Mozliwe ,ze cos gdzieś masz jeszcze pokręcone. Może to dziwnie zabrzmieć ,ale zamknij kartę z server explorera gdzie masz wyswietlone dane i daj jeszcze raz "show table data". Możesz też zrobić gdzieś Select w podobny sposob jak insert (albo jak masz takie problemy to datagrid + binding source i tam wyklikać w kreatorze co chcesz mieć). Chodzi o to ,że Server explorer czesto nie odswieza danych i one moga byc w bazie, ale możesz ich przez server explorera nie widzieć.

Sprawdź też czy masz ustawioną autoinkrementacje dla id (w właściwosciach kolumny). Wydaje mi się ,że jak nie masz to powinno wywalić błąd ,ale na wszelki wypadek sprawdź czy jest (IsIdentity na true).

0

ee resetowałem system i nic.. baza pusta ;/ popatrze sobie jeszcze, może faktycznie coś pokręciłem.

0

kurde nie mam juz do tego sily... takie gowienko a mi blokuje caly program... nalepsze jest to, ze łącze sie z baza online bez problemu, tylko troche innym kodem. A za cholere nie moge lokalnej zrobic ... a moze da sie to obejsc ? potrzebuję zapisać w programie konkretna cyfre, która później będzie dodawana do bazy on-line. Chodzi o to aby mi sie ID klientów nie popieprzyly, bo baza online bedzie jedna. Przy konfiguracji programu nadaje konkretny ID konkretnej aplikacji, przez powiedzmy specjalny form dla administratora. Później np. klient chce coś dodać do tej bazy juz sam i te ID zostaje wczytane i zapisane.

wymyslilem sobie to w taki sposob, ze klient dodaje np urzadzenie:

INSERT INTO cupit_urzadzenia (id_id, nazwaurzadzenia, numerseryjny, uwagi, status)" +
                            " VALUES ('" + t_idfirmy.Text + "', '" + t_nazwaurzadzenia.Text + "', '" +
                            t_numerseryjny.Text + "','" + t_uwagi.Text + "','" + cb_status.Text + "')"

wartośc z texboxa np. t_idfirmy jest wczytywana automatycznie przy ładowaniu. A ta wartość jest właśnie zapisana na bazie lokalnej, podczas konfiguracji sam ją ustaliłem dla danej firmy.

tak to ma z grubsza wyglądać;p a może ktoś ma lepszy pomysł ? tylko prosiłbym o jakiś kawałek kodu, bo spędzę 3 dni kolejne na poszukiwaniach ;/;/

0

jeszcze aby było śmiesznie to przez głupie datagrid też mi nie zapisuje ;/ dodaje rekord, niby dodało bez błędu, nawet odpalam raz jeszcze aplikacje, widoczne są te rekordy dodane i niby wszystko ok. Robie show data - nie widac ich.. ok może sie nie odświeżyło.. reset visual studio, opalam program, rekordów nie widać.. w ogóle sie nie zapisały, save naciskałem.... zapisuje się tylko to co dodam poprzez server explorer w show data.

ech porażka z tym ;p ale może ktoś mi pomoże na wcześniejszy post ;]

0

Nie masz czasem tak, że baza lokalna nadpisuje się przy każdej kompilacji?

0

a jak to sprawdzić ?

zmieniłem na inna bazę - na sdf

i teraz mam problem bo wyskakuje błąd:

System.DllNotFoundException was unhandled
  Message="Nie można załadować biblioteki DLL 'sqlceme35.dll': Nie można odnaleźć określonego modułu. (Wyjątek od HRESULT: 0x8007007E)"
  Source="System.Data.SqlServerCe"
  TypeName=""
  StackTrace:
       w System.Data.SqlServerCe.NativeMethods.SafeRelease(IntPtr& ppUnknown)
       w System.Data.SqlServerCe.SqlCeCommand.ReleaseNativeInterfaces()
       w System.Data.SqlServerCe.SqlCeCommand.Finalize()
  InnerException: 

może mam coś popierniczone przy instalacji ? czegoś nie doinstalowałem ?

0

Rób na mdf-ach:P Pewnie rzeczywiście ci nie dodaje ,ale jak zrobsz w jednym zdarzeniu inserta a potem poprawnego selecta to bedziesz miał 100% pewności. Powinno Ci jakieś błędy wywalać ,że nie wykryto bazy czy coś tam :] jesli masz gridview(datagrid) to pamietaj zeby np. po dodaniu dać "gridview1.DataBind();" .

0

wiecie co... to sie w dziurze nie mieści ;p

wywaliłem windowsa 7, wgrałem poczciwego xp, wywalilem visual studio 2008, wgrałem 2010 z server sql. Wzystko na czysto. Robie nowy projekt. Tworze baze mdf. Tworza dataset. Wklejam to na forme. Pokazuje mi sie moja tabela. odpalam teoretycznie dodaje wszystko. klikam na standardowy przycisk save.Zamykam aplikacje otwieram na nowo, tabela pusta ;] mam dosyc ;] gdyby byla mozliwość programowania w c# na mac os to juz dawno bym sie tam przesiadł ;p microsoft mnie nie lubi bo maca uzywam :D

0

Obstawiam to co napisal @somekind. Przy kazdej kompilacji kopiuje Ci sie czysta baza do katalogu bin\Debug lub bin\Release i masz wrazenie, ze jest pusta. Sprawdz sobie ile masz plików bazodanowych w katalogu projektu.

0

problem w tym, że mam jedną ... ;] coś wykombinuje innego.

Wgrałem czystego visuala i czysty sql server ale jak chce dodać nową baze danych to mam tylko trzy opcje: access database file / sql compact / sql database file jak zrobić aby się połączyć z bazą online?

może coś gdzieś trzeba przestawić, bo z visualem zainstalowałem tą standardową wersje sql server a później doinstalowałem oddzielnie pełną ze wszystkim... coś mi sie zdaje, że visual korzysta z tej standardowej i dlatego tam nic nie widze;/

0

Kurde.. niby znalzałem w opcjach aby wpisać nazwę serwera sql, tylko dalej nie mam wyboru połączenia się z bazą online.. może jakies referencje trzeba dodać czy cos ?

0

ok już wiem w czym problem.. w wersji express tego nie ma ;/

0

jeszcze raz Wam coś wkleję.

select mi działa bez problemu:

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

namespace projektcupit
{
    public partial class test : Form
    {
        public test()
        {
            InitializeComponent();
        }

        private void test_Load(object sender, EventArgs e)
        {
             //WCZYTYWANIE DANYCH Z TABELI W FORMIE TEKSTU
            bool flaga = true;

            SqlCommand kom = new SqlCommand();
            kom.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString);
            kom.CommandText = "SELECT * FROM baza";
            
            kom.Connection.Open();
            SqlDataReader sdr = kom.ExecuteReader();
            while (flaga)
                try
                {
                    sdr.Read();
                  
                    label1.Text += sdr.GetInt32(0).ToString() + "\n\n";
                    label2.Text += sdr.GetInt32(1).ToString() + "\n\n";
                   
                    
                }
                catch
                {
                    kom.Connection.Close();
                    flaga = false;


                }
            kom.Connection.Close();
            }

        }
    }

pokazuje mi dane, które sam sobie wrzuciłem do tabeli poprzez show data.

teraz chce dodać coś do kolumny uzytkownik:

zrobiłem tak:

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

namespace projektcupit
{
    public partial class test : Form
    {
        public test()
        {
            InitializeComponent();
        }

        private void test_Load(object sender, EventArgs e)
        {
             //WCZYTYWANIE DANYCH Z TABELI W FORMIE TEKSTU
            bool flaga = true;

            SqlCommand kom = new SqlCommand();
            kom.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString);
            kom.CommandText = "SELECT * FROM baza";
            
            kom.Connection.Open();
            SqlDataReader sdr = kom.ExecuteReader();
            while (flaga)
                try
                {
                    sdr.Read();
                  
                    label1.Text += sdr.GetInt32(0).ToString() + "\n\n";
                    label2.Text += sdr.GetInt32(1).ToString() + "\n\n";
                   
                    
                }
                catch
                {
                    kom.Connection.Close();
                    flaga = false;


                }
            kom.Connection.Close();
            }

        }
    }

błędu nie ma żadnego, także łączy się z bazą na pewno. No ale oczywiście nic się do bazy nie zapisuje.. ładuje raz jeszcze SELECT i wyświetla się to co było dodane ręcznie poprzez SHOW DATA TABEL.

kręce się w koło ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1