如何通过GridView向数据库提交数据?
1.在GridView 中如何插入其他类型控件时,通过<Itemtemplate>插入TextBox服务器控件
<asp:TemplateField HeaderText="平时成绩" SortExpression="Usual"> <ItemTemplate> <asp:TextBox ID="TextUsual" runat="server" Width="60px" ></asp:TextBox> </ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:TemplateField HeaderText="期末成绩" SortExpression="Final"> <ItemTemplate > <asp:TextBox ID="TextFinal" runat="server" Width="60px"></asp:TextBox> </ItemTemplate> <ItemStyle HorizontalAlign="Center" /> </asp:TemplateField>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:TemplateField HeaderText="" SortExpression="Score"> <ItemTemplate> <asp:TextBox ID="TextScore" runat="server" Width="60px" ></asp:TextBox> </ItemTemplate> <ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
2.但是在向数据库提交数据的时候如何拿到每一个部分的值呢??
(1).通过一个循环将数据全部读入
foreach(GridViewRow gvr in this.GridView1.Rows)
{
tUsual=gvr.FindControl("TextUsual") as TextBox;
tFinal=gvr.FindControl("TextFinal") as TextBox;
tScore=gvr.FindControl("TextScore") as TextBox;
}
(2)通过GridView行与列的属性读入数据
for (int i = 0; i < this.GridView1.Rows.Count; i++) { string stuNo = this.GridView1.Rows[i].Cells[0].Text; //拿到第i行,第1列的数据 string stuCno = this.GridView1.Rows[i].Cells[2].Text;//拿到第i行,第二列的数据 TextBox tb1 = (TextBox)GridView1.Rows[i].Cells[3].FindControl("TextUsual"); string strUsual = tb1.Text; int intUsual = int.Parse(strUsual); TextBox tb2 = (TextBox)GridView1.Rows[i].Cells[4].FindControl("TextFinal"); string strFinal = tb2.Text; int intFinal = int.Parse(strFinal); //拿到总和的分数 string strScore = (int.Parse(strUsual) + int.Parse(strFinal)).ToString();int intScore = int.Parse(strScore);
}
3.此时已经拿到GridView中每一部分的值,接下来可以通过数据库连接访问数据库,并修改更新数据库。下面是封装的数据库操作的类(面向SQLServer数据库)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Configuration; using System.Data; using System.Data.SqlClient; /// <summary> ///DB 的摘要说明 /// </summary> public class DB { private SqlConnection conn = null; private string strConn; private SqlTransaction tran; public DB() { // //TODO: 在此处添加构造函数逻辑 // //连接数据库 strConn = WebConfigurationManager.ConnectionStrings["DataBase"].ConnectionString; } /// <summary> /// 打开数据库 /// </summary> public void open() { if (conn == null) { conn = new SqlConnection(strConn); } if (conn.State.Equals(ConnectionState.Closed)) { conn.Open(); } } /// <summary> /// 关闭数据库 /// </summary> public void close() { //如果为空,说明数据库关闭成功 if (conn == null) { return; } if (conn.State.Equals(ConnectionState.Open)) { conn.Close(); conn.Dispose(); conn = null; } else { conn.Dispose(); conn = null; } } /// <summary> /// 执行sql语句 /// </summary> /// <param name="sqlStr"></param> /// <returns></returns> public int ExecuteSql(string sqlStr) { int ret = -1; try { this.open();//打开链接 SqlCommand cmd = new SqlCommand(sqlStr, conn); //返回执行sql语句过程中,受影响的行数 ret=cmd.ExecuteNonQuery(); return ret; } catch { return ret; } finally { this.close(); } } /// <summary> /// 执行sql语句,不关闭连接,事物处理使用 /// </summary> /// <param name="sqlStr"></param> /// <returns></returns> public int ExecuteSqlWithTran(string sqlStr) { int ret = 0; try { this.open(); SqlCommand cmd = new SqlCommand(sqlStr, conn); cmd.Transaction = tran; ret = cmd.ExecuteNonQuery(); } catch { ret = -1; } return ret; } /// <summary> /// 向sqlcommand传参 /// </summary> /// <param name="sqlStr">传入要执行的sql语句</param> /// <param name="sqlParametes"></param> /// <returns></returns> public int ExecuteSqlWithParam(string sqlStr, List<SqlParameter> sqlParametes) { try { //打开数据库 this.open(); SqlCommand cmd = new SqlCommand(sqlStr, conn); foreach (SqlParameter p in sqlParametes) cmd.Parameters.Add(p); return cmd.ExecuteNonQuery(); } catch { return -1; } finally { this.close(); } } /// <summary> /// 执行sql语句,返回查询的表 /// </summary> /// <param name="sqlStr"></param> /// <returns></returns> public DataTable GetDataTable(string sqlStr) { DataTable dt; try { //打开数据库 this.open(); SqlDataAdapter sda = new SqlDataAdapter(sqlStr, conn); DataSet ds = new DataSet(); //填充数据集 sda.Fill(ds); dt = ds.Tables[0]; } catch { dt = null; } finally { this.close(); } return dt; } /// <summary> /// 执行sql语句,返回数据行 /// </summary> /// <param name="sqlStr"></param> /// <returns></returns> public DataRow GetDataRow(string sqlStr) { DataRow row; try {//在执行的过程中,返回的是表的数据,表中包含的是行的数据 row = GetDataTable(sqlStr).Rows[0];//获取指定索引处的行 } catch { row = null; } return row; } /// <summary> /// 启动事物 /// </summary> public void BeginTrans() { tran = conn.BeginTransaction(); } /// <summary> /// 提交数据 /// </summary> public void Commit() { //提交数据 tran.Commit(); } /// <summary> /// 如果数据操作失败,则回滚,回到数据操作前的状态 /// </summary> public void RollBack() { tran.Rollback(); } }
4.接下来,连接数据库,并更改数据库表,前面代码中,已经将部分所需要使用的数据转换为int,下面直接使用
public void BtnSubmit_Click(object sender,EventArgs e) {
DB db=new DB(); string sqlStr="update SelectCourse set Usual=" + intUsual+",Final="+intFinal+",Score="+intScore+"where Sno="+stuNo;
int row=db.ExecuteSql(sqlStr);
if(row<1)
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "warning", "alert(\"更新数据失败\")", true);
}
else
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "alert(\"数据更新成功\")", true);
}
}
至此,数据库的相关操作彻底完成