【问题标题】:Windows Form - Looping through table and foreign keysWindows 窗体 - 循环遍历表和外键
【发布时间】:2022-06-10 17:36:55
【问题描述】:

创建了两个表:MembersContracts

Contracts 有一个外键,ID 为Members

我还有两个班级:MemberContract

我的主要静态类Club 有一个ArrayListContract,每个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?

标签: c# sql database


猜你喜欢
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多