插入记录时必须声明标量可变的@ID

时间:2015-05-21 08:45:21

标签: c# oledb

我在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?

3 个答案:

答案 0 :(得分:1)

来自OleDbCommand.Parameters

  

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()