计算每行的“不为空”列数,并将该信息放入另一列

时间:2013-09-20 13:14:32

标签: c# sql linq dataset

我是SQL的新手,已经开始了一种测试项目,让我的手弄脏SQL和C#。我一直在使用VS2012的数据库向导来设置所有内容。所以这是我的设置的简要说明。

名为ACDTable的SQL CE表,它通过数据集dataSet1和表适配器dataTableAdapter连接到我的C#项目

ACDTable有22列,我想要做的是为每一列都有一个值(不为空)我为每一列指定它将一个添加到一个计数器然后将该总和添加到另一列我指定。

基本上我需要找到每行有多少列不为空,并将该数字转换为C#中可用的内容。

示例:

 |Col1 | Col2 | Col3| Col4| Col5|
 |     |      |     |     |     |
 |  x  |   x  |     |  x  |  3  |
 |     |   x  |  x  |     |  2  |
 |  x  |      |     |     |  1  |

我正在使用示例Count of non-null columns in each row,如果我只是通过SQL将其作为查询运行,它确实很有用。

我正在使用的例子:

SELECT   Col1,
         Col2,
         Col3,
         Col4,


     CASE WHEN Col1 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN  Col2 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN  Col3 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN  Col4 IS NOT NULL THEN 1 ELSE 0 END AS Col5
 FROM     ACDTable

我遇到的问题是当我使用Visual Studio创建基于此Query的方法时,我尝试通过该方法获取Col5的值,我得到NullDB异常。如果我在调用方法后运行调试器并查看表,则Col5完全为空。我有一种感觉,问题是查询本身实际上并没有改变第5列,但我对SQL的经验不足,我无法找出正确的语法来解决这个问题。

修正了我在SELECT列表中使用Col5的错误

编辑以显示我正在使用的代码

方法本身是Visual Studio使用表适配器中的“添加查询”选项生成的方法。如果我理解正确应该运行上面的查询,然后将值放入Col5。 然后我只想看看使用

在richtextbox中表示的那些值
GetTotals(); //The Generated method from VS that runs my query
var totals = from p in dataTable select p.Col5;
   foreach (var total in totals)
     {
       testTextBox.Text = total
     }

3 个答案:

答案 0 :(得分:1)

如果我理解你的评论,那么我会看到问题出在哪里。 此时,您只需从表中选择值,而不是在其中写入任何值。一种方法是通过创建UPDATE查询并将Col5的值设置为case语句。

UPDATE ACDTable
SET Col5 = CASE WHEN....

我想你知道怎么做到这一点。如果必须,您仍然可以在最后添加WHERE子句。

答案 1 :(得分:0)

您在选择列表中有Column 5两次。一旦作为命名列,一次作为计算列。你是否创造了这个错误创建这篇文章,或者它是否在你的代码中?

答案 2 :(得分:0)

因为Col5没有案例(条件)。 你有col1,col2,col3,col4和no col5你只需将col4名称作为col5,这在这种情况下是一个坏主意。