我可能有一个非常愚蠢的问题,但经过对谷歌的大量研究并尝试了几件事我没有找到解决问题的方法。
我正在使用TableAdapter
并运行以下查询:
SELECT
table1.column2, table2.column2
FROM
table2
INNER JOIN
table1 ON table2.ID = table1.table2ID
WHERE
(table1.column2 = @something)
运行以下代码
DataTable DT = new DataTable();
DT = TableAdapter.GetByColumn2("something");
除非结果DataTable
为空,否则正常工作。当它返回一个值时,我得到以下错误:
ConstraintException未处理 无法启用约束。一行或多行包含值 违反非空,唯一或外键约束。
如果我手动运行查询,它会返回我此时需要的信息,SQL不会抱怨任何约束。
我是C#的真正新手,如果有人可以提供帮助,我将非常感激。
...谢谢
答案 0 :(得分:0)
现在,如果您希望结果集中的两列都使用别名
,则只查询返回1列http://sqlfiddle.com/#!3/d6d68/4
您必须在sql查询中使用别名,以便查询返回两列。
SELECT table1.column2 as Table1Column2, table2.column2 as Table2Column2
FROM table2 INNER JOIN
table1 ON table2.ID = table1.table2ID
WHERE (table1.column2= @something)
这可能不是OP面临的确切问题,但OP必须包含他获得的错误以获得精确解决方案。
答案 1 :(得分:0)
你应该从DataAdapter填充你的DataTable
SqlDataAdapter SDA = new SqlDataAdapter();
DataTable dt = new DataTable();
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = @"SELECT table1.column2, table2.column2
FROM table2
INNER JOIN
table1 ON table2.ID = table1.table2ID
WHERE (table1.column2= @something)";
cmd.Connection = conn;
SDA.SelectCommand = cmd;
try
{
conn.Open();
cmd.ExecuteNonQuery();
SDA.Fill(dt);
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
答案 2 :(得分:0)
我可能已经找到了这个问题,如果有人能够修改我的想法,我会很高兴。
C#中的TableAdapers似乎要求SQL语句在结果中包含给定表的所有列。如果我只省略一列,代码将发出此约束错误。
可以添加其他列作为其他表中的别名,但需要将它们作为附加列添加到结果中。
就我个人而言,我目前还不了解这种行为背后的深层意义,因为我认为应该以某种方式使用SQL来准确检索给定点所需的数据。 TableAdapters以某种方式要求我每次使用它时都会发出“select * from table”。
请大家 - 如果我在这种情况下理解错误,请纠正我。
谢谢!