2

我在 javascript 的变量中存储一个值。比我创建了一个隐藏标签,以便从代码隐藏中访问变量并将其存储在数据库中。但是由于某种原因, cmd.ExecuteNonQuery();它在尝试在数据库中输入数据时给了我以下错误:

ERROR: 42601: syntax error at end of input

下面是asp中的输入标签:

    <div>
        <input id="hidden_value" type="hidden" runat="server"/>
         <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

    </div>

以下是我如何在 javascript 中调用隐藏输入并将其设置为一个值:

var store_altitude;
store_altitude = some_value;
document.getElementById("hidden_value").value=store_altitude;

以下是代码隐藏:

 using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
            {
                try
                {
                    conn.Open();
                    Response.Write(hidden_value.Value);
                    NpgsqlCommand cmd = new NpgsqlCommand("insert into altitude select nextval('altitude_id_seq'),"+hidden_value.Value, conn);
                    cmd.ExecuteNonQuery();


                    conn.Close();
                }
                catch (Exception)
                {
                    ClientScript.RegisterStartupScript(this.GetType(), "", "$(document).ready(function(){alert('problem with connection')});", true);
                }
            }
4

2 回答 2

1

永远不应该通过字符串连接和参数来构建 sql。它很慢,容易出错,而且你已经向 SQL 注入敞开了大门。在您的情况下,看起来任何网络黑客都可以轻而易举地获得对您数据库的完全访问权限

由于您正在编写原始 sql 而不是使用 ORM,因此不幸的是,您面临着 ADO.NET 的 API 非常糟糕的事实。我强烈建议使用类似dapper的东西,这样可以大致如下表达您的查询:

conn.Execute(@"
    insert into altitude
    values (extval('altitude_id_seq'), @hiddenVal)",
       new { hiddenVal = hidden_value.Value});

还有其他轻量级的 ADO.NET 包装器;很多都很好,dapper恰好是众所周知的。

作为一个小问题,虽然不是严格要求,但我发现包含您要插入的列名而不是按照数据库列出的任何顺序隐式使用它们更具可读性。但是,如果您绝对确定架构不会更改,那么就没有问题。

于 2013-02-22T10:32:02.357 回答
0

您可以从 hidden_​​value 和代码端用户 request["hidden_​​value"] 中删除 runat="server"; 获取 hidden_​​value 的值。

于 2013-02-22T10:29:01.477 回答