【发布时间】:2022-06-10 17:36:55
【问题描述】:
创建了两个表:Members 和 Contracts。
Contracts 有一个外键,ID 为Members。
我还有两个班级:Member 和 Contract。
我的主要静态类Club 有一个ArrayList 的Contract,每个Contract 都有一个字段Member。
现在,在我的Club 类中,我想用正确的Member 字段在数据库中的每个Contract 中填充我的ArrayList。
由于某种原因,这不起作用:(这是一个方法Club 类)
public static void Populate()
{
string connStr = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Contribution;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
SqlConnection con = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand("SELECT * FROM Contracts", con);
SqlDataReader dr;
try
{
con.Open();
dr = cmd.ExecuteReader();
while(dr.Read())
{
Member newMember = null;
int memberID = dr.GetInt32(dr.GetOrdinal("memberID"));
MessageBox.Show(memberID.ToString());
SqlCommand cmd2 = new SqlCommand("SELECT * FROM Members WHERE ID = @memberID", con);
cmd2.Parameters.AddWithValue("@memberID", memberID);
cmd2.ExecuteNonQuery();
SqlDataReader dr2;
dr2 = cmd2.ExecuteReader();
while (dr2.Read())
{
string name = dr2.GetString(dr2.GetOrdinal("name"));
DateTime birthDate = DateTime.ParseExact(dr2.GetString(dr2.GetOrdinal("birthDate")), "dd/MM/yyyy", null);
DateTime joinDate = DateTime.ParseExact(dr2.GetString(dr.GetOrdinal("joinDate")), "dd/MM/yyyy", null);
bool isPlaying = (dr2.GetInt32(dr2.GetOrdinal("isPlaying")) == 1 ? true : false);
newMember = new Member(name, birthDate, joinDate, isPlaying);
MessageBox.Show(name);
}
dr2.Close();
Club.AddContract(new Contract(newMember));
}
dr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
测试时,我没有得到预期的结果。
编辑:
我没有得到任何结果。我有计算总贡献和/或获取最年轻成员等的方法。所有这些字段要么为空,要么为空。
编辑 2:
稍微修改了我的代码:使用了参数,修复了一些小错误。还是不行。
【问题讨论】:
-
SqlCommand cmd2后跟dr2 = cmd.ExecuteReader();后跟dr.GetString。这看起来很乱。请开始使用parameters,以确保安全、易用和性能 -
你得到了什么,而不是预期的结果?例外?
-
另外,
dr2应该运行cmd,还是应该运行cmd2?这里有点混乱。顺便说一句,我推荐使用像 EF 这样的框架,这样你就不需要再像这样处理 SQL 了。 -
@XiangWeiHuang 没有例外。还有就是打错了,改成
cmd2还是没用。 -
cmd2.ExecuteNonQuery();你为什么要ExecuteNonQuery?