locked
FAQs: 怎样正在ADO.NET中检索身份或自动编号的值? RRS feed

  • 问题

  • 为了帮助大家更好地学习 LINQ to SQL 技术,微软论坛技术支持团队编辑了一些列的 LINQ to SQL 常见问题及解答" 精华帖。

    本帖的主题是:怎样正在ADO.NET中检索身份或自动编号的值?

    如果您觉得这个帖子对您的学习、工作有所帮助,请再把这个帖子分享给你的同学、同事和朋友。

    如果您想阅读更多的 "LINQ to SQL 常见问题及解答",请打开索引页面:

    http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/thread/f968dfe5-f9e3-4ed0-9c7f-cf26837ea828


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年5月3日 9:04

答案

  • 当你用Microsoft SQL Server时,你可以创建一个带有一个输入参数返回一个插入的行的标识值的存储过程,接下来描述了三个在SQL Server中的Transact-SQL函数,可以用于检索标识列的值。

    SCOPE_IDENTITY,返回当前执行的范围内最后一个标识值。SCOPE_IDENTITY在大多数情况下被推荐使用。

     

    @@IDENTITY,包含最后的标识值,此标识值是在当前会话中的任一表中生成的。@@IDENTITY可以通过触发器触发,并且可能不返回你期望的标识值。

     

     IDENT_CURRENT,在任何会话和范围,它返回的是一个特定的表生成的最后一个标识值。

     

    下面的存储过程演示了如何插入一个Categories表的一行,并使用一个输出参数,返回新的由Transact-SQL SCOPE_IDENTITY()函数生成的标识值。

     

    CREATE PROCEDURE dbo.InsertCategory

      @CategoryNamenvarchar(15),

      @Identity int OUT

    AS

    INSERT INTO Categories (CategoryName) VALUES(@CategoryName)

    SET @Identity = SCOPE_IDENTITY()

     

    存储过程可以被指定成一个SqlDataAdapter对象的InsertCommand数据源。InsertCommandCommandType属性必须设置为StoredProcedure标识输出通过创建一个SqlParameter具有输出的ParameterDirection检索的。当将InsertCommand处理,自动递增标识值返回,在当前行的CategoryID列放置如果你设置的INSERT命令的UpdatedRowSource属性UpdateRowSource.OutputParametersUpdateRowSource.Both

    如果您的INSERT命令执行批处理,该项目包括一个INSERT语句和SELECT语句,返回新的标识值,那么你可以通过设置在INSERT命令UpdateRowSource.FirstReturnedRecordUpdatedRowSource属性的新值。

    代码:

            private static void RetrieveIdentity(string connectionString)

            {

                using (SqlConnection connection =

                           newSqlConnection(connectionString))

                {

                    // 创建一个基于SELECT 查询的SqlDataAdapter.

                    SqlDataAdapter adapter =

                        newSqlDataAdapter(

                        "SELECT CategoryID, CategoryName FROM dbo.Categories",

                        connection);

     

                    //创建执行存储过程的SqlCommand.

                    adapter.InsertCommand = new SqlCommand("dbo.InsertCategory",

                        connection);

                    adapter.InsertCommand.CommandType = CommandType.StoredProcedure;

     

                    // CategoryName添加一个参数. 为输入的参数指定

                    // ParameterDirection不是必须的.

                    adapter.InsertCommand.Parameters.Add(

                       newSqlParameter("@CategoryName", SqlDbType.NVarChar, 15,

                       "CategoryName"));

     

                    // 添加SqlParameter来检索新的标识值.

                    // 指定ParameterDirection Output.

                    SqlParameter parameter =

                        adapter.InsertCommand.Parameters.Add(

                        "@Identity", SqlDbType.Int, 0, "CategoryID");

                    parameter.Direction = ParameterDirection.Output;

     

                    // 创建一个DataTable并填充.

                    DataTable categories = new DataTable();

                    adapter.Fill(categories);

     

                    // 添加一个新行.

                    DataRownewRow = categories.NewRow();

                    newRow["CategoryName"] = "New Category";

                    categories.Rows.Add(newRow);

     

                    adapter.Update(categories);

     

                    Console.WriteLine("List All Rows:");

                    foreach (DataRow row in categories.Rows)

                    {

                        {

                            Console.WriteLine("{0}: {1}", row[0], row[1]);

                        }

                    }

                }

            }

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/11709532-4554-4d03-8067-72018c005c0f

    http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/e262d4d7-0dea-4680-b845-bad2e378f15d

    http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年5月3日 9:05