|
主题: 请问蓝鲸等高手一个ASP。NET控件的问题
|
Kennytian
职务:普通成员
等级:1
金币:0.0
发贴:10
注册:2005/10/25 10:56:58
|
#12006/4/6 18:28:38
从零开始学ASP.NET,给我很大的帮助,在此先感谢蓝鲸大哥
教程为什么没有显示新闻详细的页面了?请问我怎么显示新闻的详细内容?
我搞了一个News_detail.aspx页面,不知道怎么显示内容?
麻烦各位写一个aspx和CS的页面给我,谢谢了。
|
蓝鲸
职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
|
#22006/4/6 21:29:04
可以先得到一条记录,如OleDbDataReader或SqlDataReader, 这部分是数据库操作基础,不细述了
在Detail页面上放置一些label控件 labTitle、labWriter、labPubDate、labContent等
if (dr.Read()) { labTitle.Text = dr["Title"].ToString(); ... labContent.Text = dr["Content"].ToString(); } dr.close()
声明: 本方法仅用于演示如何显示文章内容及使用ADO.Net类库方法,作为练习使用 但作为程序,不推荐以上代码,而应使用类库包装,希望真正想学程序的在自己程序中不要用到以上代码,而应学会使用类包装方法,这才是.net编程好的方法。
非常大鱼
|
Kennytian
职务:普通成员
等级:1
金币:0.0
发贴:10
注册:2005/10/25 10:56:58
|
#32006/4/7 0:08:41
我用Label显示新闻内容已经成功了,还想请蓝鲸大哥和众高手给我讲讲类库包装的方法 谢谢啦!
|
蓝鲸
职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
|
#42006/4/7 12:31:30
类包装就用类封装一些方法、属性等
一般我用一个结构来描述文章的结构
public struct ArticleInfo { public int ArticleID; public int CategoryID; public string CategoryName; public string Title; public string Content; public int HitCount; public DateTime PubTime; }
并且用一个类DbArticle类描述文章,该类继承自数据基类DbBase类
内部包含一些方法
/// <summary> /// 创建新的文章 /// </summary> /// <returns>新的ID号</returns> public void Create(ArticleInfo article) { string insertCommand = "INSERT INTO Article_Article" + " ( CategoryID, Title, Content) valueS" + " (@CategoryID, @Title, @Content)";
OleDbParameter[] parameters = { new OleDbParameter("@CategoryID", OleDbType.Integer), new OleDbParameter("@Title", OleDbType.VarWChar, 50), new OleDbParameter("@Content", OleDbType.LongVarWChar), new OleDbParameter("@Keyword", OleDbType.VarWChar, 255) };
parameters[0].value = article.CategoryID; parameters[1].value = article.Title; parameters[2].value = article.Content;
try { RunCommand(insertCommand, parameters); } catch { throw ( new AppException("在发布文章过程中,发生意外错误。")); }
CloseConnection(); }
另外可封装Update、GetInfo(某条记录)、GetArticles、Delete等方法
RunCommand是DbBase中的方法,包装了数据库常用的过程
非常大鱼
|
蓝鲸
职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
|
#52006/4/7 12:36:54
类封装话题很长,时间不多,只能请参看一些专业书籍,最好的是国外的, 国内的很多书只能看些大概,多看了怕有误导作用。 下面是我整理的DbBase类,适用于ACCESS数据库,另外这版的还没加入分页功能,需要自己整理一下。
using System;
using System.Data;
using System.Data.OleDb;
namespace Hellosea.WebModule.Data
{
/// <summary>
/// 数据库的基础类,所有的数据库类均基于该类,为网站的核心程序。
/// 数据库其它类均派生此类。
/// </summary>
public class DbBase
{
protected OleDbConnection DbConnection;
private string mConnectionString;
/// <summary>
/// 受保护的只读连接字符串属性
/// 派生类可以继承该属性
/// </summary>
protected string ConnectionString
{
get
{
return mConnectionString;
}
}
/// <summary>
/// 参数化的构造函数,并建立数据库连接
/// </summary>
/// <param name="newConnectionString">数据库连接字符串</param>
public DbBase(string newConnectionString)
{
mConnectionString = newConnectionString;
DbConnection = new OleDbConnection(mConnectionString);
}
/// <summary>
/// 建立一OleDbCommand的原型,这一新的命令通常用于把
/// SELECT语句的结果返回给DataSet或DataReader。
/// </summary>
/// <param name="cmdString">存储过程名</param>
/// <param name="parameters">IDataParameter类的数组</param>
/// <returns></returns>
private OleDbCommand BuildQueryCommand( string cmdString, IDataParameter[] parameters )
{
OleDbCommand command = new OleDbCommand( cmdString, DbConnection );
foreach (OleDbParameter parameter in parameters)
{
command.Parameters.Add( parameter );
}
return command;
}
/// <summary>
/// 建立一OleDbCommand的原型,这一新的命令通常用于把
/// SELECT语句的结果返回给DataSet或DataReader。
/// </summary>
/// <param name="cmdString">存储过程名</param>
/// <returns></returns>
private OleDbCommand BuildQueryCommand( string cmdString )
{
OleDbCommand command = new OleDbCommand( cmdString, DbConnection );
return command;
}
/// <summary>
/// 执行OleDbCommand命令,不返回值
/// </summary>
/// <param name="cmdString">执行的SQL语句</param>
/// <param name="parameters">IDataParameter类的数组</param>
protected void RunCommand( string cmdString, IDataParameter[] parameters )
{
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
OleDbCommand command = BuildQueryCommand( cmdString, parameters );
command.ExecuteNonQuery();
DbConnection.Close();
}
/// <summary>
/// 执行OleDbCommand命令,不返回值
/// </summary>
/// <param name="cmdString">执行的SQL语句</param>
protected void RunCommand( string cmdString)
{
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
OleDbCommand command = BuildQueryCommand( cmdString );
command.ExecuteNonQuery();
DbConnection.Close();
}
/// <summary>
/// 执行查询,并返回OleDbDataReader查询记录
/// </summary>
/// <param name="cmdString">执行的SQL语句</param>
/// <returns>返回OleDbDataReader查询记录</returns>
protected OleDbDataReader GetDataReader(string cmdString)
{
OleDbDataReader returnReader;
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
OleDbCommand command = BuildQueryCommand( cmdString );
returnReader = command.ExecuteReader();
//DbConnection.Close();
return returnReader;
}
/// <summary>
/// 执行查询,并返回OleDbDataReader查询记录
/// </summary>
/// <param name="cmdString">执行的SQL语句</param>
/// <param name="parameters">IDataParameter类的数组</param>
/// <returns>返回OleDbDataReader查询记录</returns>
protected OleDbDataReader GetDataReader(string cmdString, IDataParameter[] parameters )
{
OleDbDataReader returnReader;
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
OleDbCommand command = BuildQueryCommand( cmdString, parameters );
returnReader = command.ExecuteReader();
//DbConnection.Close();
return returnReader;
}
/// <summary>
/// 执行查询,并返回DataSet查询数据集
/// </summary>
/// <param name="cmdStringName">执行的SQL语句</param>
/// <param name="tableName">要填充数据集的表名</param>
/// <returns>返回DataSet类型数据集</returns>
protected DataSet GetDataSet(string cmdStringName, string tableName )
{
DataSet dataSet = new DataSet();
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
OleDbDataAdapter oleDA = new OleDbDataAdapter();
oleDA.SelectCommand = BuildQueryCommand( cmdStringName );
oleDA.Fill( dataSet, tableName );
DbConnection.Close();
return dataSet;
}
/// <summary>
/// 执行查询,并返回DataSet查询数据集
/// </summary>
/// <param name="cmdStringName">执行的SQL语句</param>
/// <param name="parameters">IDataParameter类的数组</param>
/// <param name="tableName">要填充数据集的表名</param>
/// <returns>返回DataSet类型数据集</returns>
protected DataSet GetDataSet(string cmdStringName, IDataParameter[] parameters, string tableName )
{
DataSet dataSet = new DataSet();
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
OleDbDataAdapter oleDA = new OleDbDataAdapter();
oleDA.SelectCommand = BuildQueryCommand( cmdStringName, parameters );
oleDA.Fill( dataSet, tableName );
DbConnection.Close();
return dataSet;
}
/// <summary>
/// 执行查询,把数据填充至指定数据集中
/// </summary>
/// <param name="cmdStringName">执行的SQL语句</param>
/// <param name="tableName">要填充数据集的表名</param>
/// <param name="dataSet">填充数据集</param>
protected void GetDataSet(string cmdStringName, IDataParameter[] parameters, DataSet dataSet, string tableName )
{
if (DbConnection.State == ConnectionState.Closed) DbConnection.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = BuildQueryCommand( cmdStringName, parameters );
adapter.Fill( dataSet, tableName );
DbConnection.Close();
}
/// <summary>
/// 关闭数据库
/// </summary>
protected void CloseConnection()
{
if (DbConnection.State == ConnectionState.Open)
{
DbConnection.Close();
}
}
}
}
非常大鱼
|
蓝鲸
职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
|
#62006/4/7 12:46:25
另外对DbArticle类还可再封装,用CArticle类封装DbArticle
其中一方法为:
/// <summary> /// 得到文章数据集 /// </summary> public static DataSet GetArticles(int categoryID, int pageSize, int page) { string connectString = WebCode.GetOleConnectString(ConfigurationSettings.AppSettings["DbPath"]);; DbArticle myArticle = new DbArticle(connectString); return myArticle.GetArticles(categoryID, pageSize, page); }
WebCode.GetOleConnectString WebCode为常用函数库,自定义的 GetOleConnectString因考虑ACCESSO数据库可能是放在绝对路径下,所以就不会用Server.MapPath,如果经常用,一旦Server.MapPath是否用,就会对整个程序很多地方都修改,所以用一种方法来定义,如果修改,也修改方法就行。
用用类就很方便
private void DataBoundArticle() { DataSet ds = CArticle.GetArticles(); grdArticle.DataSource = ds.Tables[0]; grdArticle.DataBind(); }
非常大鱼
|
Kennytian
职务:普通成员
等级:1
金币:0.0
发贴:10
注册:2005/10/25 10:56:58
|
#72006/4/10 0:15:58
有个初步的了解了,容我慢慢吸收,谢谢大哥指导!
接着我的问题又来的,呵呵! 我费了九牛二虎之力,终于把上传学会了,但显示又繁难了。
我是把文件名写到数据库里去的,用下面这个方法读出来的 NewsPic.DescriptionUrl = dr["news_upfile"].ToString(); //Response.Write(NewsPic.DescriptionUrl); //Response.End();
但但在前台显示的时候就不行了 用<asp:Image ID="NewsPic" runat="server" ImageUrl="NewsPic.DescriptionUrl" /> 用<asp:Image ID="Image1" runat="server" ImageUrl="<%#NewsPic.DescriptionUrl %>"" /> 等方法都不行,所以来请蓝鲸等高手告诉我一个方法。
编辑历史:[此帖最近一次被 Kennytian 编辑过(编辑时间:2006-04-10 00:31:01)]
|
浮尘
职务:普通成员
等级:3
金币:7.0
发贴:1258
注册:2001/11/19 12:41:09
|
#82006/4/11 14:34:39
怎么还用ASP的思路啊? NewsPic.ImageUrl=dr["news_upfile"].ToString();
|
Kennytian
职务:普通成员
等级:1
金币:0.0
发贴:10
注册:2005/10/25 10:56:58
|
#92006/4/11 23:29:40
diffmaker和蓝鲸两位大哥一般是用什么方法读取图片呢?
小弟现在工作就是以ASP为主,所以思想一下转不过来,呵呵
|
蓝鲸
职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
|
#102006/4/12 1:31:24
文件名用相对路径需要做些其它的事, 如果用相对路径,可以用这样方法,把文件上传至一专有目录下,数据库只存储文件名,不存储路径,显示的时候路径是要另外加上去的。 当然如果如果做得专业些,可以把路径设置在config文件中,利用XML序列化地方法,很快得到路径。当然序列化在.net中很有用的。
也有用绝对路径的,这一般是在文章编辑器中用得比较多。因编辑器的目录和文章所在目录不一定相同,并且有些html文件生成的,目录深度会相差很多,这样就不能用相对目录了。用相对目录很可能编辑器显示好好的,但在文章中就出现断链。所以用绝对路径还较省力。但用绝对路径缺点是需要存在数据库中,并且域名变化了,所有的链接都断了。但还是有方法的,用SQL语句批量替换网站地址
非常大鱼
|
Kennytian
职务:普通成员
等级:1
金币:0.0
发贴:10
注册:2005/10/25 10:56:58
|
#112006/4/14 1:25:09
上传控件的一个小问题,请教蓝鲸等高手,我下面这段代码只能把上传的文件命名为服务器时间(没有毫秒)+原文件名
我想把上传的文件名重新命名为服务器时间(跟上4位毫秒),请问就下面这段代码应该怎么写?
protected void btnUpload_Click(object sender, EventArgs e) { if (File1.PostedFile.FileName != null) { string FileName = this.File1.PostedFile.FileName; string NowTime = DateTime.Now.ToString("yyyyMMddHHmmss"); string NewFileName = NowTime + FileName.Substring(FileName.LastIndexOf("\\") + 1); string FileType = FileName.Substring(FileName.LastIndexOf(".") + 1).ToLower(); if (FileType == "jpg" || FileType == "bmp" || FileType == "gif" || FileType == "png") { File1.PostedFile.SaveAs(Server.MapPath("../UpFile") + "\\" + NewFileName); txtPicPath.Text = "UpFile/" + NewFileName.ToString(); } else { Response.Write("<script language='javascript'>alert('上传的图片格式不对!');</script>"); } } }
|