C# 我想在multi-select和union C之后从dataset检索数据
我想从数据集visual studio 2010检索数据 下面是sql语句:C# 我想在multi-select和union C之后从dataset检索数据,c#,sql,select,dataset,union,C#,Sql,Select,Dataset,Union,我想从数据集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}) 如果我在没有工会的情况下一次做一个陈述,它就会起作用 string sqltring ="SELECT
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})
如果我在没有工会的情况下一次做一个陈述,它就会起作用
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的工作方式是,结果集只有第一个SELECT的列名,但删除了所有重复的行。。。因此,您不能通过名称NO_IDENT_2访问列,只有值。。。即使数据来自UNION的第二个SELECT,列名仍将为NO_IDENT_1
通过访问thisTable.Columns.Count,您可以检查它是否具有所使用的SELECT的值1。您只能合并具有相同列定义的数据集。列定义由查询中的第一个集合确定,在这种情况下,第一个列命名为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})
在这里,我们对相似的数据使用结果中的同一列,并添加了一个新列来帮助我们区分数据来自何处。如果您不介意,可以随时删除源列。将查询更改为:
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";
}
为了你想要实现的目标,你可以拯救联邦。将您的查询更改为
SELECT NO_IDENT_1, NO_IDENT_2
FROM P240538
WHERE (P240538.DATE_dt > {2011/04/24})
你可以让你的循环保持原样
如果您想使用union解决方案,则上述语句的组合是正确的,您的查询应该如下所示
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})
请记住,应该避免联合查询,因为它们会对性能产生负面影响。有什么问题?你有错误吗?看起来不应该的数据?发生了什么事?记住,联合不会返回重复的数据。如果要查看重复数据,请使用UNION ALL。请提供您正在获得的输出以及所需输出的详细信息。建议:您可能希望将数据库对象命名为比P240538更具描述性的名称。。。另外:尝试对数据库手动运行sql,我想您会对得到的结果感到惊讶。