ASP.NET擷取自增長列(識別欄位)的ID

來源:互聯網
上載者:User

來源:http://www.study-code.com/dotnet/aspnet/67500.htm

 

問題
疑惑:如何擷取自增長列(識別欄位)的ID,並寫入另一張表。

關係圖

實現要點
1, 如何擷取新插入記錄產生的 ID:Sql Server 和 Access(當使用 Jet ADO,當然包括ADO.NET,串連時)均支援 @@Identity 全域變數,返回在當前會話的所有表中產生的最後一個標識值
2,同時寫入多張表需要顯示使用事務

MS Access 版本

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    string connStr;

    protected void Page_Load(object sender, EventArgs e)
    {
        connStr = "provider=Microsoft.Jet.OleDb.4.0;data source=" + Server.MapPath("~/App_Data/DemoManyToMany.mdb");
    }
   
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        if (chkRoles.SelectedIndex == -1) throw new Exception("至少選擇一個角色。");       
       
        string sqlInserUser = "INSERT INTO [User]([UserName], [Password]) VALUES(?, ?)";
        string sqlInserUserRoel = "INSERT INTO UserRole([UserId], [RoleId]) VALUES(?, ?)";
        string sqlSelectNewUserId = "SELECT @@Identity"; // OR "SELECT MAX([UserId]) FROM [User]";
        using (OleDbConnection conn = new OleDbConnection(connStr)) {           
            conn.Open();
            // 顯示開啟事務
            OleDbTransaction trans = conn.BeginTransaction();           
            OleDbCommand cmd = conn.CreateCommand();
            // 關聯事務
            cmd.Transaction = trans;          
           
            try {
                cmd.CommandText = sqlInserUser;
                cmd.Parameters.Add("UserName", txtUserName.Text);
                cmd.Parameters.Add("Password", txtPassword.Text);
                // 插入 User
                cmd.ExecuteNonQuery();                              

                cmd.CommandText = sqlSelectNewUserId;
                // 讀取新插入 UserId
                int newUserId = (int)cmd.ExecuteScalar();

                // 僅供測試
                if (chkGeneratError.Checked) throw new Exception("建立使用者時發生錯誤。");

                cmd.CommandText = sqlInserUserRoel;
                cmd.Parameters.Clear();
                cmd.Parameters.Add("UserId", OleDbType.Integer);
                cmd.Parameters.Add("RoleId", OleDbType.Integer);
                cmd.Parameters[0].Value = newUserId;
                // 遍曆可選角色列表
                foreach (ListItem item in chkRoles.Items) {
                    if (item.Selected) {
                        cmd.Parameters[1].Value = item.Value;
                        // 寫入中間關係表 UserRole
                        cmd.ExecuteNonQuery();
                    }
                }
                // 提交事務
                trans.Commit();
                lblMsg.Text = String.Format("使用者 '{0}' 建立成功。\n事務已提交。", txtUserName.Text);                            
            }
            catch(Exception inner) {
                // 發生錯誤,復原事務
                if (trans != null) trans.Rollback();
                lblMsg.Text = String.Format("使用者 '{0}' 建立失敗。\n事務已復原。\n詳細資料:{1}", txtUserName.Text, inner.Message);
                //throw new Exception("建立使用者失敗。事務已復原。", inner);
            }                       
        }
        // 重新載入 User 資料
        grdvUsers.DataBind();
    }

    protected void grdvUsers_RowDataBound(object sender, GridViewRowEventArgs e)
    {       
        // 載入每個 User 對應的 Roles
        DataList dlstRolesOfUser = e.Row.FindControl("dlstRolesOfUser") as DataList;
        if(dlstRolesOfUser == null) return;
       
        int userId = (int)grdvUsers.DataKeys[e.Row.RowIndex].Value;
       
        string sqlSelectRoleOfUser =
            "SELECT Role.RoleName FROM (Role INNER JOIN UserRole ON Role.RoleId = UserRole.RoleId) WHERE UserRole.UserId=?";
        OleDbDataAdapter da = new OleDbDataAdapter(sqlSelectRoleOfUser, connStr);
        da.SelectCommand.Parameters.Add("UserId", userId);
        DataTable dtRolesOfUser = new DataTable();
        da.Fill(dtRolesOfUser);
        dlstRolesOfUser.DataSource = dtRolesOfUser;
        dlstRolesOfUser.DataBind();       
    }
   
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>多對多寫入執行個體——Access版本</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>      
        <h1>多對多寫入執行個體——Access版本</h1>
        <h3>建立使用者</h3>
        <table border="1">
            <tr>
                <td>
                    使用者名稱:
                </td>
                <td>
                    <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtUserName"
                        Display="Dynamic" ErrorMessage="Required"></asp:RequiredFieldValidator></td>
            </tr>
            <tr>
                <td>
                    密碼:
                </td>
                <td>
                    <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                <td>
                    角色:
                </td>
                <td>
                    <asp:CheckBoxList ID="chkRoles" runat="server" DataSourceID="AccessDataSource1" DataTextField="RoleName" DataValueField="RoleId" RepeatDirection="Horizontal"></asp:CheckBoxList><asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/App_Data/DemoManyToMany.mdb"
                        SelectCommand="SELECT [RoleId], [RoleName] FROM [Role]"></asp:AccessDataSource>
                </td>
            </tr>
            <tr>
                <td>
                    強制發生錯誤:
                </td>
                <td>
                    <asp:CheckBox ID="chkGeneratError" runat="server" /></td>
            </tr>
            <tr>
                <td>
                </td>
                <td>
        <asp:Button ID="btnLogin" runat="server" Text="確定" OnClick="btnLogin_Click" /></td>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.