如何使Sqlcommand接受空值

本文关键字:空值 Sqlcommand 何使 | 更新日期: 2023-09-27 18:11:25

我试图从数据库中获取gridview中的数据,以便在单击后显示在文本框中,并且对于没有空数据的行可以正常工作,尽管由于我的int列有一些空值,我的GetInt32方法一直返回"数据为空"。不能对空值调用此方法或属性。"

是否有一个简单的方法来修复或解决这个问题?我是否用另一种方法替换GetInt32 ?如果可能的话,我想为null的数据在文本框中显示空白/空。这是我的代码,如果你有任何建议,谢谢。

    public ArrayList GetAllPersonnel(int WorkerID) {
        using (var connection = new SqlConnection(connectionString)) {
            connection.Open();
            String query = "Select * FROM Personnel WHERE WorkerID = " + WorkerID;
            using (var command = new SqlCommand(query, connection)) {
                var reader = command.ExecuteReader();
                var list = new ArrayList();
                while (reader.Read()) {
                    String firstname = reader.GetString(1);
                    String lastname = reader.GetString(2);
                    String occupation = reader.GetString(3);
                    String deployment = reader.GetString(4);
                    int disasterid = reader.GetInt32(5);
                    String location = reader.GetString(6);
                    int deployedhours = reader.GetInt32(7);
                    int resthours = reader.GetInt32(8);
                    list.Add(firstname);
                    list.Add(lastname);
                    list.Add(occupation);
                    list.Add(deployment);
                    list.Add(disasterid);
                    list.Add(location);
                    list.Add(deployedhours);
                    list.Add(resthours);
                }
                connection.Close();
                reader.Close();
                return list;
            }
        }
    }

如何使Sqlcommand接受空值

应该使用SqlDataReader的IsDBNull方法

int resthours = (!reader.IsDBNull(8) ? reader.GetInt32(8) : 0);

或者更直接的

list.Add((!reader.IsDBNull(8) ? reader.GetInt32(8).ToString(): string.Empty));

说,我注意到您使用字符串连接来构建sql命令文本以检索记录。请不要那样做。这是非常危险的,可能会导致Sql注入

String query = "Select * FROM Personnel WHERE WorkerID = @wkID";
using (var command = new SqlCommand(query, connection)) 
{
    command.Parameters.AddWithValue("@wkID", WorkerID);
    var reader = command.ExecuteReader();
    ....

好的,所以你实际上是在说你显示的所有东西都应该是string类型,这很好,我只是说明了这一点,因为你说你想要偶数显示为空字符串。那么这段代码呢?

String firstname = reader.GetString(1);
String lastname = reader.GetString(2);
String occupation = reader.GetString(3);
String deployment = reader.GetString(4);
String disasterid = reader.IsDBNull(5) ? string.Empty : reader.GetString(5);
String location = reader.GetString(6);
String deployedhours = reader.IsDBNull(7) ? string.Empty : reader.GetString(7);
String resthours = reader.IsDBNull(8) ? string.Empty : reader.GetString(8);
list.Add(firstname);
list.Add(lastname);
list.Add(occupation);
list.Add(deployment);
list.Add(disasterid);
list.Add(location);
list.Add(deployedhours);
list.Add(resthours);

现在,我之所以说您希望将所有内容都用作字符串是因为int的默认值是0,这将不满足空文本框的要求。

您至少有两种方法来整理这个

  • 修改你的sql选择零或任何你认为合适的空值的地方。这将确保在整型列中始终具有整数值。可以通过以下方式完成

  • select ISNULL (ColumnName, 0) as ColumnName from xxx
  • 始终从读取器获取对象并检查它是否为空。