从c#在数据库中输入数据
本文关键字:输入 数据 数据库 | 更新日期: 2023-09-27 18:00:27
我正在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);
}
}
您应该NEVER,EVER通过字符串串接和参数来构建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只是碰巧很出名。
作为一个小问题,虽然不是严格要求的,但我发现包含要插入的列名比按DB列出的任何顺序隐式使用列名更具可读性。但是,如果你绝对确定模式不会改变,那就没有问题了。
您可以从hidden_value和代码端用户请求["hidden_vvalue"]中删除runat="server";以获取hidden_value的值。