none
关于INSERT INTO SELECT 的一个问题 RRS feed

  • 问题

  •    有如下的语句,其中“学生编程题答题”表中除了“编程卷”表中的所有列外,还有一列是[UserName],即LOGIN控件上的Username,请问下如何才能让已登录的用户的Username也插入到“学生编程题答题”表呢?

    SqlDataSource4.InsertCommand = "INSERT INTO 学生编程题答题([编程ID],[编程题目],[正确答案],[分值],[试卷编号],[UserName]) SELECT * FROM 编程卷 WHERE [试卷编号] = 1“
            SqlDataSource4.Insert()


    qianghuishi

    2012年4月4日 6:13

答案

  • SqlDataSource4.InsertCommand = "INSERT INTO 学生编程题答题([编程ID],[编程题目],[正确答案],[分值],[试卷编号],[UserName]) values(@id,@title,@correct,@mark,@sid,@uname)“
    
    SqlDataSource4.InsertCommand.Parameters.AddWithValue("@id",dt.Rows(0)(0))
    
    SqlDataSource4.InsertCommand.Parameters.AddWithValue("@title",dt.Rows(0)(1))
    
    ……………………
    
    SqlDataSource4.Insert()

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月5日 3:37
    2012年4月4日 7:37
  • Sorry,请这样变更:

    SqlDataSource4.InsertCommand = "INSERT INTO 学生编程题答题([编程ID],[编程题目],[正确答案],[分值],[试卷编号],[UserName]) VALUES (@ID,@TITLE,@CORRECT,@MARK,@SID,@UNAME)"
            SqlDataSource4.InsertParameters.Add("ID", dt.Rows(0)(0).ToString())
            SqlDataSource4.InsertParameters.Add("TITLE", dt.Rows(0)(1)
    .ToString())
    SqlDataSource4.InsertParameters.Add("CORRECT", dt.Rows(0)(2)
    .ToString())
            SqlDataSource4.InsertParameters.Add("MARK", dt.Rows(0)(3)
    .ToString())
            SqlDataSource4.InsertParameters.Add("SID", dt.Rows(0)(4)
    .ToString())
            SqlDataSource4.InsertParameters.Add("UNAME", Login.UserName)
            SqlDataSource4.Insert()

    注意不要随便插入一个空值(到一个不允许空的地方)。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月5日 3:36
    2012年4月4日 9:19
  • 自己使用了如下方式貌似效果出来了,不知道真的正确吗?

    Dim i As Integer = 0
            Do While i < dt.Rows.Count.ToString
                SqlDataSource4.InsertParameters.Add("ID", dt.Rows(i)(0).ToString)
                SqlDataSource4.InsertParameters.Add("TITLE", dt.Rows(i)(1).ToString)
                SqlDataSource4.InsertParameters.Add("CORRECT", dt.Rows(i)(2).ToString)
                SqlDataSource4.InsertParameters.Add("MARK", dt.Rows(i)(3).ToString)
                SqlDataSource4.InsertParameters.Add("SID", dt.Rows(i)(4).ToString)
                SqlDataSource4.InsertParameters.Add("UNAME", Session("UserName"))
                i += 1
                SqlDataSource4.Insert()
                SqlDataSource4.InsertParameters.Clear()
            Loop


    qianghuishi

    • 已标记为答案 强辉史 2012年4月5日 3:36
    2012年4月5日 0:13

全部回复

  • 你先把Login控件转化成模板状态的形式,然后直接通过Login.UserName形式获取登录名,然后连同其它数据一起插入到学生编程题答题数据库中。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月4日 6:21
  • 有缘人好~但是”学生编程题答题“表中的列比”编程卷“表中的列多一列,如何让Login.UserName插入进这多出来的一列呢?

    qianghuishi

    2012年4月4日 6:42
  • 有缘人好~但是”学生编程题答题“表中的列比”编程卷“表中的列多一列,如何让Login.UserName插入进这多出来的一列呢?

    qianghuishi

    1)先用 SELECT * FROM 编程卷 WHERE [试卷编号] = 1语句读取全部数据保存到DataTable中。

    2)然后再结合Login.UserName,结合以上数据,使用Parameter进行拼接。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月4日 6:48
  • 没使用过DataTable...不知道具体怎么写...哎...

    qianghuishi

    2012年4月4日 6:53
  • 没使用过DataTable...不知道具体怎么写...哎...

    qianghuishi

    using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM 编程卷 WHERE [试卷编号] = 1",new SqlConnection("……"))
    {
       DataTable dt = new DataTable();
       adapter.Fill(dt);
    
       SqlCommand cmd = new SqlCommand("insert语句结合dt.Rows[0][索引]拼接",new SqlConnection("…………"));
       cmd.Connection.Open();
       cmd.ExecuteNonQuery();
    cmd.Connection.Close();
    cmd.Dispose(); }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月4日 7:02
  • 这是自己根据有缘人你的指示写的:

    Dim myconnection1 As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;Integrated Security=True;User Instance=True")
            Dim cmd1 As New SqlCommand("SELECT MAX(试卷编号)FROM 编程卷", myconnection1)
            cmd1.Connection.Open()
            Dim result1 As Integer = cmd1.ExecuteScalar()
            cmd1.Connection.Close()


            Dim Rnumber1 = Int(Rnd() * result1) + 1

    Dim adapter As New SqlDataAdapter("SELECT * FROM 编程卷 WHERE [试卷编号] = " & Rnumber1, WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
            Dim dt As New DataTable()
            adapter.Fill(dt)

    Dim cmd As New SqlCommand("???")

     SqlDataSource4.ConnectionString = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString

     SqlDataSource4.SelectCommand = "SELECT * FROM 学生编程题答题"
            GridView4.DataSourceID = SqlDataSource4.ID

    大问号处自己真不知该怎么写了...


    qianghuishi

    2012年4月4日 7:25
  • SqlDataSource4.InsertCommand = "INSERT INTO 学生编程题答题([编程ID],[编程题目],[正确答案],[分值],[试卷编号],[UserName]) values(@id,@title,@correct,@mark,@sid,@uname)“
    
    SqlDataSource4.InsertCommand.Parameters.AddWithValue("@id",dt.Rows(0)(0))
    
    SqlDataSource4.InsertCommand.Parameters.AddWithValue("@title",dt.Rows(0)(1))
    
    ……………………
    
    SqlDataSource4.Insert()

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月5日 3:37
    2012年4月4日 7:37
  • 太不好意思了...

    Dim adapter As New SqlDataAdapter("SELECT * FROM 编程卷 WHERE [试卷编号] = " & Rnumber1, WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
            Dim dt As New DataTable()
            adapter.Fill(dt)


            SqlDataSource4.ConnectionString = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
         SqlDataSource4.InsertCommand = "INSERT INTO 学生编程题答题([编程ID],[编程题目],[正确答案],[分值],[试卷编号],[UserName]) VALUES (@ID,@TITLE,@CORRECT,@MARK,@SID,@UNAME)"
            SqlDataSource4.InsertParameters.Add("@ID", dt.Rows(0)(0))
            SqlDataSource4.InsertParameters.Add("@TITLE", dt.Rows(0)(1))
            SqlDataSource4.InsertParameters.Add("@CORRECT", dt.Rows(0)(2))
            SqlDataSource4.InsertParameters.Add("@MARK", dt.Rows(0)(3))
            SqlDataSource4.InsertParameters.Add("@SID", dt.Rows(0)(4))
            SqlDataSource4.InsertParameters.Add("@UNAME", "Login.Username")
            SqlDataSource4.Insert()


            SqlDataSource4.SelectCommand = "SELECT * FROM 学生编程题答题"
            GridView4.DataSourceID = SqlDataSource4.ID

    第一个错误提示是Login.username找不到

    第二个错误是由于[正确答案]这一列之前就是空列,没有任何值,所以插入是报错了

    第三个错误是要让我们声明变量@ID,不知道怎么回事...

    哎...太抱歉了


    qianghuishi

    2012年4月4日 8:06
  • Sorry,请这样变更:

    SqlDataSource4.InsertCommand = "INSERT INTO 学生编程题答题([编程ID],[编程题目],[正确答案],[分值],[试卷编号],[UserName]) VALUES (@ID,@TITLE,@CORRECT,@MARK,@SID,@UNAME)"
            SqlDataSource4.InsertParameters.Add("ID", dt.Rows(0)(0).ToString())
            SqlDataSource4.InsertParameters.Add("TITLE", dt.Rows(0)(1)
    .ToString())
    SqlDataSource4.InsertParameters.Add("CORRECT", dt.Rows(0)(2)
    .ToString())
            SqlDataSource4.InsertParameters.Add("MARK", dt.Rows(0)(3)
    .ToString())
            SqlDataSource4.InsertParameters.Add("SID", dt.Rows(0)(4)
    .ToString())
            SqlDataSource4.InsertParameters.Add("UNAME", Login.UserName)
            SqlDataSource4.Insert()

    注意不要随便插入一个空值(到一个不允许空的地方)。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 强辉史 2012年4月5日 3:36
    2012年4月4日 9:19
  • 我也非常不好意思,之前以为你已经下线了就自己去琢磨了,现在自己使用了有缘人你的改正后,发现:

    第一:"登录.ASPX"的login中的USERNAME并不能被"试卷.ASPX"所使用,所以Login.UserName始终是错误的...

    第二:是自己在随便换了Login.UserName之后,发现在GridView4中显示的只有一行数据,而不是全部的数据...


    qianghuishi

    2012年4月4日 13:47
  • 自己使用了如下方式貌似效果出来了,不知道真的正确吗?

    Dim i As Integer = 0
            Do While i < dt.Rows.Count.ToString
                SqlDataSource4.InsertParameters.Add("ID", dt.Rows(i)(0).ToString)
                SqlDataSource4.InsertParameters.Add("TITLE", dt.Rows(i)(1).ToString)
                SqlDataSource4.InsertParameters.Add("CORRECT", dt.Rows(i)(2).ToString)
                SqlDataSource4.InsertParameters.Add("MARK", dt.Rows(i)(3).ToString)
                SqlDataSource4.InsertParameters.Add("SID", dt.Rows(i)(4).ToString)
                SqlDataSource4.InsertParameters.Add("UNAME", Session("UserName"))
                i += 1
                SqlDataSource4.Insert()
                SqlDataSource4.InsertParameters.Clear()
            Loop


    qianghuishi

    • 已标记为答案 强辉史 2012年4月5日 3:36
    2012年4月5日 0:13
  • 对的,只要你验证可以就OK了。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月5日 1:29
  • 还想问下有缘人另外一个问题,虽然没有重新开窗口...

    如果现在要对“学生编程题答题”表中的[学生答案]列可以实行Edit的功能,即学生可以在上面把答案填入进去,并进行update,这个会麻烦吗?


    qianghuishi

    2012年4月5日 5:40
  • 还想问下有缘人另外一个问题,虽然没有重新开窗口...

    如果现在要对“学生编程题答题”表中的[学生答案]列可以实行Edit的功能,即学生可以在上面把答案填入进去,并进行update,这个会麻烦吗?


    qianghuishi

    最好你列出你详细思路,另外开一个帖子给你解答。写详细一点。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月5日 5:50