对象引用未设置为对象的实例,无法找出原因
本文关键字:实例 设置 对象 对象引用 | 更新日期: 2023-09-27 18:30:29
我对c#和 asp.net 很陌生,所以请告诉我我是否给我的问题提供很少的信息。
当用户登录时,我创建我的 User 对象的实例,调用我的 getcategory 方法,然后将用户重定向到另一个页面。喜欢这个:
if (dt.Rows.Count > 0){
user apa = new user();
apa.namn = dt.Rows[0]["FirstName"].ToString() + " " + dt.Rows[0]["LastName"].ToString();
apa.mail = dt.Rows[0]["Email"].ToString();
apa.id = dt.Rows[0]["ID"].ToString();
apa.firstname = dt.Rows[0]["FirstName"].ToString();
apa.lastnamn = dt.Rows[0]["LastName"].ToString();
apa.password = dt.Rows[0]["Password"].ToString();
Session["user"] = apa;
apa.getcategories();
Response.Redirect("visainlagg.aspx");
}
问题是我在"kategorier[i]"上收到"对象引用未设置为对象的实例"错误。名称 = dt。行[i]["名称"]。ToString();"(在用户类的 for 循环中发生的第一件事)。我不明白为什么:(
下面是 User 类的样子:
public string namn;
public string mail;
public string id;
public string firstname;
public string lastname;
public string password;
public string constr = "secret";
public Post[] poster;
public anvcateg[] kategorier;
public int antalKategorier;
public void getcategories() {
SqlConnection conn = new SqlConnection();
conn.ConnectionString = constr;
SqlCommand com = new SqlCommand();
com.Connection = conn;
com.CommandText = "SELECT * FROM Category WHERE Author= '" + id + "'";
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = com;
DataTable dt = new DataTable();
adp.Fill(dt);
antalKategorier = dt.Rows.Count;
kategorier = new anvcateg[dt.Rows.Count];
for (int i = 0; i < dt.Rows.Count; i++)
{
kategorier[i].Name = dt.Rows[i]["Name"].ToString();
kategorier[i].ID = dt.Rows[i]["ID"].ToString();
kategorier[i].Description = dt.Rows[i]["Description"].ToString();
kategorier[i].Author = dt.Rows[i]["Author"].ToString();
}
}
getCategories() 使用的 anvcateg 类如下所示:
public class anvcateg
{
public string ID;
public string Name;
public string Description;
public string Author;
> kategorier 是 anvcateg 的数组
您在此处初始化了数组:
kategorier = new anvcateg[dt.Rows.Count];
但是你必须创建一个 anvcateg 的实例来添加到你的数组中)
for (int i = 0; i < dt.Rows.Count; i++)
{
kategorier[i] = new anvcateg()
{
ID = dt.Rows[i]["ID"].ToString(),
Author = dt.Rows[i]["Author"].ToString(),
Description = dt.Rows[i]["Description"].ToString(),
Name = dt.Rows[i]["Name"].ToString()
};
}
您的数组包含所有空值 - 您尚未创建任何对象。您创建了一个空数组。快速解决方法是:
kategorier[i] = new anvcateg();
在每次迭代开始时。
有关信息,您当前的代码存在风险(SQL 注入),不会自行清理,并且不必要地复杂。这是通过"dapper"相同的:
using(var conn = new SqlConnection(constr)) {
conn.Open();
var data = conn.Query<anvcateg>(
"SELECT * FROM Category WHERE Author=@id",
new { id }).ToList();
}
(或ToArray()如果你愿意的话)
这会在内部完成所有映射,清理连接,并安全地参数化"id",避免注入攻击。并且看不到数据表。
你的问题不是很清楚,试着找到代码"kategorier[i].名称 = dt。行[i]["名称"]。ToString();",但找不到它。如果您可以发布包含这些行的代码,那么很容易回答您。
无论如何,此错误可能有以下原因:
-
要么 dt。行 [i]["名称"] 为 null,您正在尝试使用 将其转换为字符串。ToString(),将其更改为 Convert.ToString(dt.行[i]["名称"])
-
检查您是否已将"kategorier"定义为数组,或者您可以使用 List kategorier = new list kategoriers();
否则你的代码看起来很好