asp.net技术文章

来源:互联网 发布:安知玉如意txt 编辑:程序博客网 时间:2024/04/25 13:41
 ASP.NET技术文章
1.   ADO.NET数据库实例教程
ADO.NET数据库编程比较复杂,名目繁多的类、对象、属性、方法让每一个编程者都感觉恼火。本文旨在介绍ASP.NET Beta2数据库编程的主要内容,帮助编程者最快的了解ADO.NET数据库编程的精髓。
  一、 Managed Providers
  如果你是初学者,可能你会问,什么是"Managed Providers"?
  Managed Providers提供简单的方法连接和访问数据库,有点类似于数据库连接,当然又比它强的多。Managed Providers提供OleDb和SQL Server两种编程接口。因为SQL Server是微软自己的产品,因此,专门提供了一个针对SQL Server的接口,使用这个接口访问SQL Server的效率应该比使用OleDb强。
  NameSpaces
  本文所有的例子程序都需要使用以下NameSpaces:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Oledb" %> 
  Connection
  为了连接数据库,必须使用OleDbConnection:
Dim objConn as New OleDBConnection
("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:/sff/site/db/users.mdb") 
  当然,你也可以将具体的连接方法作为变量使用,在连接数据库以后,必须打开数据库:
objConn.Open() 
  这样,就可以使用数据库了,一般在最后,我们都要求关闭数据库连接:
objConn.Close()
objConn=Nothing 
  Command
  连接数据库以后,就可以发送命令对数据库进行操作了,OleDbCommand允许发送命令对数据库进行操作。根据发送的SQL语句,我们可以对数据库进行几乎所有操作。
Dim objCmd as New OleDbCommand("SELECT * From users", objConn) 
  以上语句建立Command,根据习惯不同,也可以使用以下方法:
Dim objCmd as New OleDbCommand()
objCmd.Connection = objConn
objCmd.CommandText = "SELECT * FROM users" 
  还可以这样:
Dim objCmd as New OleDbCommand(SQL String, connection string) 
  仔细观察上面的语句,我们发现在定义OleDbCommand时,可以同时使用数据库连接OleDbConnection和数据库连接语句。以上代码并没有执行SQL语句,现在我们来看到底怎样执行:
  ExecuteNonQuery
  当执行没有返回数据的操作的时候,我们可以使用以上方法,比如插入数据、更新数据等操作,具体这样执行:
objCmd.ExecuteNoQuery 
  ExecuteReader
  在需要一个Data Reader的时候,我们可以使用以上方法,具体这样执行:
Dim objRd as OleDbDataReader
objRd = objCmd.ExeuteReader 
  ExecuteScalar

  使用ExecuteScalar方法来取得一个单个地返回数据,比如对数据的统计。
  Data Reader
  OleDbReader是专门用来读取数据的对象,这个对象除了读数据以外,不能做其他任何数据库操作。尽管比较简单,但是在用来浏览数据的时候效率是非常高的。
Dim objReader as OleDbDataReader
objReader = objCmd.ExecuteReader 
While objReader.Read
Response.Write(objReader.GetString(0) & "<br>")
End While 
  以上语句读取Command的返回结果的第一个字段,这个字段是字符型数据。我们可以使用其他方法取得各种类型的数据:
    GetBoolean(x) 
    GetByte(x) 
    GetBytes(x) 
    GetChar(x) 
    GetChars(x) 
    GetDataTypeName(x) -取得数据类型
   GetDateTime(x) 
    GetDecimal(x) 
    GetDefaultStream(x) 
    GetDouble(x) 
    GetFieldType(x) 
    GetFloat(x) 
    GetGuid(x) 
    GetInt16(x) 
    GetInt32(x) 
    GetInt64(x) 
    GetName(x) - 取得字段名 
    GetOrdinal(name) -根据字段名取得字段序号
    GetString(x) 
    GetTimeSpan(x) 
    GetValue(x) 
    GetValues(values()) 
  以上方法都是Command返回数据。
  Data Adapter
  OleDbDataAdapter取得数据并且数据与DataSet之间建一座桥梁,可以这样使用:
Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn) 
  实现方法有点类似于OleDbCommand。OleDbAdapter可以填充DataSet,也可以修改数据然后提以实现对具体数据的修改:
Dim ds as Dataset = New DataSet()
objAdapter.Fill(ds, "users") 
  以上语句实现将SQL语句取得的Users表的数据填充到DataSet。
  Mappings
  Mappings可以实现对DataSet的列取别名:
objAdapter.TableMappings.Add("adbtable", "users")
With objAdapter.TableMappings(0).ColumnMappings
.Add("PID", "ID")
.Add("LastName", "LName")
.Add("StreetAddress", "Addy")
End With
objAdapter.Fill(ds) 
  当使用了以上代码以后,就可以用ds.Tables("users")来代替ds.Tables("adbtable")了。
  Command Builder
  在下一章我们可以看到Command Builder的具体使用和强大功能。
  练习:
  如果你能理解以下代码,你就可以看下一章的内容了:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Oledb" %>
<script language="VB" runat="server">
Sub Page_Load(sender as object, e as eventargs)
Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:/sff/site/db/users.mdb")
objConn.Open()
Dim ds as Dataset = New DataSet()
Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)
Dim objCmdBld As New OleDbCommandBuilder(objAdapter)
objAdapter.Fill(ds, "users")
End Sub
</script>
2. 访问数据库(Access)
我们这次同样通过例子来看,其中我们用到了System.Data.OleDb.OleDbCommand类,其实,我们在前面执行SELECT的时候也用到了! 
下面我写出我的程序: 
//修改留言本中特定的数据 
public Boolean UpdateNote(Notebook note) 

Boolean tempvalue=false; 
string sqlstr=""; //当时在这里定义,是为了在出现异常的时候看看我的SQL语句是否正确 
try 

//用到了我前面写的那个得到数据库连接的函数 
OleDbConnection conn = getConn(); //getConn():得到连接对象, 
conn.Open(); 
//确定我们需要执行的SQL语句,本处是UPDATE语句! 
sqlstr = "UPDATE notes SET "; 
sqlstr += "title='" + note.title + "',"; 
sqlstr += "content='" + DealString(note.content) +"',"; 
sqlstr += "author='" + note.author + "',"; 
sqlstr += "email='" +note.email +"',"; 
sqlstr += "http='" +note.http +"'"; 
//sqlstr += "pic='" +note.pic +"'"; 
sqlstr += " where id=" + note.id; 
//定义command对象,并执行相应的SQL语句 
OleDbCommand myCommand = new OleDbCommand(sqlstr,conn); 
myCommand.ExecuteNonQuery(); //执行SELECT的时候我们是用的ExecuteReader() 
conn.Close(); 
//假如执行成功,则,返回TRUE,否则,返回FALSE 
tempvalue=true; 
return(tempvalue); 

catch(Exception e) 

throw(new Exception("数据库更新出错:" + sqlstr + "/r" + e.Message)) 
} } 
这个例子是对于特定ID好的记录进行UPDATE操作,具体解释我都写在了程序中,其中的与数据库有关的语句是try内部的那些! 
其实,我们同样可以通过上面的那种模式执行INSERT、DELETE操作,下面我把我的程序列到下面! 
/*删除特定记录,通过string类型的ID删除字段,在我的程序中,我把这个函数重载了,这样我们就可以通过INT类型的ID参数来删除特定的字段了*/ 
public Boolean DelNote(string delid) 

Boolean tempvalue=false; 
string sqlstr=""; 
//连接数据库 
try 

OleDbConnection conn = getConn(); //getConn():得到连接对象 
conn.Open(); 
sqlstr = "delete * from notes where id=" + delid; 
//定义command对象,并执行相应的SQL语句 
OleDbCommand myCommand = new OleDbCommand(sqlstr,conn); 
myCommand.ExecuteNonQuery(); 
conn.Close(); 
//假如执行成功,则,返回TRUE,否则,返回FALSE 
tempvalue=true; 
return(tempvalue); 

catch(Exception e) 

throw(new Exception("数据库更新出错:" + sqlstr + "/r" + e.Message)) 



细心的朋友们应该能看到,其实这个程序和上面的相比,只是哪个SQL语句不同而已,其他的都基本一样的!同样的,我们想在数据库中插入新的记录的时候也可以用这样的方式,程序如下: 
//向留言本中添加数据 
public Boolean AddNote(Notebook note) 

Boolean tempvalue=false; //定义返回值,并设置初值 
//下面把note中的数据添加到数据库中! 
try{ 
OleDbConnection conn = getConn(); //getConn():得到连接对象 
conn.Open(); 
//设置SQL语句 
string insertstr="INSERT INTO notes(title, content, author, email, http, pic ,hits,posttime) VALUES ('"; 
insertstr += note.title +"', '"; 
insertstr += DealString(note.content) + "','"; 
insertstr += note.author + "','"; 
insertstr += note.email + "','"; 
insertstr += note.http + "','"; 
insertstr += note.pic + "',"; 
insertstr += note.hits + ",'"; 
insertstr += note.posttime +"')"; 
OleDbCommand insertcmd = new OleDbCommand(insertstr,conn) 
insertcmd.ExecuteNonQuery() 
conn.Close(); 
tempvalue=true; 

catch(Exception e) 

throw(new Exception("数据库出错:" + e.Message)) 

return(tempvalue); 

//处理数据,在把数据存到数据库前,先屏蔽那些危险字符! 
public string DealString(string str) 

str=str.Replace("<","<"); 
str=str.Replace(">",">"); 
str=str.Replace("/r","<br>"); 
str=str.Replace("/'","’"); 
str=str.Replace("/x0020"," "); 
return(str); 

//恢复数据:把数据库中的数据,还原成未处理前的样子 
public string UnDealString(string str) 

str=str.Replace("<","<"); 
str=str.Replace(">",">"); 
str=str.Replace("<br>","/r"); 
str=str.Replace("’","/'"); 
str=str.Replace(" ","/x0020"); 
return(str); 

我同时列出了两个函数UnDealString()和DealString( ),他们是对与输入内容做一些事先的处理和还原工作的!


数据存储的一个实例
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.OleDb" %>
<Script Language="C#" Runat="Server">
public string myConnstring="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("test.mdb");
OleDbConnection MyConnection;
public void Page_Load(Object src,EventArgs e)
{
//用户提交数据
}
public void submit_Click(Object src,EventArgs e)
{
string username1 = Request.Form["username"];
string address1 = Request.Form["address"];
string school1 = Request.Form["school"];
string strInsert="insert into aspcn(username,address,school) values('"+username1+"','"+address1+"','"+school1+"')";
//开始联结
try
{
MyConnection = new OleDbConnection(myConnstring);
OleDbCommand MyCommand = new OleDbCommand(strInsert,MyConnection);
MyConnection.Open();
MyCommand.ExecuteNonQuery();
MyConnection.Close();
Info.Text="数据已经保存";
}
catch(Exception ee)
{
Info.Text="发生错误:"+ee.Message;
}
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<asp:Label id="Info" runat=server /><br>
<form runat="server">
用户名:<input type="text" name="username"  size="20" ><br>
住址:<input type="text" name="address"  size="20" ><br>
学校:<input type="text" name="school" size="20" ><br>
<input type="button" value="提交" runat="server" OnServerClick="submit_Click" >
    <p>1</p>
</form>
</body>
</html>
有关DataGrid显示数据的问题
经常碰到DataGrid中要显示一个数据,先要用IF语句判断其值,然后决定怎样显示.问题是,DataGrid中不可直接写条件语句,怎样实现呢?这里我用了两种方法。
方法一:在把数据绑定到DataSet后,更改里面的数据,例如:
SqlDataAdapter myCmd=new SqlDataAdapter(strSql,myConn);
 DataSet ds=new DataSet();
 myCmd.Fill(ds,"操作员");
 for(int i=0;i<ds.Tables[0].Rows.Count;i++)
 {
  if(ds.Tables[0].Rows[i]["Oper_state"].ToString()=="1")
   ds.Tables[0].Rows[i]["Oper_state"]="有效";
  else if(ds.Tables[0].Rows[i]["Oper_state"].ToString()=="0")
   ds.Tables[0].Rows[i]["Oper_state"]="冻结";
}
MyDataGrid.DataSource=ds.Tables["操作员"].DefaultView;
MyDataGrid.DataBind();
方法二:通过写一个函数,把绑定到DataGrid某一列的数据转化成要显示字符串,例如:
SqlDataAdapter myCmd=new SqlDataAdapter(strSql,myConn);
 DataSet ds=new DataSet();
 myCmd.Fill(ds,"操作员");
MyDataGrid.DataSource=ds.Tables["操作员"].DefaultView;
MyDataGrid.DataBind();
在DataGrid摸版列里这样绑定数据:
<%# TurnToStatus(DataBinder.Eval(Container.DataItem,"Oper_state").ToString()) %>
原创粉丝点击