我需要一个方法来获取所选行的信息(使用另一个已经编写的方法(sql count))并将其放入名为Gebruiker(user)的对象中。
我已经有了一个方法,可以将对象中的信息与参数一起放入数据库,但这对另一种方法不起作用。
这是我的对象类:

namespace BurnThatFat
{
    class Gebruikerklasse
    {
        public string Naam;
        public string Achternaam;
        public int Leeftijd;
        public string Geslacht;
        public int Huidiggewicht;
        public int Streefgewicht;
        public string Gebruikersnaam;
        public string Wachtwoord;

        public override string ToString()
        {
            return Naam;
        }
    }
}

这是将对象中的信息放入数据库的方法:
public void SignUp(string commandText, Gebruikerklasse gebruiker)
{
    // nieuwe connectie maken
    // ontvangt de query vanuit 'buttonclick' en voert hem hier uit
    // als ExecuteNonQuery niet kan worden uitgevoerd is er iets fout gegaan. D.m.v een bool moet hij dan een bericht tonen
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand(commandText, conn))
    {
        conn.Open();

        cmd.Parameters.AddWithValue("@Naam", gebruiker.Naam);
        cmd.Parameters.AddWithValue("@Achternaam", gebruiker.Achternaam);
        cmd.Parameters.AddWithValue("@Leeftijd", gebruiker.Leeftijd);
        cmd.Parameters.AddWithValue("@Geslacht", gebruiker.Geslacht);
        cmd.Parameters.AddWithValue("@Huidiggewicht", gebruiker.Huidiggewicht);
        cmd.Parameters.AddWithValue("@Streefgewicht", gebruiker.Streefgewicht);
        cmd.Parameters.AddWithValue("@Gebruikersnaam", gebruiker.Gebruikersnaam);
        cmd.Parameters.AddWithValue("@Wachtwoord", gebruiker.Wachtwoord);

        int a = cmd.ExecuteNonQuery();

        if (a == 1)
        {
            Success = true;
        }
        else if (a == -1)
        {
            Success = false;
        }

        conn.Close();
    }
}

那我该怎么做呢?我真的不知道怎么用谷歌搜索。我想我在谷歌搜索时用错了词,因为我得到了一些不相关的东西…
编辑:添加的屏幕截图
所以我需要这张表中的信息:http://prnt.sc/dsg95v
要存储在此对象中:http://prnt.sc/dsghl1
我已经有了从对象返回到表的信息的代码(上面)。我用参数来做。
我真的不知道从哪里开始反对数据库…
再次编辑:如下所示:
public void DatabaseTransferObject(string commandText, Gebruikerklasse gebruiker)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand(commandText, conn))
    {
        conn.Open();

        gebruiker.Naam = //code to get Naam (name) from table Gebruiker (user);
        gebruiker.Leeftijd = //code to get Leeftijd(age) from table Gebruiker (user);

        conn.Close();
    }
}

这是从具有给定@username的行中获取所有信息的sql代码
“从gebruikersnaam=@gebruikersnaam的gebruikersnaam中选择*

最佳答案

很明显这是家庭作业,而且还远不清楚你想做什么,所以你需要填补空白。有相当数量的事情应该做得不同。
数据库设计
对于某种健身/体重跟踪器,看起来至少应该有两张桌子。一个用于用户数据,一个用于当前权重。目前的权重本身并不是很有趣,除非你也知道以前的权重,看看趋势是上升还是下降,不是吗?这样一张表还可以显示出损失/增加的速率(如果脂肪转化为肌肉,那么“恢复体形”会导致比预期更少的损失,甚至是增加)。
类似于{Id, UserId, Date, Weight}的方法可以将特定日期的许多权重值与用户关联起来。
不要储存容易计算的东西(如年龄)。这样的值迟早会出错和/或您对系统进行过多的维护。
永远不要将密码存储为纯文本。把它们散开。总是。
Gebruikerklasse(用户)
根据您的标题,您的类没有属性,只有公共字段/成员。在数据绑定方面,差异非常重要。
该表似乎存储了登录和健身相关的数据。但是登录数据在权重跟踪中不起作用,反之亦然,因此您可能应该有两个类:一个使用登录列,另一个使用与权重跟踪相关的表
数据库pk id不表示,这对更新至关重要。
因此,我的User课程将如何寻找与健身相关的元素:

public class User
{   // critical
    public int Id { get; set; }

    public string Name { get; set; }
    public string LastName { get; set; }

    public DateTime DateOfBirth { get; set; }
    public int Age
    {
        get { return DateTime.Now.Date.Year - DateOfBirth.Date.Year; }
    }

    public string Gender { get; set; }
    public int CurrentWeight { get; set; }
    public int Targetweight { get; set; }

    private static string dbConnStr = "server=127.0.0.1;database=...";
    public User()
    { }
 ...

与登录相关的数据被省略;另一个类将处理这个问题(如果我甚至需要一个类来处理它)。此外,DateOfBirth还用于计算年龄。您还可以添加代码来检查月份,以使用anb(最接近的年龄)年龄而不是alb(最后生日的年龄)方法。
如前所述,CurrentWeight应该是DateWeight值的某种集合。
接下来,在oop中,您通常希望类完成与管理与它相关的数据相关的所有工作(或尽可能多的工作)。因此,与其使用DatabaseTransferObject方法将数据“推送”到类对象中,不如使用类方法来加载数据本身。
有很多方法可以做到。这一个使用静态方法从行数据创建新的用户对象。这使用mysql,但是dbproviders的工作方式彼此之间差别很小:
// create a user object from an ID
public static User Load(int id)
{
    string sql = "SELECT * FROM gebruiker WHERE Id = @id";
    using (var dbCon = new MySqlConnection(dbConnStr))
    using (var cmd = new MySqlCommand(sql, dbCon))
    {
        dbCon.Open();
        cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = id;
        using (var rdr = cmd.ExecuteReader())
        {
            if (rdr.HasRows)
            {
                User U = new User();
                rdr.Read();
                U.Id = id;
                U.Name = rdr.GetString(rdr.GetOrdinal("FirstName"));
                U.LastName = rdr.GetString(rdr.GetOrdinal("LastName"));
                U.DateOfBirth = rdr.GetDateTime(rdr.GetOrdinal("BirthDate"));

                //...
                return U;
            }
            else { return null; }
        }
    }
}

SQL Server缺少按名称按列获取数据的Getxxxx(string)重写。对于像mysql这样具有重写功能的其他人来说,它稍微简单一些:
U.Name = rdr.GetString("FirstName");
U.LastName = rdr.GetString("LastName");
U.DateOfBirth = rdr.GetDateTime("BirthDate");

用法:
User U = new User(1);

可以使用实例方法来设置属性(this.Name = rdr.GetString("FirstName"););正如我所说,有很多方法可以做到这一点。一个互补的Save()方法几乎肯定是一个从本地数据插入/更新数据库的实例方法。
假设你想学习,而不仅仅是获得一个分数,一个简单的方法是使用orm。这些将数据库数据映射到类对象。Dapper是一个微型orm,它使用连接扩展将db数据映射到一个类:
User u = dbCon.Query<User>(SQL, new { id = 1 });

Dapper将从idUser的记录创建一个新的1对象。仅仅在设计中这样做是行不通的,因为列名和属性名不匹配。

关于c# - SQL Server数据库信息到属性类C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41516656/

10-13 08:39
查看更多