Έχω έναν πίνακα βάσης δεδομένων με 3 στήλες Όνομα
, Πατρώνυμο
και Ηλικία
. Στην εφαρμογή μου σε C# Windows έχω 3 πλαίσια κειμένου που ονομάζονται textbox1
... Έκανα τη σύνδεσή μου με τον SQL Server μου χρησιμοποιώντας αυτόν τον κώδικα:
SqlConnection con = new SqlConnection("Data Source = .;
Initial Catalog = domain;
Integrated Security = True");
con.Open();
SqlCommand cmd = new SqlCommand("Select * from tablename", con);
Θα ήθελα να πάρω τιμές από τη βάση δεδομένων μου. αν δώσω μια τιμή στο textbox1
πρέπει να ταιριάζει με τις τιμές στη βάση δεδομένων και να ανακτήσει άλλες λεπτομέρειες στα αντίστοιχα textboxes.
Δοκίμασα αυτή τη μέθοδο αλλά δεν λειτουργεί:
cmd.CommandText = "select * from tablename where firstname = '" + textBox1.Text + "' ";
Πώς μπορώ να το κάνω για να ανακτήσω όλες τις άλλες τιμές στα πλαίσια κειμένου;
public Person SomeMethod(string fName)
{
var con = ConfigurationManager.ConnectionStrings["Yourconnection"].ToString();
Person matchingPerson = new Person();
using (SqlConnection myConnection = new SqlConnection(con))
{
string oString = "Select * from Employees where FirstName=@fName";
SqlCommand oCmd = new SqlCommand(oString, myConnection);
oCmd.Parameters.AddWithValue("@Fname", fName);
myConnection.Open();
using (SqlDataReader oReader = oCmd.ExecuteReader())
{
while (oReader.Read())
{
matchingPerson.firstName = oReader["FirstName"].ToString();
matchingPerson.lastName = oReader["LastName"].ToString();
}
myConnection.Close();
}
}
return matchingPerson;
}
Λίγα πράγματα που πρέπει να σημειωθούν εδώ: Αυτό κάνει τον κώδικά σας ασφαλέστερο. Ο τρόπος με τον οποίο κάνετε την εντολή select με το μέρος "where x = "+ Textbox.Text +""
σας ανοίγει σε SQL injection.
Το άλλαξα σε: I've changed this to: I've changed this to: I've changed this to:
"Select * from Employees where FirstName=@fName"
oCmd.Parameters.AddWithValue("@fname", fName);
Έτσι, αυτό που θα κάνει αυτό το μπλοκ κώδικα είναι:
Να εκτελέσει μια εντολή SQL στη βάση δεδομένων σας, για να δει αν υπάρχουν ονόματα που ταιριάζουν με αυτό που δώσατε.
Αν αυτό συμβαίνει, το άτομο αυτό θα αποθηκευτεί σε ένα αντικείμενο Person (δείτε παρακάτω στην απάντησή μου για την κλάση).
Εάν δεν υπάρχει ταύτιση, οι ιδιότητες του αντικειμένου Person θα είναι null
.
Προφανώς δεν γνωρίζω ακριβώς τι προσπαθείτε να κάνετε, οπότε υπάρχουν μερικά πράγματα που πρέπει να προσέξετε: Όταν υπάρχουν περισσότερα από 1 άτομα με ίδιο όνομα, μόνο το τελευταίο θα αποθηκευτεί και θα σας επιστραφεί.
Αν θέλετε να μπορείτε να αποθηκεύσετε αυτά τα δεδομένα, μπορείτε να τα προσθέσετε σε μια Λίστα<Person>
.
Person για να το κάνετε πιο καθαρό:
public class Person
{
public string firstName { get; set; }
public string lastName { get; set; }
}
Τώρα θα καλέσουμε τη μέθοδο:
Person x = SomeMethod("John");
Στη συνέχεια μπορείτε να συμπληρώσετε τα πλαίσια κειμένου σας με τιμές που προέρχονται από το αντικείμενο Person ως εξής:
txtLastName.Text = x.LastName;
δημιουργήστε μια κλάση που ονομάζεται DbManager:
Class DbManager
{
SqlConnection connection;
SqlCommand command;
public DbManager()
{
connection = new SqlConnection();
connection.ConnectionString = @"Data Source=. \SQLEXPRESS;AttachDbFilename=|DataDirectory|DatabaseName.mdf;Integrated Security=True;User Instance=True";
command = new SqlCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
} // constructor
public bool GetUsersData(ref string lastname, ref string firstname, ref string age)
{
bool returnvalue = false;
try
{
command.CommandText = "select * from TableName where firstname=@firstname and lastname=@lastname";
command.Parameters.Add("firstname",SqlDbType.VarChar).Value = firstname;
command.Parameters.Add("lastname",SqlDbType.VarChar).Value = lastname;
connection.Open();
SqlDataReader reader= command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
lastname = reader.GetString(1);
firstname = reader.GetString(2);
age = reader.GetString(3);
}
}
returnvalue = true;
}
catch
{ }
finally
{
connection.Close();
}
return returnvalue;
}
στη συνέχεια κάντε διπλό κλικ στο κουμπί ανάκτησης(π.χ. btnretrieve) στη φόρμα σας και εισάγετε τον ακόλουθο κώδικα:
private void btnretrieve_Click(object sender, EventArgs e)
{
try
{
string lastname = null;
string firstname = null;
string age = null;
DbManager db = new DbManager();
bool status = db.GetUsersData(ref surname, ref firstname, ref age);
if (status)
{
txtlastname.Text = surname;
txtfirstname.Text = firstname;
txtAge.Text = age;
}
}
catch
{
}
}
Για να ανακτήσετε δεδομένα από τη βάση δεδομένων:
private SqlConnection Conn;
private void CreateConnection()
{
string ConnStr =
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
Conn = new SqlConnection(ConnStr);
}
public DataTable getData()
{
CreateConnection();
string SqlString = "SELECT * FROM TableName WHERE SomeID = @SomeID;";
SqlDataAdapter sda = new SqlDataAdapter(SqlString, Conn);
DataTable dt = new DataTable();
try
{
Conn.Open();
sda.Fill(dt);
}
catch (SqlException se)
{
DBErLog.DbServLog(se, se.ToString());
}
finally
{
Conn.Close();
}
return dt;
}