声明:本文中的内容来自网络,但经过我自己的整理、验证,有些内容无法声明来源,请原作者谅解。
在asp.net中操作数据库常用DataGrid,本文将常用的方法进行了汇编,适合初学者。
1、使用DataGrid控件显示数据库中的内容:
添加引用
using System.Data.SqlClient;
// 在此处放置用户代码以初始化页面
//DataGrid控件改名为MyDataGrid
// 在Page_Load中添加如下代码:
String selectCmd = "select * from OA_Userlogo";
SqlConnection myConnection = new SqlConnection("server=chaoming;uid=sa;database=Mytest");
SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "OA_Userlogo");
MyDataGrid.DataSource= ds.Tables["OA_Userlogo"].DefaultView;
MyDataGrid.DataBind();
2、在DataGrid中使用参数查询:
//加入Text控件和按钮控件,在按钮中输入以下内容
String selectCmd = "select * from OA_Userlogo where 密码 = @密码";
SqlConnection myConnection = new SqlConnection("server=chaoming;uid=sa;database=Mytest");
SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);
myCommand.SelectCommand.Parameters.Add(new SqlParameter("@密码", SqlDbType.VarChar, 50));
//SqlDbType.Varchar 为表OA_Userlogo中的第三个字段, Varchar必须与数据库中的字段//类型一致,50为第三个字段的长度
myCommand.SelectCommand.Parameters["@密码"].Value = TextBox1.Text;
DataSet ds = new DataSet();
myCommand.Fill(ds, "OA_Userlogo");
MyDataGrid.DataSource= ds.Tables["OA_Userlogo"].DefaultView;
MyDataGrid.DataBind();
3、将数据连接信息放在Global.asax文件中
在Global.asax文件中加入引用
using System.Data.SqlClient;
在 Session_Start 事件中加入以下代码:
protected void Session_Start(Object sender, EventArgs e)
{ string f="server=chaoming;uid=sa;database=Mytest";
SqlConnection NowConn1 = new SqlConnection(f);//连至Mytest数据库
Session["NowSQLNor"]=NowConn1;
}
在aspx文件中进行如下修改:
String selectCmd = "select * from OA_Userlogo where 密码 = @密码";
//这里是引用的关键:
SqlConnection myConnection = (SqlConnection)Session["NowSQLNor"];
SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);
myCommand.SelectCommand.Parameters.Add(new SqlParameter("@密码", SqlDbType.VarChar, 50));
myCommand.SelectCommand.Parameters["@密码"].Value = TextBox1.Text;
DataSet ds = new DataSet();
myCommand.Fill(ds, "OA_Userlogo");
MyDataGrid.DataSource= ds.Tables["OA_Userlogo"].DefaultView;
MyDataGrid.DataBind();
本例将数据库连接作为共享的Session对象,相当实用,Web应用系统其他需获得数据库的位置,就不必打开数据库,只要直接获得已制作完成的Session即可.
4、插入数据
SqlConnection myConnection;//定义一个空连接,不能少
protected void Page_Load(Object Src, EventArgs E)
{ //在页的初始化中加入连接内容
myConnection = new SqlConnection("server=(local)//NetSDK;database=pubs;Trusted_Connection=yes");//连接字符串
if (!IsPostBack) //第一次加载本页时执行BindGrid()函数
BindGrid(); //在DataGrid控件中显示数据库中的数据
}
/*IsPostBack Page页属性, 表示获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。
属性值:如果是为响应客户端回发而加载该页,则为 true;否则为 false。
*/
public void BindGrid()
{
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "Authors");//将数据填充到内存中的表Authors,也可用其他名
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
}
public void AddAuthor_Click(Object sender, EventArgs E)
{
Message.InnerHtml = "";//错误提示
if (Page.IsValid) //获取一个值,该值指示页验证是否成功,详细说明见后
{ //将数据库中的字段与变量连接起来,
String insertCmd = "insert into Authors (au_id, au_lname, au_fname, phone, address, city, state, zip, contract) values (@Id, @LName, @FName, @Phone, @Address, @City, @State, @Zip, @Contract)";
SqlCommand myCommand = new SqlCommand(insertCmd, myConnection);
myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11));
// SqlDbType.NvarChar表示数据库中au_id字段的类型,11表示长度,以下类似
myCommand.Parameters["@Id"].Value = au_id.Value;
// au_id.Value是text控件或其他控件的值,也可直接赋值如”abcd”
myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40));
myCommand.Parameters["@LName"].Value = au_lname.Value;
myCommand.Parameters.Add(new SqlParameter("@FName", SqlDbType.NVarChar, 20));
myCommand.Parameters["@FName"].Value = au_fname.Value;
myCommand.Parameters.Add(new SqlParameter("@Phone", SqlDbType.NChar, 12));
myCommand.Parameters["@Phone"].Value = phone.Value;
myCommand.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 40));
myCommand.Parameters["@Address"].Value = address.Value;
myCommand.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar, 20));
myCommand.Parameters["@City"].Value = city.Value;
myCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NChar, 2));
myCommand.Parameters["@State"].Value = state.Value;
myCommand.Parameters.Add(new SqlParameter("@Zip", SqlDbType.NChar, 5));
myCommand.Parameters["@Zip"].Value = zip.Value;
myCommand.Parameters.Add(new SqlParameter("@Contract", SqlDbType.NVarChar,1));
myCommand.Parameters["@Contract"].Value = contract.Value;
myCommand.Connection.Open();
try
{
myCommand.ExecuteNonQuery();//写入数据库
Message.InnerHtml = "<b>已添加记录</b><br>" + insertCmd + "<p>";
}
catch (SqlException e)
{
if (e.Number == 2627)
Message.InnerHtml = "错误:已存在具有相同主键的记录<p>";
else
Message.InnerHtml = "错误:未能添加记录,请确保正确填写了字段<p>";
Message.Style["color"] = "red";
}
myCommand.Connection.Close();
}
BindGrid();//刷新DataGrid显示
}
/* Page.IsValid 属性
属性值:如果页验证成功,则为 true;否则为 false。
备注:若要使该属性返回 true,Page.Validators 属性中的所有验证服务器控件必须都验证成功。只有在已调用 Page.Validate 方法,或已在开始窗体处理的 ASP.NET 服务器控件的 OnServerClick 处理程序中将 CausesValidation 属性设置为 true 后才可以选中该属性,。这些服务器控件包括 Button、HtmlButton、HtmlInputButton、HtmlInputImage、ImageButton 以及 LinkButton 类。
示例:下面的示例说明使用 IsValid 属性设置条件语句。如果该属性返回 true,则 lblOutput 控件的 Text 属性被设置为“Page is valid!”。否则,它被设置为“Some of the required fields are empty”。
void ValidateBtn_Click(Object Sender, EventArgs E) {
if (Page.IsValid == true) {
lblOutput.Text = "Page is Valid!";
}
else {
lblOutput.Text = "Some of the required fields are empty";
}
}
5、修改数据
修改数据与添加数据不同,为了确定哪一行应该是可编辑的,需要一种方法接受用户关于他们希望编辑哪一行的输入。DataGrid 可以包含一个 EditCommandColumn 来呈现激发三个特殊事件的链接:EditCommand、UpdateCommand 和 CancelCommand。EditCommandColumn 以声明方式添加到 DataGrid 的 Columns 集合,并将DataGrid的DataKeyFied属性与数据库中索引字段相连接。如本例中:DataKeyField=au_id
SqlConnection myConnection;
protected void Page_Load(Object Src, EventArgs E)
{
myConnection = new SqlConnection("server=(local)//NetSDK;database=pubs;Trusted_Connection=yes");
if (!IsPostBack)
BindGrid();
}
public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs e)
{
MyDataGrid.EditItemIndex = (int)e.Item.ItemIndex;
BindGrid();
}
public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs e)
{
MyDataGrid.EditItemIndex = -1;
BindGrid();
}
public void MyDataGrid_Update(Object sender, DataGridCommandEventArgs e)
{
String updateCmd = "UPDATE Authors SET au_id = @Id, au_lname = @LName, au_fname = @FName, phone = @Phone, "
+ "address = @Address, city = @City, state = @State, zip = @Zip, contract = @Contract where au_id = @Id";//where为查询条件
SqlCommand myCommand = new SqlCommand(updateCmd, myConnection);
myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11));
myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40));
myCommand.Parameters.Add(new SqlParameter("@FName", SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@Phone", SqlDbType.NChar, 12));
myCommand.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 40));
myCommand.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar, 20));
myCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NChar, 2));
myCommand.Parameters.Add(new SqlParameter("@Zip", SqlDbType.NChar, 5));
myCommand.Parameters.Add(new SqlParameter("@Contract", SqlDbType.NVarChar,1));
myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex];
String[] cols = {"@Id","@LName","@FName","@Phone","@Address","@City","@State","@Zip","@Contract"};
int numCols = e.Item.Cells.Count;
for (int i=2; i<numCols-1; i++) //跳过第一、第二和最后一列
{
String colvalue =((TextBox)e.Item.Cells[i].Controls[0]).Text;
// 检查在所需字段中是否有空值
if (i<6 && colvalue == "")
{
Message.InnerHtml = "错误:“作者 ID”、“姓名”或“电话”不允许使用空值";
Message.Style["color"] = "red";
return;
}
myCommand.Parameters[cols[i-1]].Value = colvalue;
}
//追加最后一行,将 true/false 值转换为 0/1
if (String.Compare(((TextBox)e.Item.Cells[numCols-1].Controls[0]).Text, "True", true)==0)
myCommand.Parameters["@Contract"].Value = "1";
else
myCommand.Parameters["@Contract"].Value = "0";
myCommand.Connection.Open();
try
{
myCommand.ExecuteNonQuery();
Message.InnerHtml = "<b>已更新记录</b><br>" + updateCmd;//可用Text控件替代
MyDataGrid.EditItemIndex = -1;
}
catch (SqlException exc)
{
if (exc.Number == 2627)
Message.InnerHtml = "错误:已存在具有相同主键的记录";
else
Message.InnerHtml = "错误:未能更新记录,请确保正确填写了字段";
Message.Style["color"] = "red";
}
myCommand.Connection.Close();
BindGrid();
}
public void BindGrid()
{
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "Authors");
//MyDataGrid.AutoGenerateColumns=false;
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
MyDataGrid.DataBind();
}
如果不希望所有的字段都被修改,可点击DataGrid的属性生成器,将所有列与字段绑定,并将AutoGenerateColumns属性设为false,也可在代码中加入.如上面的红色代码.
6、删除数据
从数据库删除非常类似于更新或插入命令,但仍然需要一种方法来确定要具体删除的网格中的行。可以添加到 DataGrid 的 Columns 集合的另一个控件是 ButtonColumn 控件,它只呈现按钮控件。ButtonColumn 支持可以设置为 Delete 的 CommandName 属性。在 DataGrid 上,将事件处理程序连到 DeleteCommand,并从那里执行删除操作。再一次使用 DataKeys 集合确定客户端选择的行。下面的示例说明此过程。
不要忘记将DataGrid的DataKeyField属性设为emp_id
SqlConnection myConnection;
protected void Page_Load(Object sender, EventArgs e)
{
myConnection=new SqlConnection("server=(local)//NetSDK;database=pubs;Trusted_Connection=yes");
if (!IsPostBack)
BindGrid();
}
public void MyDataGrid_Delete(Object sender, DataGridCommandEventArgs e)
{
String deleteCmd = "DELETE from Employee where emp_id = @Id";
SqlCommand myCommand = new SqlCommand(deleteCmd, myConnection);
myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11));
myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex];
myCommand.Connection.Open();
try
{
myCommand.ExecuteNonQuery();
Message.InnerHtml = "<b>已删除记录</b><br>" + deleteCmd;
}
catch (SqlException)
{
Message.InnerHtml = "错误:未能删除记录";
Message.Style["颜色"] = "红色";
}
myCommand.Connection.Close();
BindGrid();
}
public void BindGrid()
{
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Employee", myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "员工");
MyDataGrid.DataSource=ds.Tables["员工"].DefaultView;
MyDataGrid.DataBind();
}