我在DB中插入记录,我使用内联查询,我必须获取生成的ID,这就是我这样做的方式
var query = "INSERT INTO [Users] ([Username],[Password]) VALUES(@username,@pwd) SELECT @ID = SCOPE_IDENTITY()";
OleDbParameter[] queryparam = new OleDbParameter[3];
queryparam[0] = new OleDbParameter("@username", OleDbType.VarChar);
queryparam[0].Value = "username";
queryparam[1] = new OleDbParameter("@pwd", OleDbType.VarChar);
queryparam[1].Value = "123456";
queryparam[2] = new OleDbParameter("@ID", OleDbType.Integer);
queryparam[2].Direction = ParameterDirection.Output;
OleDbCommand myCommand = new OleDbCommand();
myCommand.Connection = DBConnectionHelper.getConnection();
myCommand.CommandText = query;
myCommand.Parameters.AddRange(queryparam);
adapter.InsertCommand = myCommand;
myCommand.ExecuteNonQuery();
我收到错误:
必须声明标量变量“@ID”。
必须声明标量变量“@username”。
我也尝试使用(int)myCommand.ExecuteScalar()
,但没有运气。
在这种情况下如何获取生成的ID?
答案 0 :(得分:1)
当
OleDbCommand
设置为Text
时,OLE DB .NET提供程序不支持将参数传递给SQL语句或CommandType
调用的存储过程的命名参数1 。在这种情况下,必须使用问号(?)占位符。例如:
SELECT * FROM Customers WHERE CustomerID = ?
因此,对于您的代码,您的查询应该是:
INSERT INTO [Users] ([Username],[Password]) VALUES(?,?) SELECT ? = SCOPE_IDENTITY()
1 这是默认值,您的代码也是如此。
答案 1 :(得分:0)
根据我的问题,您已经声明了一个名为query
的变量,并在其中编写了您的查询。此外,您的参数声明似乎是正确的。
现在问题可能出在这一行:
myCommand.CommandText = _query;
变量为query
,此处您正在使用_query
。因此,这可能是为什么没有为该特定查询添加参数,从而导致错误。它应该是这样的:
myCommand.CommandText = query;
希望这清楚。
答案 2 :(得分:0)
而不是选择使用Set @ Id = Scope_Identity()