【问题标题】:I would like to retrieve data from dataset after multi select and union C#我想在多选和联合 C# 后从数据集中检索数据
【发布时间】:2011-10-25 20:37:24
【问题描述】:

我想从数据集中检索数据 (visual studio 2010) 这是sql语句:

SELECT NO_IDENT_1 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
Union 
SELECT NO_IDENT_2 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24})

如果我在没有union 的情况下一次执行一个语句,它会起作用。

string sqltring ="SELECT NO_IDENT_1 FROM P240538 WHERE (P240538.DATE_dt > {2011/04/24}) Union SELECT NO_IDENT_2 FROM P240538 WHERE (P240538.DATE_dt > {2011/04/24})"

OleDbConnection ConnFoxPro = new OleDbConnection(Properties.Settings.Default.S_ConnFoxPro26);
try
{
    ConnFoxPro.Open();
   // MessageBox.Show("  Connection State = " + ConnFoxPro.State);
}
catch (OleDbException ex)
{
    string errorMessages = "";
    for (int i = 0; i < ex.Errors.Count; i++)
    {
        errorMessages += "Index #" + i + "\n" +
                "Message: " + ex.Errors[i].Message + "\n" +
                "NativeError: " + ex.Errors[i].NativeError + "\n" +
                "Source: " + ex.Errors[i].Source + "\n" +
                "SQLState: " + ex.Errors[i].SQLState + "\n";
    }
    System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
    log.Source = "Mon application";
    log.WriteEntry(errorMessages);
    Console.WriteLine("Vous avez un exeption. Svp Contacter votre administrateur de system cdd ");
}
{

    try
{
    //MessageBox.Show(RqCompte);
    OleDbDataAdapter DA_ID = new OleDbDataAdapter(sqltring, ConnFoxPro);
    DataSet Ds_ID = new DataSet();
    DA_ID.Fill(Ds_ID, "P240538");

    foreach (DataTable thisTable in Ds_ID.Tables)
    {
        // For each row, print the values of each column.

        foreach (DataRow row in thisTable.Rows)
        {
           // string rowdata = row.ItemArray[0].ToString().Replace(" ", "");
            string rowdata1 = row["NO_IDENT_1"].ToString().Replace(" ", "");
            if (rowdata1 != "")
                liste_No_Ident += rowdata1 + " ";// +"NOMBRE = " + row["nbr_doublon"] + "\n\n";
            string rowdata2 = row["NO_IDENT_2"].ToString().Replace(" ", "");
            if (rowdata2 != "")
                liste_No_Ident += rowdata2 + " ";// +"NOMBRE = " + row["nbr_doublon"] + "\n\n";


        }
    }
}
catch (Exception e)
{
}

【问题讨论】:

  • 有什么问题?你有错误吗?看起来不应该的数据?怎么了?请记住,UNION 不会返回重复数据。如果您想查看重复数据,请使用UNION ALL。请提供有关您获得的输出以及您想要的输出的更多信息。
  • 建议:您可能希望将数据库对象命名为比 P240538 更具描述性的名称...另外:尝试对数据库手动运行 sql,我想您会对您得到的结果感到惊讶。

标签: c# sql select dataset union


【解决方案1】:

对于您想要实现的目标,您可以拯救工会。将您的查询更改为

SELECT NO_IDENT_1, NO_IDENT_2
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 

您可以保持循环不变。

如果您想使用联合解决方案,则上述语句的混合是正确的,您的查询应该如下所示

SELECT NO_IDENT_1 AS NO_IDENT 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
Union All
SELECT NO_IDENT_2 AS NO_IDENT 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24})

请记住,应避免联合查询,因为它们会对性能产生负面影响。

【讨论】:

    【解决方案2】:

    UNION 的工作方式是结果集只有第一个 SELECT 的列名,但所有行(已删除重复项)...所以您不能按名称访问列 NO_IDENT_2,只有值...即使数据来自UNION 中的第二个SELECT,列名仍将是NO_IDENT_1

    您可以通过访问 thisTable.Columns.Count 进行检查 - 您正在使用的 SELECT 的值为 1。

    【讨论】:

      【解决方案3】:

      将您的查询更改为:

      SELECT NO_IDENT_1 AS IDENT
      FROM P240538 
      WHERE (P240538.DATE_dt > {2011/04/24}) 
      Union 
      SELECT NO_IDENT_2 AS IDENT
      FROM P240538 
      WHERE (P240538.DATE_dt > {2011/04/24})
      

      把你的循环改成这样:

          foreach (DataRow row in thisTable.Rows)
          {
             // string rowdata = row.ItemArray[0].ToString().Replace(" ", "");
              string rowdata1 = row["IDENT"].ToString().Replace(" ", "");
              if (rowdata1 != "")
                  liste_No_Ident += rowdata1 + " ";// +"NOMBRE = " + row["nbr_doublon"] + "\n\n";
          }
      

      【讨论】:

        【解决方案4】:

        您只能合并具有相同列定义的数据集。列定义由查询中的第一组决定,在这种情况下,第一列被命名为NO_IDENT_1。如果这些列是不同的类型,则联合将完全失败。如果您希望您的代码按书面方式工作,您可以将查询更改为:

        SELECT NO_IDENT_1, NULL AS NO_IDENT_2
        FROM P240538 
        WHERE (P240538.DATE_dt > {2011/04/24}) 
        Union 
        SELECT NULL AS NO_IDENT_1, NO_IDENT_2 
        FROM P240538 
        WHERE (P240538.DATE_dt > {2011/04/24})
        

        在这里,我们在每个查询中创建了一个虚拟列,作为其他数据集中不存在的列的占位符。

        或者,您可以更改代码以使用类似于以下内容:

        SELECT NO_IDENT_1 AS NO_IDENT, 1 AS SOURCE
        FROM P240538 
        WHERE (P240538.DATE_dt > {2011/04/24}) 
        Union 
        SELECT NO_IDENT_2 AS NO_IDENT, 2 AS SOURCE
        FROM P240538 
        WHERE (P240538.DATE_dt > {2011/04/24})
        

        在这里,我们将结果中的同一列用于相似的数据,并添加了一个新列来帮助我们区分数据的来源。如果您不在乎,您可以随时删除 Source 列。

        【讨论】:

          猜你喜欢
          • 2017-04-28
          • 2016-02-14
          • 2019-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-06
          相关资源
          最近更新 更多