[ AMD guy @ 11.03.2009. 19:50 ] @
Kako da izabrani datum iz DateTimePicker kontrole(Windows forms) prebacim bazu (MS SQL 2005). Koristim c#
Ovo koristim kod upisa podataka sa Forme u bazu, vec imam za Username i password, treba mi jos i datum.
[ Sapphire @ 11.03.2009. 22:12 ] @
Ako vec imas za Username i Password, onda pretpostavljam da se znas konektovati na bazu, kao i razmjeniti podatke sa njom (mislim, bar na jedan od nacina).

Sto se tice problema, DateTimePicker ima Value property koji sadrzi trenutno postavljeni datum kontrole, u obliku DateTime klase.
Dovoljno je da datum iz te klase posaljes u bazu pomocu upita ovakvog oblika:

Code:


DateTime datum = tvojDateTimePicker.Value;
string sqlUpit = @"INSERT INTO NekaTablaSaDatumom (Datum) VALUES ( convert(datetime, '" + datum.ToString() + "', 103) )";



Naravno, upit je mogao i ovako da izgleda:


Code:


string sqlUpit = @"INSERT INTO NekaTablaSaDatumom (Datum) VALUES ( convert(datetime, '" + tvojDateTimePicker.Text + "', 103) )";



convert() funkcija u Sql Serveru pretvara neku vrstu podatka u format koji ti zelis. Vezano za datum, potrebno je da kao prvi argument stavis datetime tip podatka, u drugi argument ide tvoj datum koji pretvaras (a u ovome primjeru upita, nakon pretvaranja i zapisujes u bazu); te zadnji argument je kod za oblik formata koji zelis.
103 je dd/mm/yyyy format za datum. Odi na http://msdn.microsoft.com/en-us/library/ms187928.aspx za dodatni info.

Naravno, ovo je rjesenje ako koristis ad-hoc sql direktno kroz ADO.NET
[ AMD guy @ 11.03.2009. 23:10 ] @
Ja sam to malo drugacije uradio
Code:

private void btnNovi_Click(object sender, EventArgs e)
        {
            //Kreiranje SqlConnection objekta za povezivanje sa bazom
            SqlConnection Conn = new SqlConnection(Properties.Settings.Default.veleprodajaConnStr);

            //Uspostavljanje veze sa bazom
            Conn.Open();
            DateTime datum = dateTimePicker1.Value;
            string insertString = "INSERT INTO korisnici(Username,Password,DatumRodjenja) VALUES (" + 
                "@Username, @Password, @DatumRodjenja"+")";
            
            //Kreiranje SqlCommand objekta za cuvanje izraza SELECT
           SqlCommand SqlComm = Conn.CreateCommand();
           SqlComm.CommandText = insertString;
 
            SqlComm.Parameters.Add("@Username",SqlDbType.NVarChar, 20);
            SqlComm.Parameters.Add("@Password", SqlDbType.NVarChar, 30);
            SqlComm.Parameters.Add("@DatumRodjenja", SqlDbType.DateTime, 20);

            SqlComm.Parameters["@Username"].Value = tbNoviUser.Text;
            SqlComm.Parameters["@Password"].Value = tbNoviPassword.Text;
            SqlComm.Parameters["@DatumRodjenja"].Value = dateTimePicker1.Text;

            SqlComm.ExecuteNonQuery();
            Conn.Close();
            MessageBox.Show("Korisnik kreiran"); 
            Close();
        }

A ovo je rezultat


Hvala na pomoci
[ Sapphire @ 11.03.2009. 23:31 ] @
Yeah, moze i sa parametrima dakako, samo moze eventualni problem biti u ovim konverzijama datuma, gdje koliko znam ne mozes iskorisiti parametre (mozda i nije tako, slobodno neka neko kaze). Jedno moguce rjesenje bi bila i stored procedura, koja u sebi ima convert funkciju...
[ sallle @ 12.03.2009. 01:49 ] @
ni jedno resenje ne valja.
moguce da ce kod vas proraditi, ali u opstem slucaju nece...

textualna reprezentacija datuma je culture sensitive...

cisto resenje bi bilo da u amd-ovom kodu stoji sledeci red:
Code:

SqlComm.Parameters["@DatumRodjenja"].Value = dateTimePicker1.Value;

datetimepicker ima razlicit minvalue od datetime polja u bazi, pa nekad nije lose ni to hendlovati.


ukoliko dodje do exceptiona ostace konekcija da visi , tako da bi valjalo iskoristiti try/catch ili using (sqlconnection...




[ AMD guy @ 12.03.2009. 19:37 ] @
Kako bi onda radio proveru, kod kreiranja novog korisnika dali je Username vec zauzet ili ne?

Zamenio sam SqlComm.Parameters["@DatumRodjenja"].Value = dateTimePicker1.Text sa SqlComm.Parameters["@DatumRodjenja"].Value = dateTimePicker1.Value i sada mi upisuje i sistemsko vreme u tablelu
[ sallle @ 13.03.2009. 00:47 ] @
moze na razne nacine. svakako treba da postavis unique index na username kolonu.

unos sa proverom mozesd a vrsis tako sto zamenis:
Code:

string insertString = @"if exists (select * from korisnici where username = @username) 
                               begin 
                                  select -1 
                               end 
                               else 
                               begin 
                                   INSERT INTO korisnici(Username,Password,DatumRodjenja) VALUES (@Username, @Password, @DatumRodjenja)
                                   select scope_identity()
                               end
                              ";



prilikom izvrsavanja naredbe, ne izvrsavas executenonquery() vec izvrsis executeScalar(). i ispitujes povratnu vrednost...
[ AMD guy @ 18.03.2009. 19:37 ] @
Jos jedno pitanje. Kako bi prikazao korisniku da je username vec zauzet, a ako nije onda nista. Probao sam ovako, ali imam gresku "Column "usename" does not belong to table korisnici"
Code:
foreach (DataRow row in myDataTable.Rows)
            {
                if (row["Username"].ToString() == tbNoviUser.Text)
                {
                    MessageBox.Show("Korisnicko ime zauzeto");
                }

            }


[Ovu poruku je menjao AMD guy dana 18.03.2009. u 21:13 GMT+1]