【问题标题】:Data is null .This method or property cannot be called on null values [duplicate]数据为空。不能对空值调用此方法或属性[重复]
【发布时间】:2022-01-30 00:20:18
【问题描述】:

我想从我的数据库中检索各种信息。但是在测试我的代码时,我得到了消息:

数据为空。不能对空值调用此方法或属性

我的 dB 中有可以为空的列,我认为这些列导致了问题。请有人帮我解决这个问题。这是我的代码:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using WpfDropDownNavigate.Models;

namespace WpfDropDownNavigate.Business
{
    public class MusteriBusiness
    {
        public static List<Musteriler> MusterileriGetir()
        {
            string sqltrtr = "select * from Customers";
            SqlDataReader reader = Helper.ExecuteReader(sqltrtr, CommandType.Text);
            List<Musteriler> musteriler = new List<Musteriler>();
            while (reader.Read())
            {
                musteriler.Add(new Musteriler
                {
                    MusteriID =reader.GetString(0),
                    FirmaAdi = reader.GetString(1),
                    SorumluKisi = reader.GetString(2),
                    Yetkisi = reader.GetString(3),
                    Adres = reader.GetString(4),
                    Sehir = reader.GetString(5),
                    Ulke = reader.GetString(6),
                    TelefonNo = reader.GetString(7),
                }) ;
            }
            reader.Close();
            return musteriler;
        }

        public static int MusteriGuncelle(string firmaAdi, string sorumluKisi, string yetkisi, string adres, string sehir, string ulke, string telefonNo,string musteriId)
        {
            string sqltrt = string.Format("update Customers set CompanyName='{0}',ContactName='{1}',ContactTitle='{2}',Address='{3}',City='{4}',Country='{5}',Phone='{6}' where CustomerID='{7}'", firmaAdi, sorumluKisi, yetkisi, adres, sehir, ulke, telefonNo, musteriId);
            return Helper.ExecuteNonQuery(sqltrt, CommandType.Text);
        }  
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace WpfDropDownNavigate.Models
{
   public class Musteriler
   {
        public string FirmaAdi { get; set; }
        public string SorumluKisi { get; set; }
        public string Yetkisi { get; set; }
        public string Adres { get; set; }
        public string Sehir { get; set; }
        //public string Bolge { get; set; }
        //public string PostaKodu { get; set; }
        public string Ulke { get; set; }
        public string TelefonNo { get; set; }
        //public string FaxNo { get; set; }

        public string MusteriID { get; set; }
    }
}

【问题讨论】:

  • UPDATE 方法中的 UPDATE 语句容易受到 SQL 注入 (SQLi) 的攻击,这是一个安全漏洞,您应该避免使用参数化查询。查看此网站以获取解释和编码指南,包括 c# Bobby tables
  • SELECT * 是您可能想要避免的,因为如果稍后您向表中添加/删除列,您的reader.GetString(x) 可能无法按预期工作。如果可能的话,我会建议做SELECT column1, column2, etc FROM tableName
  • 我敢打赌,错误消息带有行号(如果您没有看到,请双击错误消息,编辑器将跳转到有问题的行)。当您报告问题时,请包含该信息(不是行号,请附上注释)。请不要让我们猜测

标签: c#


【解决方案1】:

必须对可为空的列进行空值测试。例如。假设Adres 可以为空

Adres = reader.IsDBNull(4) ? null : reader.GetString(4),

这对于在数据库中声明为 NOT NULL 的列不是必需的。

另见:

【讨论】:

  • 如果你在问题中添加一个很棒的 SQLi 警告
猜你喜欢
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多