这个sql命令查询中没有打印数据的地方?

时间:2014-10-21 11:48:59

标签: c# sql sql-server-2008 datatable

目的

我想在我的数据库表Orders中打印PrintTime字段值为NULL

的所有行

代码

class Printing
{
    public static void check() 
    {
        SqlConnection con = getConnectionString();
        string query = "SELECT * FROM Orders WHERE PrintTime = @printTimeValue";
        SqlCommand command = new SqlCommand(query, con);
        command.Parameters.AddWithValue("@printTimeValue", DBNull.Value);
        DataTable results = new DataTable();
        using (con)
        using (command)
        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
            dataAdapter.Fill(results);
        for (int i = 0; i < results.Rows.Count; i++) 
        {
            Console.WriteLine(results.Rows[i]["ID"].ToString());
            Console.WriteLine("---------------");
        }
    }
    private static SqlConnection getConnectionString()
    {           
        string vmpstring = 
            ConfigurationManager.ConnectionStrings["chinese"].ConnectionString;
        SqlConnection vmpsqlcon = new SqlConnection(vmpstring);
        return vmpsqlcon;
    }
}

我称之为:

Printing.check();

问题

如您所见,有一个打印声明,

Console.WriteLine(results.Rows[i]["ID"].ToString());

但是我没有在控制台中打印任何内容,但我可以看到数据库中的行,其中PrintTime列为NULL列的数据为{{1}}

问题

我做错了什么?

1 个答案:

答案 0 :(得分:4)

null不是一个值,而是一个标记,指出rdbms不知道该字段中的值;您无法使用'='检查null,因为等于运算符是值。

在你的sql中,你必须使用WHERE PrintTime is null检查null。

请注意,如果将c#DBNull.Value替换为实际值,则“is”运算符将无效。

可以处理null和值的可能解决方法:

SELECT *
FROM   Orders 
WHERE  PrintTime = @printTimeValue
       or (
         @printTimeValue is null 
         and PrintTime is null
       )