插入记录时必须声明标量变量@ID
本文关键字:标量 变量 @ID 声明 记录 插入 | 更新日期: 2023-09-27 17:50:17
我在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 ?
From OleDbCommand.Parameters
:
当
CommandType
设置为Text
1时,OLE DB . net Provider不支持命名参数传递给SQL语句或OleDbCommand
调用的存储过程。在这种情况下,必须使用问号占位符。例如:
SELECT * FROM Customers WHERE CustomerID = ?
所以,对于你的代码,你的查询应该是:
INSERT INTO [Users] ([Username],[Password]) VALUES(?,?) SELECT ? = SCOPE_IDENTITY()
1这是默认的,所以是你的代码所使用的
从你的问题中我可以看出,你已经声明了一个名为query
的变量,并在其中编写了你的查询。此外,你的参数声明似乎是正确的。
现在问题可能在这一行:
myCommand.CommandText = _query;
变量是query
,这里你使用的是_query
。这可能就是为什么没有为特定的查询添加参数,从而导致错误的原因。应该是这样的:
myCommand.CommandText = query;
代替Select Use Set @Id=Scope_Identity()