Select查询偶数和奇数个数
Select query even and odd value count
只有当 Image_ID1
和 Image_ID2
都不是 null
时,这些方法才会给出结果。
如果其中之一或两者都为空,则显示错误。
除此之外 returns 只有偶数计数,奇数计数被跳过。
例如,列 Image_ID1=1,3,null
和 Image_ID2=2,4,6
。
它必须显示 1,2,3,4,6
值,但显示 1,2,3,4
值是 null
值的原因。
我该如何解决这些问题?
private void BindGrid()
{
MySqlConnection con = new MySqlConnection(constr);
MySqlCommand cmd = new MySqlCommand("SELECT * FROM images where Image_ID in (" + String.Join(",", getImage_ID()) + ")", con);
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
gvImages.DataSource = dt;
gvImages.DataBind();
}
private List<int> getImage_ID()
{
List<int> i = new List<int>();
MySqlConnection con = new MySqlConnection(constr);
con.Open();
string query = "Select Image_ID1, Image_ID2 from register where students_ID='" + getStudents_ID() + "'AND Image_ID1 IS NOT NULL AND Image_ID2 IS NOT NULL";
MySqlCommand cmd = new MySqlCommand(query);
cmd.Connection = con;
MySqlDataReader reader = cmd.ExecuteReader();
foreach (DbDataRecord s in reader)
{
i.Add(s.GetInt32(0));
i.Add(s.GetInt32(1));
}
return i;
}
我建议使用单个 query/method:
string sql = @"
SELECT img.* FROM
(
SELECT i.* FROM Images i
INNER JOIN register r
ON i.Image_ID = r.Image_ID1
WHERE r.students_ID = @studentsID
UNION ALL
SELECT i.* FROM Images i
INNER JOIN register r
ON i.Image_ID = r.Image_ID2
WHERE r.students_ID = @studentsID
) img
";
MySqlCommand cmd = new MySqlCommand(sql , con);
cmd.Parameters.Add("@studentsID", MySqlDbType.Int32).Value = getStudents_ID();
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
而不是 getImage_ID() 方法中的 foreachloop 尝试下面提到的代码
while (reader.Read())
{
if (!reader.IsDBNull(reader.GetOrdinal("Image_ID1")))
i.Add(reader.GetInt32(reader.GetOrdinal("Image_ID1")));
if (!reader.IsDBNull(reader.GetOrdinal("Image_ID2")))
i.Add(reader.GetInt32(reader.GetOrdinal("Image_ID2")));
}
问题出在您的 SQL
"'AND Image_ID1 IS NOT NULL AND Image_ID2 IS NOT NULL"
应该是
"'AND (Image_ID1 IS NOT NULL OR Image_ID2 IS NOT NULL)"
那么foreach
正文应该是
if (!s.IsDBNull(0)) i.Add(s.GetInt32(0));
if (!s.IsDBNull(1)) i.Add(s.GetInt32(1));
只有当 Image_ID1
和 Image_ID2
都不是 null
时,这些方法才会给出结果。
如果其中之一或两者都为空,则显示错误。
除此之外 returns 只有偶数计数,奇数计数被跳过。
例如,列 Image_ID1=1,3,null
和 Image_ID2=2,4,6
。
它必须显示 1,2,3,4,6
值,但显示 1,2,3,4
值是 null
值的原因。
我该如何解决这些问题?
private void BindGrid()
{
MySqlConnection con = new MySqlConnection(constr);
MySqlCommand cmd = new MySqlCommand("SELECT * FROM images where Image_ID in (" + String.Join(",", getImage_ID()) + ")", con);
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
gvImages.DataSource = dt;
gvImages.DataBind();
}
private List<int> getImage_ID()
{
List<int> i = new List<int>();
MySqlConnection con = new MySqlConnection(constr);
con.Open();
string query = "Select Image_ID1, Image_ID2 from register where students_ID='" + getStudents_ID() + "'AND Image_ID1 IS NOT NULL AND Image_ID2 IS NOT NULL";
MySqlCommand cmd = new MySqlCommand(query);
cmd.Connection = con;
MySqlDataReader reader = cmd.ExecuteReader();
foreach (DbDataRecord s in reader)
{
i.Add(s.GetInt32(0));
i.Add(s.GetInt32(1));
}
return i;
}
我建议使用单个 query/method:
string sql = @"
SELECT img.* FROM
(
SELECT i.* FROM Images i
INNER JOIN register r
ON i.Image_ID = r.Image_ID1
WHERE r.students_ID = @studentsID
UNION ALL
SELECT i.* FROM Images i
INNER JOIN register r
ON i.Image_ID = r.Image_ID2
WHERE r.students_ID = @studentsID
) img
";
MySqlCommand cmd = new MySqlCommand(sql , con);
cmd.Parameters.Add("@studentsID", MySqlDbType.Int32).Value = getStudents_ID();
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
而不是 getImage_ID() 方法中的 foreachloop 尝试下面提到的代码
while (reader.Read())
{
if (!reader.IsDBNull(reader.GetOrdinal("Image_ID1")))
i.Add(reader.GetInt32(reader.GetOrdinal("Image_ID1")));
if (!reader.IsDBNull(reader.GetOrdinal("Image_ID2")))
i.Add(reader.GetInt32(reader.GetOrdinal("Image_ID2")));
}
问题出在您的 SQL
"'AND Image_ID1 IS NOT NULL AND Image_ID2 IS NOT NULL"
应该是
"'AND (Image_ID1 IS NOT NULL OR Image_ID2 IS NOT NULL)"
那么foreach
正文应该是
if (!s.IsDBNull(0)) i.Add(s.GetInt32(0));
if (!s.IsDBNull(1)) i.Add(s.GetInt32(1));