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;