代码之家  ›  专栏  ›  技术社区  ›  P.Brian.Mackey

正在从TableAdapter获取@标识

  •  3
  • P.Brian.Mackey  · 技术社区  · 14 年前

    我正在努力完成一个看似简单的任务,却变成了一次长达数小时的冒险:获得成功 @@Identity TableAdapter.Insert()

    这是我的密码:

    protected void submitBtn_Click(object sender, EventArgs e)
    {
        AssetsDataSetTableAdapters.SitesTableAdapter sta = new AssetsDataSetTableAdapters.SitesTableAdapter();
        int insertedID = sta.Insert(siteTxt.Text,descTxt.Text);
    
        AssetsDataSetTableAdapters.NotesTableAdapter nta = new AssetsDataSetTableAdapters.NotesTableAdapter();
        nta.Insert(notesTxt.Text, insertedID, null,null,null,null,null,null);
        Response.Redirect("~/Default.aspx");
    }
    

    一个 answer 我所要做的就是改变 ExecuteMode . 我试过了。这使得 GetData()

    TableAdapter TypedDataSet.XSD

    生成的insert命令是

    INSERT INTO [dbo].[Sites] ([Name], [Description]) VALUES (@Name, @Description);
    SELECT Id, Name, Description FROM Sites WHERE (Id = SCOPE_IDENTITY())
    

    环境

    SQL Server 2008 R2、Visual Studio 2010、.NET 4、Windows XP,都是本地同一台计算机。

    是什么原因造成的?

    我想澄清一下,我在visualstudio中使用的是自动生成的代码。我不知道生成代码的“工具”是什么,但如果双击*.XSD文件,它将显示SQL表架构和关联TableAdapter的UI。我希望继续使用自动生成的代码,并以某种方式启用获取标识。我不想全部用存储过程手工编写。

    7 回复  |  直到 7 年前
        1
  •  4
  •   Marko    14 年前

    下面是我的SQL代码。

    CREATE PROCEDURE [dbo].[Branch_Insert]
    (
        @UserId uniqueidentifier,
        @OrganisationId int,
        @InsertedID int OUTPUT
    )
    AS
        SET NOCOUNT OFF;
    INSERT INTO [Branch] ([UserId], [OrganisationId]) 
    VALUES (@UserId, @OrganisationId);
    
    SELECT Id, UserId, OrganisationId FROM Branch WHERE (Id = SCOPE_IDENTITY())
    SELECT @InsertedID = SCOPE_IDENTITY()
    

    int? insertedId = 0;
    branchTA.Insert(userId, orgId, ref insertedId);
    

    我不是100%使用ref是否是最好的选择,但这对我来说是可行的。

    祝你好运。

        2
  •  7
  •   Remco    12 年前

    真正的答案是:

    • 请阅读下面的注释!

    我经常收到关于这个问题的问题,但从来没有发现 是时候写下来了。

    类型定义为Identity,插入后需要知道PK值

    使用向导在 查询主体只需在后面的底部添加SELECT SCOPE\u IDENTITY() 保存此查询时,将此查询的ExecuteMode属性从 非查询到标量在您的代码中写入以下内容(ta是TableAdapter 实例):

    int id;
    
    try
    {
     id = Convert.toInt32(ta.InsertQuery(firstName, lastName, description));
    }
    catch (SQLException ex)
    {
    //...
    }
    finally
    {
    //...
    }
    

    用这个赚钱!:)由Drako Sari于2009年3月12日发布

    发件人: http://quickdeveloperstips.blogspot.nl/2009/03/get-identity-from-tableadapter-insert.html

    笔记:

    • 执行模式 标量 可以通过生成的Insert查询的属性执行。(按F4)。

    • 在我的版本(VisualStudio2010 SP1)中,select语句是自动生成的。

        3
  •  3
  •   eselk    11 年前

    所有的信息都在这里,但我没有找到任何一个完整的答案,所以这里是我使用的完整步骤。

    添加一个insert查询,并附加 SELECT SCOPE_IDENTITY() 就像这样:

    INSERT INTO foo(bar) VALUES(@bar);
    SELECT SCOPE_IDENTITY()
    

    确保在VS为您创建的INSERT语句的末尾添加。

    完成“添加查询”向导后,请确保在“设计”视图中选择了该查询,然后将“执行”模式更改为 Scalar 从属性窗格。

    一定要使用转换为32()从代码中调用查询时,如下所示:

    id = Convert.ToInt32( dataTableAdapter.myInsertQuery("bar") )
    

    另外,任何时候修改查询时,都必须将Execute模式重置回 标量 Non Query 每一次。

        4
  •  1
  •   Negative Zero    10 年前

    1. 右键单击表适配器并“添加查询”
    2. 复制并粘贴SQL,它可以是多行的, ,因为它将无法解释多个命令-我的示例显示了一组示例“merge”语句(请注意,新服务器有merge命令)。

      UPDATE YOURTABLE
      SET  YourTable_Column1 = @YourTable_Column1, YourTable_Column2 = @YourTableColumn2
      WHERE (YourTable_ID = @YourTable_ID)
      IF @@ROWCOUNT=0
        INSERT INTO YOURTABLE ([YourTable_Column1], [YourTable_Column2])
        VALUES (@YourTable_Column1, @YourTable_Column2)
      @YourTable_ID = SCOPE_IDENTITY()
      
    3. 从查询属性窗口/侧栏更改/添加@YourTable\u ID参数。在参数集合编辑器中,ID参数需要具有inputooutput的方向,以便在调用表适配器函数时更新该值。 (特别注意:确保您所做的任何列inputooutput设计器没有将此列作为“只读”并且数据类型也匹配,否则请相应地更改datatable中的列或参数信息)

    太棒了哇。您将注意到,这种方法是一种快速执行数据层函数的方法,无需中断SQL过程并编写大量的过程。唯一的问题是,你要跳很多舞。。。

        6
  •  0
  •   Peter Mortensen Absinthe    13 年前

    你有两个选择:

    • 手动更改SQL代码
    • 使用VisualStudio生成的任何内容

    我将使用以下SQL和ExecuteScalar。

    INSERT INTO [dbo].[Sites] ([Name], [Description])
    OUTPUT INSERTED.ID
    VALUES (@Name, @Description);
    
        7
  •  -1
  •   Peter Mortensen Absinthe    13 年前

    一种方法是在insert命令之后运行select查询。一个好方法是将原始命令包装如下:

        public int WrapInsert(Parameters)
        {
            .....
            int RowsAffected = this.Insert(..Parameters..);
            if ( RowsAffected > 0)
            {
                try
                {
                    SqlCommand cm = this.Connection.CreateCommand();
                    cm.CommandText = "SELECT @@IDENTITY";
                    identity = Convert.ToInt32(cm.ExecuteScalar());
                }
                finally
                {
                    ....
                }
            }
            return RowsAffected;
        }