【问题标题】:How to make Sqlcommand accept null values如何让 Sqlcommand 接受空值
【发布时间】:2013-04-29 13:04:14
【问题描述】:

我正在尝试从数据库中获取 gridview 中的数据,以便在单击时显示在文本框中,并且它适用于没有空数据的行,尽管由于我的 int 列有一些空值,我的 GetInt32 方法不断返回“数据为 Null。无法对 Null 值调用此方法或属性。”

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

    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;
            }
        }
    }

【问题讨论】:

  • 欢迎来到 Stack Overflow,未来的我。

标签: c# sqlcommand


【解决方案1】:

你应该使用 SqlDataReader 的IsDBNull 方法

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

或者,更直接的

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

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

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

【讨论】:

  • 感谢您的快速回复!我修复了字符串连接,这没有问题,尽管当我用这些行替换 'int rest hours' 和 list.add(resthours) 时,我得到 Argument 1: cannot convert from 'int' to 'string'。有什么我想念的吗?
【解决方案2】:

好的,所以您实际上是在说您显示的所有内容都应该是 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,这不符合空文本框的要求。

【讨论】:

  • 是的,我想这就是我的目标,但现在我遇到了无法将“System.Int32”类型的对象转换为“System.String”错误。你知道我要解决什么吗?谢谢
  • @NickV,在哪一行?当时reader中的字段值是多少?因为我们可以走不同的路线。
  • @NickV,太棒了!随意编辑答案并使用您的更改更新代码。
【解决方案3】:

你至少有两种方法可以解决这个问题

  • 修改您的 sql 以选择零或任何您认为合适的值来代替空值。这将确保您在整数列中始终有一个整数值。可以通过以下方式完成

    从 xxx 中选择 ISNULL ( ColumnName , 0 ) 作为 ColumnName

  • 始终从阅读器获取对象并检查它是否为空。如果为空,则将其替换为合适的值。

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多