ADO.NET学习之SqlCommandBuilder
2017-06-12 16:02
435 查看
ADO.NET学习之SqlCommandBuilder
SqlCommandBuilder
SqlCommandBuilder automatically generates INSERT, UPDATE and DELETE sql statements based on the SELECT statement for a single table.SqlCommandBuilder会基于单个表的
SELECT语句,自动生成
INSERT、
UPDATE和
DELETE的
sql语句。
使用
SqlCommandBuilder的两个步骤:
1.设置
SqlDataAdapter的
SelectCommand属性
SqlDataAdapter dataAdapter = new SqlDataAdapter(); dataAdapter.SelectCommand = new SqlCommand("SELECT_Query", con);
2.创建
SqlCommandBuilder的一个实例,并制定其
DataAdapter属性的值
SqlCommandBuilder builder = new SqlCommandBuilder(); builder.DataAdapter = dataAdapter;
也可以一步完成,如下:
SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);
通过例子说明
准备工作
1.创建表
tblStudents,并添加数据
Create Table tblStudents ( ID int identity primary key, Name nvarchar(50), Gender nvarchar(20), TotalMarks int ) Insert into tblStudents values('Mark Hastings','Male',900) Insert into tblStudents values('Pam Nicholas','Female',760) Insert into tblStudents values('John Stenson','Male',980) Insert into tblStudents values('Ram Gerald','Male',990) Insert into tblStudents values('Ron Simpson','Male',440) Insert into tblStudents values('Able Wicht','Male',320) Insert into tblStudents values('Steve Thompson','Male',983) Insert into tblStudents values('James Bynes','Male',720) Insert into tblStudents values('Mary Ward','Female',870) Insert into tblStudents values('Nick Niron','Male',680)
2.WebForm代码
<div style="font-family: Arial"> <table border="1"> <tr> <td> Student ID </td> <td> <asp:TextBox ID="txtStudentID" runat="server"></asp:TextBox> <asp:Button ID="btnGetStudent" runat="server" Text="Load" OnClick="btnGetStudent_Click" /> </td> </tr> <tr> <td> Name </td> <td> <asp:TextBox ID="txtStudentName" runat="server"></asp:TextBox> </td> </tr> <tr> <td> Gender </td> <td> <asp:DropDownList ID="ddlGender" runat="server"> <asp:ListItem Text="Select Gender" Value="-1"></asp:ListItem> <asp:ListItem Text="Male" Value="Male"></asp:ListItem> <asp:ListItem Text="Female" Value="Female"></asp:ListItem> </asp:DropDownList> </td> </tr> <tr> <td> Total Marks </td> <td> <asp:TextBox ID="txtTotalMarks" runat="server"></asp:TextBox> </td> </tr> <tr> <td colspan="2"> <asp:Button ID="btnUpdate" runat="server" Text="Update" OnClick="btnUpdate_Click" /> <asp:Label ID="lblStatus" runat="server" Font-Bold="true"> </asp:Label> </td> </tr> </table> </div>
Load按钮根据ID查询,
Update按钮更新数据
查询事件:
protected void btnGetStudent_Click(object sender, EventArgs e) { string CS = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString; SqlConnection con = new SqlConnection(CS); string sqlQuery = "select * from tblStudents where ID = " + txtStudentID.Text; SqlDataAdapter da = new SqlDataAdapter(sqlQuery, con); DataSet ds = new DataSet(); da.Fill(ds, "Students"); //在ViewState中保存DataSet和查询语句,将来用来SqlCommandBuilder生成命令 ViewState["SQL_QUERY"] = sqlQuery; ViewState["DATASET"] = ds; if (ds.Tables["Students"].Rows.Count > 0) { DataRow dr = ds.Tables["Students"].Rows[0]; txtStudentName.Text = dr["Name"].ToString(); txtTotalMarks.Text = dr["TotalMarks"].ToString(); ddlGender.SelectedValue = dr["Gender"].ToString(); } else { lblStatus.ForeColor = System.Drawing.Color.Red; lblStatus.Text = "No Student record with ID = " + txtStudentID.Text; } }
更新事件:
protected void btnUpdate_Click(object sender, EventArgs e) { string CS = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString; SqlConnection con = new SqlConnection(CS); SqlDataAdapter da = new SqlDataAdapter((string)ViewState["SQL_QUERY"], con); SqlCommandBuilder builder = new SqlCommandBuilder(da); DataSet ds = (DataSet)ViewState["DATASET"]; if (ds.Tables["Students"].Rows.Count > 0) { DataRow dr = ds.Tables["Students"].Rows[0]; dr["Name"] = txtStudentName.Text; dr["Gender"] = ddlGender.SelectedValue; dr["TotalMarks"] = txtTotalMarks.Text; dr["Id"] = txtStudentID.Text; } int rowsUpdated = da.Update(ds, "Students"); if (rowsUpdated == 0) { lblStatus.ForeColor = System.Drawing.Color.Red; lblStatus.Text = "No rows updated"; } else { lblStatus.ForeColor = System.Drawing.Color.Green; lblStatus.Text = rowsUpdated.ToString() + " row(s) updated"; } }
SqlDataAdapter.Update无效的两个原因:
1.
SqlDataAdapter对象没有绑定
SqlCommandBuilder对象
2.
SqlDataAdapter的
SelectCommand,没有返回至少一个主键或者唯一的列
如果想查看自动生成的
INSERT,
UPDATE, 和
DELETE语句,使用
GetInsertCommand(),
GetUpdateCommand()和
GetDeleteCommand()
lblInsert.Text = builder.GetInsertCommand().CommandText; lblUpdate.Text = builder.GetUpdateCommand().CommandText; lblDelete.Text = builder.GetDeleteCommand().CommandText;
资料
Part 13 - What is SqlCommandBuilderPart 14 - Sqlcommandbuilder update not working
相关文章推荐
- ADO.NET中利用DataAdapter进行数据操作(SqlCommandBuilder,AcceptChanges)
- ADO.NET出错原因:Dynamic SQL generation for the UpdateCommand is not Supported ……
- ADO.NET 2.0中的SqlCommand.ExecutePageReader
- 黑马程序员_学习日记51_621数据库开发及ADO.Net(游标、动态sql)
- t-sql-ado.net学习ado.net
- ADO.NET - 1.基础(SqlCommand\ExecuteScalar\ExecuteReader\sqlDataAdapter)
- asp.net中使用sqlcommandbuilder
- ADO.NET 2.0中的SqlCommand.ExecutePageReader
- 黑马程序员之ADO.NET学习笔记:通过SqlCommand对象执行SQL语句
- 黑马程序员之ADO.NET学习笔记:SqlParameter(Sql参数)
- ADO.NET 主要的三个对象(SqlConnection/SqlCommand/SqlDataReader)
- asp.net 中使用sqlcommandbuilder
- 黑马程序员--ADO.NET学习之SQL注入漏洞攻击
- ADO.NET_第八篇_OracleCommand_执行多个SQL语句01
- 黑马程序员之ADO.NET学习笔记: SqlTransaction(事务)
- asp.net中使用sqlcommandbuilder (转)
- ASP.net:用SqlCommandBuilder 实现批量更新
- ADO.NET中SQL Command的执行
- 黑马程序员_学习日记48_616数据库开发及ADO.Net(带参数的Sql语句、数据库与文本文件导入导出、省市联动、资料管理器、DataSet (ado.net断开式数据访问)、SQLHelper)
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #3 -- LINQ-to-SQL、EntitySQL、查询产生器方法(Query builder)三种语法