【问题标题】:insert into multiple tables without knowing the primary key在不知道主键的情况下插入多个表
【发布时间】:2011-07-29 06:41:07
【问题描述】:

大家好,这里有点复杂,我有一个创建帐户页面,它只是将数据插入到 mysql 数据库中:

    protected void Button1_Click(object sender, EventArgs e)
    {
        OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite2; User=root; Password=commando;");
        cn.Open();
        OdbcCommand cmd = new OdbcCommand("INSERT INTO User (Email, FirstName, SecondName, DOB, Location, Aboutme, username, password) VALUES ('" + TextBox1.Text + "', '" + TextBox2.Text + "', '" + TextBox3.Text + "', '" + TextBox4.Text + "', '" + TextBox5.Text + "', '" + TextBox6.Text + "', '" + TextBox7.Text + "', '" + TextBox8.Text + "')", cn);

        cmd.ExecuteNonQuery();
        {
            //e.Authenticated = true;
            Response.Redirect("Login.aspx");
            // Event useradded is true forward to login
        }
    }

}

但这是我在创建帐户页面上的问题,我添加了一个文件上传控件,我想上传一张图片并将图片网址保存在图片表中:

            string filenameDB = Path.GetFileName(FileUploadControl.FileName);
            string fileuploadpath = Server.MapPath("~/userdata/" + theUserId + "/uploadedimage/") + Path.GetFileName(FileUploadControl.FileName);
            FileUploadControl.SaveAs(fileuploadpath);
            string fileuploadpaths = ("~/userdata/" + theUserId + "/uploadedimage/") + filenameDB;
            StatusLabel.Text = "Upload status: File uploaded!";


            OdbcCommand cmd = new OdbcCommand("INSERT INTO Pictures VALUES picturepath ='" + fileuploadpaths + "' WHERE UserId = '" + theuserid + "'", cn);
            cmd.ExecuteNonQuery();

第一个问题是 sql 语法,我需要将 fileupload 与我的 buttonclick 结合起来,因此它是 INSERT INTO 两个表 User 和 Pictures,但之后的问题是,如果尚未创建帐户,我究竟如何获得用户 ID ?啊哈哈哈哈哈

表结构:

所以总结一下,我需要将用户详细信息插入用户表并上传到项目文件,并将 imageUrl 插入图片表(像 ~/userdata/2/uploadedimages/bla.jpg 一样存储)可以看到图片表与用户表是 1-1 关系,因此它依赖于创建帐户的用户 ID 没有用户 ID,因此不确定是否有办法错开代码,因此首先插入用户详细信息然后使用会话检索该用户 ID,然后将 imageurl 插入到图片表中?

或者也许有一些聪明的人已经发现了这个问题的一些时髦的功能,或者它只是一个简单的 sql 语法分解器。

P.S 我知道 SQL 注入风险,请不要发布关于此的信息。谢谢大家!

编辑:

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (FileUpload1.HasFile)
        {
            try
            {
                OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite2; User=root; Password=commando;");
cn.Open();

                OdbcCommand cmd = new OdbcCommand("INSERT INTO User (Email, FirstName, SecondName, DOB, Location, Aboutme, username, password) VALUES ('" + TextBox1.Text + "', '" + TextBox2.Text + "', '" + TextBox3.Text + "', '" + TextBox4.Text + "', '" + TextBox5.Text + "', '" + TextBox6.Text + "', '" + TextBox7.Text + "', '" + TextBox8.Text + "')", cn);
                OdbcCommand sc = new OdbcCommand("SELECT LAST_INSERT_ID()", cn);
                //convert LAST INSERT into string theUserId

                string filenameDB = Path.GetFileName(FileUpload1.FileName);
                string fileuploadpath = Server.MapPath("~/userdata/" + theUserId + "/uploadedimage/") + Path.GetFileName(FileUpload1.FileName);
                FileUpload1.SaveAs(fileuploadpath);
                string fileuploadpaths = ("~/userdata/" + theUserId + "/uploadedimage/") + filenameDB;
                Label10.Text = "Upload status: File uploaded!";
                OdbcCommand cm = new OdbcCommand("INSERT INTO Pictures (picturepath, UserId) VALUES ('" + fileuploadpaths + "', " + theUserId + ")", cn);

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Label10.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message;

            }
            //e.Authenticated = true;
            //Response.Redirect("Login.aspx");
            // Event useradded is true forward to login
        }
    }
}

【问题讨论】:

    标签: c# asp.net mysql sql html


    【解决方案1】:

    您需要从用户插入中返回新的用户 ID。来自 mysql 自动增量文档:

    您可以检索最新的 AUTO_INCREMENT 值与 LAST_INSERT_ID() SQL 函数或 mysql_insert_id() C API 函数。 这些功能是 连接特定的,所以他们的回报 值不受另一个影响 也在执行的连接 插入。

    无论如何,您需要存储此返回并将其传递给相关操作。

    【讨论】:

      【解决方案2】:

      我看不到您的表结构,但它是否像插入 User 表、检索 UserID、保留 UserID 一样简单(可能通过查询字符串传递到上传页面,或使用会话等),然后在图片表中使用该 UserID 插入? Here's documentation on how to get the unique ID from an inserted row in MySQL.

      【讨论】:

        【解决方案3】:

        如果图片和用户是1:1的,可以把图片路径放在user表中吗?

        如果没有,MySQL 有一个 last_insert_id() 函数,允许您从表(在本例中为用户)中获取最后一个自增值 - 通常是主键。

        【讨论】:

        • 不,我不能将它们放入用户表中,如何使用 last_insert 方法将我的插入组合到用户表和图片表中,一键单击?
        • 如果先进行用户插入,则在进行图片插入之前获取最后一个插入id。 SELECT LAST_INSERT_ID() 确保在与插入相同的数据库连接中运行它。
        • so SELECT LAST_INSERT_ID() FROM User 还是 SELECT LAST_USERID() FROM User?
        • 您不需要指定表格。就SELECT LAST_INSERT_ID()
        猜你喜欢
        • 2018-12-11
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 2020-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        相关资源
        最近更新 更多