2

我是 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

4 回答 4

3

对于从数据库获取最后插入的值,您应该编写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 版本而定。

对于行号

对于@@identity

于 2013-06-05T07:26:26.197 回答
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);
}
于 2013-06-05T07:45:47.933 回答
0

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

while (dbreader1.Read())

为什么?因为插入查询不会产生任何行......但我想我们必须检查一下。

于 2013-06-05T07:23:43.557 回答
0

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

于 2013-06-05T07:36:50.740 回答