C# 对象未设置为sql查询中对象的实例,空引用异常

C# 对象未设置为sql查询中对象的实例,空引用异常,c#,sql,C#,Sql,在这种特殊情况下,我得到了空引用异常,我无法解决它 public class Tiket { private Korisnik korisnik; public Korisnik Korisnik { get { if (korisnik == null) { korisnik = new Korisnik(); } return korisnik;

在这种特殊情况下,我得到了空引用异常,我无法解决它

public class Tiket
{
    private Korisnik korisnik;
    public Korisnik Korisnik
    {

        get { if (korisnik == null)
            {
                korisnik = new Korisnik();
            }
            return korisnik; }
        set { korisnik = value; }
    }
}
在表单中,我把插入到文本框中的值发送给处理数据库的方法(它要复杂得多,但我尽量使它简单):

所以在上面,我在给t.Korisnik.Ime赋值时没有得到null引用异常,但在方法内部我得到了一个:

string upit = "SELECT * FROM " + Tiket + " " + " WHERE " + t.Korisnik.Ime;
与此主题相关的额外问题: 我在尝试从数据库向这些字段添加值时遇到了相同的问题,这些字段也是Tiket中的类属性

tikeet.Korisnik.JMBG = red[5].ToString();
tikeet.Radnik.SifraRadnika = Convert.ToInt32(red[6]);
我知道为什么会这样,但我不知道如何初始化Korisnik,Radnik

编辑:我希望这有帮助,所以你可以帮助我! 我有客户端-服务器应用程序,我正在将Tiket发送到服务器..而不是作为OpstiDomenskiObjekat(而不是Tiket)发送到我现在遇到问题的方法

OpstiDomenskiObjekat是一个接口,所以我可以有一个或几个方法来处理许多类似的事情

 public List<OpstiDomenskiObjekat> vratiZaUslovJedanPlus(OpstiDomenskiObjekat odo)
    {

        string upit = "SELECT * FROM " + odo.tabela + " " + " WHERE " + odo.uslovJedan;

        OleDbDataReader citac = null;
        OleDbCommand komanda = new OleDbCommand(upit, konekcija, transakcija);
        try
        {
            citac = komanda.ExecuteReader(); // **here is exception thrown**
            DataTable tabela = new DataTable();
            tabela.Load(citac);
            List<OpstiDomenskiObjekat> lista = new List<OpstiDomenskiObjekat>();
            foreach (DataRow red in tabela.Rows)
            {
                OpstiDomenskiObjekat pom = odo.napuni(red);
                lista.Add(pom);
            }
            return lista;
        }
        catch (Exception ex)
        {
            throw ex;
        }
//这应该发生在方法之后,我将有我需要的列表

List<Tiket> lista = Broker.dajSesiju().vratiZaUslovJedanPlus(odo).OfType<Tiket>().ToList<Tiket>();
        return lista;
List lista=Broker.dajSesiju().vratiZaUslovJedanPlus(odo).OfType().ToList();
返回列表a;

联系、交易等。。这一切都在其他地方,但一切都是有效的,我保证:)

本例中的+运算符是字符串连接运算符。Ticket是类的名称,不清楚是否有同名的属性。如果你有一个叫这个名字的房产

string upit = "SELECT * FROM " + Tiket + " " + " WHERE " + t.Korisnik.Ime;
由于
Tiket
属性为空,上述行可能失败。而且,它的
ToString()
对于查询的FROM子句可能无效

更新

正如你所看到的,它根本没有为我编译。当我写了一个同名的属性。它编译并构造字符串,在票证所在的位置插入一个空字符

第二个屏幕截图显示了如果它是一个属性会发生什么


在这种情况下,您的字符串仍然是构造的,您将在
string upit=“SELECT*FROM”+Tiket++++“WHERE”+t.Korisnik.Ime行得到一个无效的查询这可能导致您的问题。请使用异常抛出位置的屏幕截图进行更新。

您正在以构造查询的方式进行SQL注入。
t.Korisnik=new Korisnik{Ime=txtImeKorisnika.Text}也许?但是:您当前的方法是一个可怕的SQL注入向量@MarcGravel可能是重复的,这只是另一种方法,通过在Tiket内的korisnik属性中添加part if(korisnik==null)等来完成我已经做过的事情。因为我在从textbox获取值时没有得到异常。但后来,在内部查询..但同样的事情。也许你真的给了我解决方案,但我不明白?:)只需设置一个断点&调试,查看“upit”中的哪一行错误和得到的内容,并尝试在SSMS中执行该操作。如果查询中的Tiket之后没有任何内容,则该操作将不起作用。只有类名Tiket。谢谢你的努力。也许附上一张例外情况发生的截图。非常感谢你的巨大努力。真的,我很感激。但请阅读我写给马克·格雷威尔的上述评论。Tiket是数据库中的类和表,它不是空的。若您删除表名后的零件,它将起作用。t、 Ime内部查询是一个问题,因为Korisnik没有初始化。再次感谢你,伙计
List<Tiket> lista = Broker.dajSesiju().vratiZaUslovJedanPlus(odo).OfType<Tiket>().ToList<Tiket>();
        return lista;
string upit = "SELECT * FROM " + Tiket + " " + " WHERE " + t.Korisnik.Ime;