【问题标题】:Query string to call up row data from SCOPE_IDENTITY从 SCOPE_IDENTITY 调用行数据的查询字符串
【发布时间】:2011-04-19 17:29:54
【问题描述】:

我有一个供用户输入数据的提交页面。然后我重定向到一个查看页面,这样他们就可以查看他们的输入。会话结束,因为这将是一个大容量站点,但我在提交命令的末尾使用了范围标识方法。如何查询范围 ID 值,以便在我的视图页面中显示行数据?

代码如下:这是一个培训项目,为了简单起见,我被明确禁止参数化。但是,是的,我知道参数化是要走的路。

protected void Button1_Click(object sender, EventArgs e)
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    String thisQuery = "INSERT INTO ProductInstance (CustId, CustName, SicNaic, CustAdd, CustCity, CustState, CustZip, BroId, BroName, BroAdd, BroCity, BroState, BroZip, EntityType, Coverage, CurrentCoverage, PrimEx, Retention, EffectiveDate, Commission, Premium, Comments) VALUES ('" + TextBox19.Text + "', '" + TextBox1.Text + "', '" + RadioButtonList1.SelectedItem + "', '" + TextBox2.Text + "', '" + TextBox3.Text + "', '" + DropDownList1.SelectedItem + "', '" + TextBox4.Text + "', '" + TextBox18.Text + "', '" + TextBox5.Text + "', '" + TextBox6.Text + "', '" + TextBox7.Text + "', '" + DropDownList2.SelectedItem + "', '" + TextBox8.Text + "', '" + DropDownList3.SelectedItem + "','" + TextBox9.Text + "','" + TextBox10.Text + "','" + TextBox11.Text + "','" + TextBox12.Text + "','" + TextBox20.Text + "','" + TextBox14.Text + "','" + TextBox15.Text + "','" + TextBox16.Text + "'); SELECT SCOPE_IDENTITY() AS [lastInsertedProductId]";

    using (SqlConnection sqlConn = new SqlConnection(connectionString))
    {
        sqlConn.Open();

        using (SqlCommand command = new SqlCommand(thisQuery, sqlConn))
        {
            int lastInsertedProductId = Convert.ToInt32(command.ExecuteScalar());
        }
    }
    Response.Redirect("~/View.aspx");

然后查看页面代码在这里:

protected void Page_Load(object sender, EventArgs e)
{
    string x = Request.QueryString["ProductId"];
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    string editQuery = "SELECT CustId, CustName, SicNaic, CustCity, CustAdd, CustState, CustZip, BroName, BroId, BroAdd, BroCity, BroState, BroZip, EntityType, Coverage, CurrentCoverage, PrimEx, Retention, EffectiveDate, Commission, Premium, Comments FROM ProductInstance WHERE ProductId =" + x;

    using (SqlConnection editConn = new SqlConnection(connectionString))
    {
        editConn.Open();

        using (SqlCommand command = new SqlCommand(editQuery, editConn))
        {
            SqlDataReader dr = command.ExecuteReader();
            dr.Read();
            Label6.Text = dr.GetInt32(0).ToString();

【问题讨论】:

  • 哈哈哈是的,是的,我已经阅读了这篇文章,并且在我的所有问题中都提到了它或类似的东西。该站点不适用于实际部署,正如我在问题中提到的,我的培训师明确禁止我进行参数化,因为他希望我在完成这个项目的同时专注于理解基础知识。不过,我真的很感激每个人都跳出来指出这一点。它显示了真正的善意。
  • 您应该考虑查看 ORM,例如 EF 或 NHibernate。
  • 我无法理解“为简单起见禁止参数化”和“这将是一个高容量站点”。如果您的培训师实际上试图提供好的建议,但 BASIC 的安全性和性能却被忽略了,并且将演示者的担忧和数据访问混为一谈,那么恐怕您将不得不在其他地方获得知识。如果有使用字符串连接的实际原因,那么您必须至少删除用户输入字符串

标签: c# asp.net sql-server visual-studio


【解决方案1】:

尝试在范围内向上移动lastInsertedProductId

Response.Redirect("~/View.aspx?ProductId" + lastInsertedProductId );

但是说真的,请查看参数化语句和http://bobby-tables.com/

【讨论】:

  • 哈哈,我真的很喜欢鲍比桌。这是我第一次听说sql注入,关于它我读过很多。我不需要在 lastInsertProductId 周围加上引号吗? VS 拼写检查并告诉我我无法将 int 转换为字符串,并且在重定向行中它告诉我它在当前上下文中不存在。
  • 尝试将lastInsertedProductId 的声明移到using 声明之前。
【解决方案2】:

您将创建一个 stored procedure 来完成这项工作,并在其中获得 SCOPE_IDENTITY

插入之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多