jame01 Ответов: 2

Извлечение данных из SQL-сервера через класс


Здравствуйте, дорогие..
я пытаюсь получить данные из sql через класс, но он выходит пустым, что означает отсутствие возврата данных?

и разве это хороший способ извлечения ?
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();
                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())
                            {
                                ps.name = sqld.GetString(0);
                                ps.sex = sqld.GetString(1);
                            }
                          }
                      }
                    }
                return ps;
            }
           
        }

здесь я должен получить данные, например, если я пишу 1 в textbox1, я должен получить имя Джона в textbox2 и мужчину в textbox3, но он не получает никаких данных без ошибок...
private void button1_Click(object sender, EventArgs e)
       {
           person x = new person();
           x.somemethod(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
       }


Что я уже пробовал:

проблема в том, что он не дает никакой ошибки !!! просто нет извлечения данных.....

[no name]

"что случилось", откуда нам знать? У нас нет доступа к вашей базе данных. Узнайте, как отлаживать свой код.

jame01

спасибо за вашу заботу, как я уже упоминал, я не могу получить данные , так как это показывает в событии нажатия кнопки, я должен получить данные обратно в textbox2 и textbox3, но не получаю их ....
спасибо дорогая

[no name]

Как я уже сказал, научитесь отлаживать свой код. У нас нет доступа к вашей базе данных, поэтому мы понятия не имеем, почему вы не можете этого сделать.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Вы должны отладить и выяснить, где именно находится проблема.

jame01

сэр, я отлаживаю его, но никакой ошибки не появляется, проблема в том, что нет возврата данных ...
спасибо

Afzaal Ahmad Zeeshan

Есть ли какие-либо данные в вашей базе данных? А стол, которым вы пользуетесь?

jame01

да, есть данные, и я могу получить данные другим способом, но я хочу использовать этот класс, он будет очень полезен ..
столе

2 Ответов

Рейтинг:
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; } блок. :)