Рейтинг:
4
Wendelius
Похоже, вы называете GetPerson
объекта person, но внутри кода Вы создаете экземпляр нового человека и заполняете свойства для этого человека. Однако вновь созданный человек никогда не используется.
Так что внутри GetPerson
метод, извлеките new Person
вызовите и установите свойства объекта под рукой. Иначе говоря:
public class person
{
public string name { get; set; }
public string sex { get; set; }
public person somemethod(int IDnum)
{
string stselect = "select name,sex from tbltxt where ID=@ID";
// person ps = new person(); // this to be removed, you're already having an instance
using (SqlConnection cn = new SqlConnection(@"Data Source=~ \\dbtest;Integrated Security=True"))
{
cn.Open();
using (SqlCommand cmd = new SqlCommand(stselect,cn))
{
cmd.Parameters.AddWithValue("@ID", IDnum);
//cmd.ExecuteNonQuery();
using (SqlDataReader sqld = cmd.ExecuteReader())
{
while(sqld.Read())
{
this.name = sqld.GetString(0); // use this.
this.sex = sqld.GetString(1); // use this.
}
}
}
}
return this; // instead of returning the new instance return this
}
Другой вариант-изменить вызывающую сторону так, чтобы вы действительно использовали возвращаемый объект, например
private void button1_Click(object sender, EventArgs e)
{
person x = new person();
person returnedPerson;
returnedPerson = x.somemethod(Convert.ToInt32(textBox1.Text)); // to select which data you want to retrieve
textBox2.Text = returnedPerson.name;//here its not showing data
textBox3.Text = returnedPerson.sex;//data not retrieve
}
Однако было бы немного неуклюже сначала создать новый объект, который снова создает новый объект. Чтобы решить эту проблему, вы могли бы определить
GetPerson
метод как статический. В этом случае
GetPerson
было бы
public static Person GetPerson(int IDNum)
{
Person person = null;
try
{
//relevant code from somemethod to get person from database
SqlConnection.Open();
SqlCommand cmd = SqlConnection.CreateCommand();
cmd.CommandText = @"select name,sex from tbltxt where ID = @ID";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@ID", IDnum);
SqlDataReader sqld = cmd.ExecuteReader();
//use while when you expect multiple records, in this case only 1 seems expected so if can be used
if(sqld.Read())
{
person = new Person();
//set properties
person.name = sqld.GetString(0);
person.sex = sqld.GetString(1);
}
return person; //remember to check for null when retrieving person
}
catch (SqlException ex)
{
throw; //handle any errors
}
finally
{
SqlConnection.Close();
}
}
и теперь вызывающая сторона будет
private void button1_Click(object sender, EventArgs e)
{
person x;
x = Person.GetPerson(Convert.ToInt32(textBox1.Text)); // to select which data you want to retrieve
textBox2.Text = x.name;//here its not showing data
textBox3.Text = x.sex;//data not retrieve
}
jame01
это действительно полезный ответ большое спасибо за ваше драгоценное время,
просто интересно, хорошо ли это или есть другой способ, которым я должен учиться,,,,,
еще раз большое спасибо
Wendelius
Всегда пожалуйста :)
Существует много различных руководств и лучших практик, но я считаю, что они больше похожи на материал, из которого можно учиться, чем на точные инструкции, как что-то делать. Поэтому в зависимости от ситуации лучшее решение может сильно варьироваться.
Одна вещь, которая приходит на ум, заключается в том, что вы можете отделить сущность для данных от логики извлечения данных. Одним из простых способов может быть просто разделение класса person на два частичных класса. Другая часть будет содержать только свойства для хранения данных, в то время как другая часть будет содержать логику.
Wendelius
Всегда пожалуйста :)
Существует много различных руководств и лучших практик, но я считаю, что они больше похожи на материал, из которого можно учиться, чем на точные инструкции, как что-то делать. Поэтому в зависимости от ситуации лучшее решение может сильно варьироваться.
Одна вещь, которая приходит на ум, заключается в том, что вы можете отделить сущность для данных от логики извлечения данных. Одним из простых способов может быть просто разделение класса person на два частичных класса. Другая часть будет содержать только свойства для хранения данных, в то время как другая часть будет содержать логику.
jame01
Дорогой мистер Мика Венделиус
еще раз спасибо за вашу помощь, вы уже помогли мне, и это было так ценно ,
здесь я прошу еще об одном одолжении, если его не так много, если его вы уже помогли, и этого было достаточно :),
это используется для выбора можно использовать вставить этот путь ?
это к другому ?
Wendelius
Если я правильно понимаю вопрос, Да, вы можете использовать ту же идею и со вставками. Вы можете создать статический метод, который выполняет вставку и получает человека в качестве параметра. Подпись будет выглядеть примерно так
публичный статический пункт insertperson лицо(лица personToInsert) {
....
Однако было бы разумнее не делать этот метод статичным. Когда вы извлекаете человека, у вас на самом деле нет этого человека, поэтому у вас есть статический идентификатор метода. Но когда вы вставляете человека, вы уже заполнили все свойства и должны передать экземпляр объекта Person для вставки. Так почему бы не определить вставку как часть экземпляра person? Иначе говоря
класс person {
public bool Insert() {
... код для вставки ...
В этом случае вызов будет выглядеть примерно так
Человек человек = новый человек();
человек.свойства FirstName = "...";
человек.фамилия = "...";
...
если (! человек.Вставить()) {
.. сообщите о проблеме ...
}
Рейтинг:
1
P_Z
Привет...просто несколько предложений по кодированию
Я думаю, что вы должны сначала лучше организовать код, так что
Строка подключения (@"Data Source=~ \ \ dbtest;Integrated Security=True") должна храниться в конфигурационном файле. Кроме того, вы будете использовать одну и ту же строку подключения для каждого метода, и это хорошо, чтобы изменить только из одного места
public class Person
{
//think of this as a Model - if you're using MVC
public string name { get; set; }
public string sex { get; set; }
}
public class DatabaseQueries
{
//name your class whatever makes sense
public SqlConnection SqlConnection { get; set; }
public DatabaseQueries()
{
this.SqlConnection = new SqlConnection("get the connection string...");
}
public Person GetPerson(int IDNum)
{
Person person = null;
try
{
//relevant code from somemethod to get person from database
SqlConnection.Open();
SqlCommand cmd = SqlConnection.CreateCommand();
cmd.CommandText = @"select name,sex from tbltxt where ID = @ID";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@ID", IDnum);
SqlDataReader sqld = cmd.ExecuteReader();
//use while when you expect multiple records, in this case only 1 seems expected so if can be used
if(sqld.Read())
{
person = new Person();
//set properties
person.name = sqld.GetString(0);
person.sex = sqld.GetString(1);
}
return person; //remember to check for null when retrieving person
}
catch (SqlException ex)
{
throw; //handle any errors
}
finally
{
SqlConnection.Close();
}
}
}
jame01
спасибо за помощь...
я знаю, что это хороший способ использовать его, но не могли бы вы сказать мне, что в этом плохого
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
DatabaseQueries dbs = new DatabaseQueries (); / / im вызывающий класс
обн.Транзакции Getperson(Конвертировать.ToInt32(textBox1. Text)); / / gaiving value
Человек ps = новый человек();
// Человека settheperosn;
поле textbox2.Текст =зы.название ;
textbox3 и.Текст = зы.секс;
}
P_Z
> & gt; dbs.Транзакции Getperson(Конвертировать.ToInt32(textBox1. Text)); / / gaiving value
> & gt; Person ps = new Person (); / / у этого человека нет данных базы данных...только что создан новый объект
Некоторые незначительные обновления кнопки click
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
DatabaseQueries dbs = new DatabaseQueries (); / / im вызывающий класс
int personID = -1;
int. TryParse(textBox1. Text, out personID); / / текст может содержать нецифровые символы
Человек ps = dbs.GetPerson(personID); / / теперь person будет заполнен данными базы данных
if (ps != null)
{
// null проверка из-за человека с personID может не существовать
поле textbox2.Текст = зы.название;
textbox3 и.Текст = зы.секс;
}
}
Richard Deeming
Если вы просто собираетесь переосмыслить исключение, нет смысла его ловить. Вы могли бы также удалить catch (SqlException ex) { throw; }
блок. :)