对象引用未设置为对象的实例抛出错误?

时间:2013-06-05 07:17:39

标签: c#

我是c#的初学者。我尝试从更新查询中获取最后插入的id。但我得到一个错误 这是我的代码

String Query1 = "insert into test(userid,score) values ('"+userid+"',0);";
SqlConnection conn1 = new SqlConnection(constring);
SqlCommand cmdDatabase1 = new SqlCommand(Query1, conn1);
SqlDataReader dbreader1;
conn1.Open();
testid = (int)cmdDatabase1.ExecuteScalar();
dbreader1 = cmdDatabase1.ExecuteReader();
while (dbreader1.Read())
{    
}

我收到此错误。

  

对象引用未设置为对象的实例。   在这一行testid =(int)cmdDatabase1.ExecuteScalar();

我也试过这个

String Query1 = "insert into test(userid,score) values ('"+userid+"',0);";
SqlConnection conn1 = new SqlConnection(constring);
SqlCommand cmdDatabase1 = new SqlCommand(Query1, conn1);
SqlDataReader dbreader1;
conn1.Open();
object count = cmdDatabase1.ExecuteScalar();
System.Diagnostics.Trace.WriteLine(count.GetType());
int testid = (int)count;
dbreader1 = cmdDatabase1.ExecuteReader();
while (dbreader1.Read())
{    
}

同样的错误Object reference not set to an instance of an object.在这一行System.Diagnostics.Trace.WriteLine(count.GetType());

4 个答案:

答案 0 :(得分:3)

要从DB获取最后插入的值,您应该编写select查询。

不是此问题的一部分,但使用insertselect时应使用parametrized queries来避免SQLInjections

这是了解更多回合SQLInjections的链接。

你的代码应该是:

try
{
  con.open();
  cmd=new SqlCommand("select max(userid) from test",con);
  da=new SqlDataAdapter(cmd);
  DataSet ds=new DataSet();
  da.fill(ds);
  int lastInsertedId= int.parse(ds.Tables[0].Rows[0][0].toString());
  con.close();
}
catch(exception ex)
{
  messagebox.show(ex.Message);
}

根据您使用的SqlServer,您也可以在SQL中使用不同的技术,例如

@@identity,rownumber over。当然,这可以根据您的需要和您正在使用的SQLServer版本。

RowNumber

@@identity

答案 1 :(得分:2)

使用此代码插入以及选择last inserted id。您的主要问题是“对象引用未设置为对象的实例”。请尝试以下代码。

try
{
    String Query1 = "insert into test(userid,score) OUTPUT INSERTED.userid values ('"+userid+"',0);";
    SqlConnection conn1 = new SqlConnection(constring);
    SqlCommand cmdDatabase1 = new SqlCommand(Query1, conn1);
    conn1.open();
    da=new SqlDataAdapter(cmdDatabase1);
    DataSet ds=new DataSet();
    da.fill(ds);
    int Id= int.parse(ds.Tables[0].Rows[0][0].toString());
    con.close();
}
catch(exception ex)
{
  messagebox.show(ex.Message);
}

答案 2 :(得分:0)

错误发生在哪一行?我在这里猜测:

while (dbreader1.Read())

为什么呢?因为插入查询不会导致任何行...但我想我们必须检查它。

答案 3 :(得分:0)

对于UPDATE,INSERT和DELETE语句,请尝试使用ExecuteNonQuery()