c# - 无法从 Gridview 插入已编辑的数据
问题描述
使用 GridView 我试图通过单击提交按钮将所有记录(包括已编辑的列)插入数据库。但是,它总是插入页面加载后从数据库中获取的初始数据。
我希望用户编辑“id”列,单击提交按钮后,所有记录都应插入表中。使用当前代码,插入正在发生,但是在 id 列中,我总是在 DB 中得到“MG_US-FCWI1.05.30”和“MG_US-FCWI1.05.10”。但我想插入“MG_US-FCWI1”和“MG_US-FCW”。我正在使用VS2013。
使用的代码 -
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="column_name" HeaderText ="Material Name" />
<asp:BoundField DataField="part number" HeaderText ="Material Number" />
<asp:TemplateField HeaderText="Id">
<ItemTemplate>
<asp:TextBox ID="txtedit" runat="server" Text='<%# Eval("id") %>' ReadOnly="false"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="GL_account" HeaderText ="GL Account" />
</Columns>
</asp:GridView>
<asp:Button ID="btnUpload" Text="Submit" runat="server" OnClick="Submit_Data" Height="21px" style="margin-left: 260px; margin-top: 14px;" />
protected void Submit_Data(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
SqlConnection con = new SqlConnection(getConn());
SqlCommand com = new SqlCommand("insert into test ([Sales Order Id],[input data],Material_Name,[Part Number],id,GL_Account) values (" + sales_order_id + "," + input_id + ",'" + row.Cells[0].Text + "','" + row.Cells[1].Text + "','" + ((TextBox)row.Cells[2].FindControl("txtedit")).Text + "','" + row.Cells[3].Text + "')", con);
con.Open();
com.ExecuteNonQuery();
con.Close();
}
}
解决方案
这是一个非常好的示例,说明您为什么不想连接那个长字符串(减少 SQL 注入问题 - 但也允许更容易阅读和更容易编写代码)。
它难以阅读,从而清理它?
然后代码中的错误变得清晰。
你有这个:
((TextBox)row.Cells[2].FindControl("txtedit")).Text
但是,应该是这样的:
((TextBox)row.FindControl("txtedit")).Text
教训:让你的代码可读,你会发现你的错误并更快地发布。
说这样的话:
foreach (GridViewRow row in GridView1.Rows)
{
SqlCommand com = new SqlCommand("insert into test " +
"([Sales Order Id],[input data],Material_Name,[Part Number],id,GL_Account)" +
"(@SalesID,@InputData,@MatName,@PartNum,@id,@GLAccount)",
new SqlConnection(getConn()));
com.Connection.Open();
com.Parameters.Add("@SalesID", SqlDbType.Int).Value = sales_order_id;
com.Parameters.Add("@InputData", SqlDbType.Int).Value = input_id;
com.Parameters.Add("@MatName", SqlDbType.NVarChar).Value = row.Cells[0].Text;
com.Parameters.Add("@PartNum", SqlDbType.Int).Value = row.Cells[1].Text;
com.Parameters.Add("@GlAccount", SqlDbType.NVarChar).Value = ((TextBox)row.FindControl("txtedit")).Text;
com.ExecuteNonQuery();
com.Connection.Close();
}
我认为您不需要在 int 值周围使用 Convert.ToInt32() 。
但是,只需将代码重写为可读性,就很容易发现 findcontrol 错误。另外,请注意我们如何不必猜测我们是否需要在字符串周围加上额外的引号,或者不需要数字 - 所以我们在这里强转换,这也更好。
现在上面是空气代码,但是在我输入第一个参数之后,然后我开始按 ctr-d 复制该行 - 所以我必须做的输入量实际上非常小 - 在 intellisense 和 之间Ctrl-d,然后输入减少了,但是代码不仅更容易阅读,而且我们可以例如随着时间的推移添加另一个行/参数集,并且再次修改此代码将对您的基于碳的计算机(您的大脑)征税,而不是基于计算机的硅大脑.
推荐阅读
- android - 如何将 MaterialButton 文本旁边的图标与定义的填充对齐?
- c# - 从 Asp.Net API 将数据插入二进制(64)列
- javascript - Node js - 同步执行Websocket的对象函数
- regex - 正则表达式 - 任意位数 + 数字或 [az]
- php - php 发布原始数据 - 关注发布 URL
- testing - Robot Framework中的抽象关键字
- ansible - 如何通过--extra-vars将额外变量作为字典列表传递给ansible剧本?
- node.js - 重命名猫鼬中的字段
- scala - Scala反射:我可以看看某物是否是(案例)对象吗?
- animation - Vuetify - 对话框关闭/动画结束处理