插入记录时必须声明标量变量@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 ?

插入记录时必须声明标量变量@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()