我是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());
答案 0 :(得分:3)
要从DB获取最后插入的值,您应该编写select
查询。
不是此问题的一部分,但使用insert
或select
时应使用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版本。
答案 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()