我需要一个方法来获取所选行的信息(使用另一个已经编写的方法(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
应该是Date
和Weight
值的某种集合。接下来,在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/