主题:  请问蓝鲸等高手一个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>");
}
}
}