Ne rješavamo zadaće, jbg.
C# - Problemi i rješenja
- poruka: 2.151
- |
- čitano: 702.976
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Kako da dobijem kada u text box unosim neke znakove (lozinku) da mi umjesto znakova 1234 prikazuje ****?
Kada upisujemo lozinku kao kad se logiramo za bug forum?
textBox1.PasswordChar = '*';
Hvala, vidio sam da imam u toolbox-u passwordbox je li preko toga išta jednostavnije ili ?
Nema mi u VS passwordChar?
Hvala, vidio sam da imam u toolbox-u passwordbox je li preko toga išta jednostavnije ili ?
To je to isto.
Uspio sam ovako
string password = pass_txtbox.Password;
Kako da iz baze izvučem jedan podatak. Npr trebam unijeti korisničko ime bankara i s time da izvadim iz baze lozinku koju koristi taj bankar?
Pokusao sam sa:
aBankar dbPassword = new aBankar(reader.GetString(4));
ali javlja mi error Bank.aBankar.Load(string)': not all code paths return a value
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
namespace Bank
{
class aBankar
{
//private int bankarID;
//private string imeBankara;
//private string prezimeBankara;
//private string korImeBankara;
private string lozinkaBankara;
public aBankar(string lozinkaBankara)
{
//this.imeBankara = imeBankara;
//this.prezimeBankara = prezimeBankara;
//this.korImeBankara = korImeBankara;
this.lozinkaBankara = lozinkaBankara;
}
public override string ToString()
{
return lozinkaBankara;
}
/* public string Ime
{
get
{
return imeBankara;
}
}
public string Prezime
{
get
{
return prezimeBankara;
}
}
public string Korisnicko
{
get
{
return korImeBankara;
}
}
*/
public string Lozinka
{
get
{
return lozinkaBankara;
}
}
static String connectionStr = @"Data Source = '.\SQLExpress';
Initial Catalog = Bank;
Integrated Security = True";
public static aBankar Load(string userName)
{
string query = @"SELECT * FROM aBankar WHERE Ime =" + userName;
SqlConnection connection = new SqlConnection(connectionStr);
try
{
connection.Open();
SqlCommand command = new SqlCommand();
command.CommandText = query;
SqlDataReader reader = command.ExecuteReader();
reader.Read();
aBankar dbPassword = new aBankar(reader.GetString(4));
reader.Close();
return dbPassword;
}
catch (SqlException x)
{
Console.WriteLine(x.Message);
}
finally
{
connection.Close();
connection.Dispose();
}
}
}
}
catch i finally blokovi ti moraju vraćati nešto jer metoda "Load(string username)" nije tipa void, dakle, vraća vrijednost. Stavi da catch vraća null a finally dbPassword.
Inače, iz baze nikad ne čitaš na taj način jer bi netko umjesto ispravnog passworda mogao napisati npr. ovonijepravipassword' OR '1' = '1'; /* i na taj način se uredno ulogirati, bez da zna password. Ispravan način su parametarski upiti jer nikad ne znaš što će korisnik upisati. I ne, nemoj "ja tek učim" jer se uči od početka kako treba. Kasnije je nekog jako teško uvjeriti da je slaganje sql upita lijepljenjem stringova jako loša ideja.
Ispravio sam to što si mi rekao, ali ne radi mi opet, cilj mi je da dohvatim jedan password iz baze i spremim ga u string varijablu te ga usporedim s onim iz text box-a?
Za ovaj kod mi ne javlja nikaku grešku ali ne dobivam ono što bih htio?
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
namespace Bank
{
class aBankar
{
//private int bankarID;
//private string imeBankara;
//private string prezimeBankara;
//private string korImeBankara;
private string lozinkaBankara;
public aBankar(string lozinkaBankara)
{
//this.imeBankara = imeBankara;
//this.prezimeBankara = prezimeBankara;
//this.korImeBankara = korImeBankara;
this.lozinkaBankara = lozinkaBankara;
}
public override string ToString()
{
return lozinkaBankara;
}
/* public string Ime
{
get
{
return imeBankara;
}
}
public string Prezime
{
get
{
return prezimeBankara;
}
}
public string Korisnicko
{
get
{
return korImeBankara;
}
}
*/
public string Lozinka
{
get
{
return lozinkaBankara;
}
}
static String connectionStr = @"Data Source = '.\SQLEXPRESS';
Initial Catalog = Bank;
Integrated Security = True";
public static aBankar Load_pass(string userName)
{
string query = @"SELECT Lozinka FROM aBankar WHERE KorisnickoIme =" + userName;
SqlConnection connection = new SqlConnection(connectionStr);
try
{
connection.Open();
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = query;
SqlDataReader reader = command.ExecuteReader();
reader.Read();
aBankar dbPassword = new aBankar (reader.GetString(4));
reader.Close();
return dbPassword;
}
catch (SqlException x)
{
Console.WriteLine(x.Message);
}
catch(Exception x)
{
Console.WriteLine(x.Message);
}
finally
{
connection.Close();
connection.Dispose();
}
return null;
}
}
}
Zašto .GetString(4) kad u readeru imaš samo pass (SELECT Lozinka FROM aBankar)? .GetString(4) čita iz četvrtog stupca koji ti nemaš....
edit - i opet si shebo. Vraćaš null bez obzira je li išta povučeno iz baze. return null; ide u catch blokove, ne nakon try....catch bloka.
Nevezano za pogrešku...
Password se nikada ne sprema u string, nego u char[].
Stringu jednom kada dodijeliš vrijednost, on ju ima zauvijek (odnosno, sve dokle ga garbage collector je pokupi). Charu (i, naravno, polju charova) možeš mjenjati podatke tokom njegovog lifespana.
I onda pravilno postupanje sa lozinkom (u ovome slučaju, da ne ulazimo u problematiku manipulacije u plain-textu) je ovako
if (userPass == userPassDb)
{
Array.Clear(userPass, 0, userPass.length);
Array.Clear(userPassDb, 0, userPassDb.length);
MessageBox.Show("Prijava uspješna")
}
else
{
//analogno gornjem bloku
}
Ispravio sam ali opet mi ne radi, uopće ne dohvaća podatak iz baze i ne sprema mi ga u dbPassword? Stavio sam breakpoint na čitav try block i za svaku mi vrijednost piše null?
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
namespace Bank
{
class aBankar
{
//private int bankarID;
//private string imeBankara;
//private string prezimeBankara;
//private string korImeBankara;
private string lozinkaBankara;
public aBankar(string lozinkaBankara)
{
/* this.imeBankara = imeBankara;
this.prezimeBankara = prezimeBankara;
this.korImeBankara = korImeBankara;
*/
this.lozinkaBankara = lozinkaBankara;
}
public override string ToString()
{
return lozinkaBankara;
}
/*
public string Ime
{
get
{
return imeBankara;
}
}
public string Prezime
{
get
{
return prezimeBankara;
}
}
public string Korisnicko
{
get
{
return korImeBankara;
}
}
*/
public string Lozinka
{
get
{
return lozinkaBankara;
}
}
static String connectionStr = @"Data Source='.\SQLEXPRESS';
Initial Catalog=Bank;
Integrated Security=True";
public static aBankar Load_pass(string userName)
{
string query = @"SELECT Lozinka FROM aBankar WHERE KorisnickoIme =" + userName;
SqlConnection connection = new SqlConnection(connectionStr);
try
{
connection.Open();
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = query;
SqlDataReader reader = command.ExecuteReader();
reader.Read();
aBankar dbPassword = new aBankar(reader.GetString(0));
reader.Close();
return dbPassword;
}
catch (SqlException x)
{
Console.WriteLine(x.Message);
return null;
}
catch(Exception x)
{
Console.WriteLine(x.Message);
return null;
}
finally
{
connection.Close();
connection.Dispose();
}
}
}
}
Izbaci Where kaluzulu, provrti kroz foreach sve recorde u readeru, postavi provjeru u Watchu da li ti koji record iz foreacha hita userPass.
U Watchu upišeš
trenutniItemIzForeacha == userPass
Kako da napravi da mi ispis bude poravnat, da ne bude ovakav:
ID | Ime | Prezime | Grad | Datum | Broj računa | OIB
104 | Marko | Ivic | Zagreb | 24.8.1991. | 1 | 8
108 | Valentin | Ivancic | Zagreb | 1.1.1900. | 2 | 9
120 | Ivan | Maric | Zagreb | 4.2.1992. | 222 | 1
rchTxtData.AppendText(String.Format("{0,-15} | {1,-15} | {2,-15} | {3,-15} | {4,-14} | {5,-15} | {6,-15}\n", "ID", "Ime", "Prezime", "Grad", "Datum", "Broj računa", "OIB"));
rchTxtData.AppendText(String.Format("{0,-15} | {1,-15} | {2,-15} | {3,-15} | {4,-15} | {5,-15} | {6,-15}\n", klijent.getKlijent_ID.ToString(), klijent.getIme, klijent.getPrezime, klijent.getGrad, klijent.getDatum, klijent.getBroj_racuna, klijent.getOIB));
Treba ti drugi font, poput Courier New koji za svaki znak odvaja istu količinu mjesta. A onda ti neće biti problem poravnati.
Provjerit cu nisam još za svojim racunalom, hvala.
Pomoć,
trebao bih loadat više XML-a sa više linkova:
http://3d.probado.igd.fraunhofer.de/Probado3DOAI/?verb=GetRecord&metadataPrefix=p3dm&identifier=1
http://3d.probado.igd.fraunhofer.de/Probado3DOAI/?verb=GetRecord&metadataPrefix=p3dm&identifier=2
...
Petlja bi trebala prestati loadati kad vise nema dokumenata, tj kad linkovi izbacuju drugaciji yml u kojem je definiran error.
static void Main(string[] args)
{
var i = 1;
do{
XDocument doc = XDocument.Load(args[0] + "/?verb=GetRecord&metadataPrefix=p3dm&identifier=" + i);
var node = doc.Descendants("identifier").First().Value;
doc.Save("anything" + i + ".xml");
i++;
} while (node == i); // value u elementu <identifier> je isto kao -i, sve do kraja kada identifier nestaje...zato ovaj uvijet
Sad dobijem gresku The name 'node' does not exist in the current context za zadnji red.
Deklariraj "node" gore iznad do..while petlje, tamo gdje si deklarirao "i".
[edit] - provjeravaj gdje ti id-evi završavaju... Probaj sa 9999 npr. Dobiješ ovo: <error code="idDoesNotExist"/>
ne mogu gore kad mi gore "doc" nije definiran, a "node" je value od elementa iz "doc".
provjeravam, idu do 23243, br. 23244 više nema zapisa. To me i mući, kako da prestanem brojat kad dodje do tamo.
Anyway, tnx.
Pa ovako...
bool work = true;
do{
// sad tu ide tvoj dio posla
node... bla
if (node == "Error" | node == null)
{
work = false;
}
}
while (work);
EDIT: Uspio sam rješiti
Imam jedno pitanje. Mozda je vise vezano uz baze podataka, ali ima veze sa c#-om.
Trebam iz c# programa mySQL bazi "poslati" neke podatke. Pratio sam ovo http://www.codeproject.com/Articles/43438/Connect-C-to-MySQL
Baza nije lokalna, odnosno nije na korisnikovom racunalu, nego online (na web serveru).
Poprilicno sam siguran da sam dobro upisao sve podatke. Zanima me samo sto bi tocno trebao upisati pod server. Moze li to biti samo domena (ili ip koji sam dobio u mailu kad sam zakupio hosting), ili mora biti nesto drugo?
MySqlException.NUMBER je 0 (cannot connect to database).
Stvarno prvi puta radim ovako nesto i svaka pomoc mi je dobrodosla (ili neki drugi link sa mozda boljim pojasnjenjem).
PUNO HVALA
Točan odgovor je - zavisi. Onaj koji tebi nešto znači - IP.
Pripazi jedino da je na bazi omogućeno remoting spajanje. Ako si zakupio bazu preko hostinga, a pokušavaš tu bazu pingati sa "vansjskog" računala, vjerojatno te blokira ili firewall ili same postavke na bazi, odnosno virtualki, odnosno lokalnom DNS-u (čitaj kontaktiraj providera).
Samo sam trebao dodati svoj IP u popis dozvoljenih
Buduci da bih zelio da svaki korisnik moze poslati podatke bazi, ovo nije opcija. Jedino sto mi sada pada na pamet je da nekako iz C# programa pokrenem PHP na serveru koji bi onda dodavao to u bazu. Buduci da nemam blage veze o PHP-u, molio bih da mi sugerirate od cega poceti guglati za nesto ovako (ili naravno, neki bolji nacin).
Hvala
Promijeni hosting.
Koji god da sam uzimao, niti jedan me nije ograničavao na taj način. Alternativno ti je dignuti WCF servis koji ima uvijek istu IP pa da klijenti preko njega komuniciraju sa bazom.
Zamoli support da otvori spajanje na mysql iz vana i to je to. Dakle, ne staviti samo svoj IP nego stavi % tako da se mos spojit sa bilo kojeg IP-a.
Samo sam trebao dodati svoj IP u popis dozvoljenih
Buduci da bih zelio da svaki korisnik moze poslati podatke bazi, ovo nije opcija. Jedino sto mi sada pada na pamet je da nekako iz C# programa pokrenem PHP na serveru koji bi onda dodavao to u bazu. Buduci da nemam blage veze o PHP-u, molio bih da mi sugerirate od cega poceti guglati za nesto ovako (ili naravno, neki bolji nacin).
Hvala
Imao sam takav problem. Čak sam se i uspio spojiti na mysql koji je na mom hostingu iz moje aplikacije ali komunikacija je jednostavno prespora.
Na kraju sam zakupio Windows hosting, i to samo malu MS SQL bazu na njemu. Dobio korisničke podatke i normalno se preko interneta na nju spojio iz svoje aplikacije, kao i ostali ljudi iz drugih zemalja.
I ja sam u izradi Windows phone aplikacije i imao sam sličnu stvar napravit da radi. Znaci aplikacja piše / čita podatke iz baze podataka. Pošto nemam para za zakup hostiga odlučio sam nabaciti na neki free hosting wordpress site i preko phpadmina napraviti svoju bazu mysql. napravio sam page koji preko http zahtjeva prima podatke i onda se mysql code uz php odvija na stranici i sve se spremi u bazu. Malo vise posla ima kod povlačenja podataka iz baze ali za to sam odradio malo webscrapinga i stvar funkcionira solidno
Uspio sam sve sredit, hvala svima.
Komunikacija je dosta spora (1-2 sekunde da posalje 2 kratka stringa i int bazi...). Mozda je problem u jeftinom hostingu od 2 dolara.
Meni te 2 sekunde nisu problem, nekome mozd ahoce bit.
Hvala jos jednom svima
bog ljudi.
imam jedno pitanje (možda je jednostavno) iz c - a pa ako mi možete pomoći (znam da je tema c# ali nisam nasao temu vezanu za c )
kako mogu returnati niz iz funkcije (npr. od više nizova funkcija mi provjerava koji ima najveći zbroj elemenata te mi istog treba poslati u main da ga ispišem )