用SQLServer为Web浏览器提供图像1
微软SQLServer数据库服务器能够在SQL数据库里保存图片和大量的文本.图片和文本使用的数据类型分别是image图片类型和text文本类型.假如使用VB或VC开发前端应用程序,在windows操作系统上运行,那么可以容易地从SQL数据库里提取图片数据,把它放入一个文件,并在屏幕上显示出来.但是,要是想从SQLServer得到图片,并在Web浏览器里显示,就不那么容易了.虽然在微软SQLServer6.5里提供了Web助理和存储过程sp_makewebtask,sp_runwebtask,它们能够把SQL数据库里的数据转化成HTML文件,但是我们有更好的解决办法.使用Web助理的一个问题是,它不接受图片数据类型的字段.另一方面,存储过程sp_makewebtask的参数太多,很难使用,而且也很难对Web页面进行自定义.
我们在这里提供了一个解决方案,把图片从SQL数据装载到Web浏览器,这个方案要比sp_makewebtask好.我们用一个ActiveX动态链接库和ASP页面开发了一个Web项目.动态链接库负责打开到保存图片的SQL数据库的连接,从数据库提取
图片并把它们保存在临时文件里.ASP和动态链接库进行通信,取得临时图片文件的位置.这样,当访问者点击Web站点时,图片就会下载到他的浏览器.在这篇文章里,我们要介绍设置SQL数据库的步骤.然后,我们还要介绍如何利用VB5和活动数据对象ADO1.5建立ActiveX动态链接库.最后,我们还要讨论建立ASPWeb项目,连接到SQL数据库以及编写ASP文件的处理过程.
设置SQL数据库
这篇文章里使用的数据库非常简单,只包含一个表,名字叫Products,代表普通小杂货店里的各种不同的商品.设置数据库的第一步是建在微软SQLServer里建立一个数据库设备(译者注:在SQLServer7.0里,数据库设备的概念已经取消).虽然可以编写SQL脚本来设置数据库,但是使用SQL企业管理器操作更容易些.打开企业管理器,在树中选择数据库设备(DatabaseDevice).单击鼠标右键,在快捷菜里选择新建设备(NewDevice).在名称(Name)字段里,输入Grocevb_dev,把这个设备的大小设置为2MB.然后,单击建立(CreateNow)按钮,就建立了数据库.接着,用同样的
方法建立另一个数据库设备,作为日志文件.给这个设备起名叫Grocevb_log,把它的大小设置为1MB.
下一步,需要建立一个新的数据库.在树中选择数据库(Database),单击右键.然后,在弹出菜单里选择新建数据库(NewDatabase).在建立新数据库对话框里,输入数据库名称grocevb,并从下拉列表里选择前面建立的Grocevb_dev作为数据设备,Grocevb_log作为日志设备.然后,单击建立(CreateNow)按钮,数据库就建立了.我们暂时忽略有关数据库安全性,数据库备份,用户访问等方面的问题,因为它们跟这篇文章没有直接的关系.
我们建立的数据库只有一个表,表名是Products.在这个表里有几个字段,其中,有两个字段prod_image和prod_imagetype需要特别说明.prod_image字段的数据类型是image图片,在这个字段里保存某个产品的图片.prod_imagetype字段保存图片的类型,比如.gif或.jpg,这是在互联网上最常用的两种图片类型.这个表的主关键字是prod_id,它是非集簇的索引.这样,每个图片都有一个唯一的prod_id.在列表A里给出了建立Products表的SQL脚本.在这个表里,只放了四个产品,用于本文演示.
列表A:建立products表的脚本.
/**用来建立ImageLoaderVB动态链接库使用的产品表.**/CREATETABLEProducts(prod_idintCONSTRAINTpk_prodPRIMARYKEY
NONCLUSTEREDIDENTITY(1,1),categ_idintNULLCONSTRAINTfk_prod
REFERENCEScategories(categ_id),prod_nameNONCLUSTERED,prod_unitpricemoneyNOTNULL,char(80)NOTNULLUNIQUE
prod_unitquantchar(15)NOTNULL,prod_descvarchar(255)NULLDEFAULT('unknown'),
prod_imagetypechar(3)NOTNULL,prod_imageimageNOTNULL,)GO
ASP连接11种数据库语法总结
ASP连接11种数据库语法总结
经常使用到有关数据库的操作.包括连接代码,SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻去.一些比较少用的数据库还不一定能顺利找到,所以现在把它们全归纳到这里,提供大家参考.(转自PCOnline)
<一>数据库的连接方法:
1.Access数据库的DSN-less连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")adoconn.Open"Driver={MicrosoftAccessDriver(*.mdb)};DBQ="&;_Server.MapPath("数据库所在路径")
2.AccessOLEDB连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")
adocon.open"Provider=Microsoft.Jet.OLEDB.4.0;"&;_"DataSource="&;Server.MapPath("数据库所在路径")
3.SQLserver连接方法:
CODE:setadocon=server.createobject("adodb.recordset")adocon.Open"Driver={SQLServer};Server=(Local);UID=***;PWD=***;"&;_"database=数据库名;"
4.SQLserverOLEDB连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")adocon.open"provider=SQLOLEDB.1;DataSource=RITANT4;"&;_"userID=***;Password=***;"&;_"initalCatalog=数据库名"
5.Oracle连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")adocon.open"Driver={microsoftodbcfor
oracle};server=oraclesever.world;uid=admin;pwd=pass;"
6.OracleOLEDB连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")adocon.open"Provider=OraOLEDB.Oracle;datasource=dbname;userid=admin;password=pass;"
7.dBase连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")adocon.open"Driver={microsoftdriver(*.dbf)};driverid=277;dbq=------------;"dbase
8.mySQL连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")
adocon.open"Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"
9.VisualFoxpro连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")adocon.open"Driver={microsoftVisualFoxpro
driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
10.MStext连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")adocon.open"Driver={microsoft*.csv)};dbq=-----;"&;_"extensions=asc,csv,tab,txt;PersistSecurityInfo=false;"textdriver(*.txt;
11.MStextOLEDB连接方法:
CODE:setadocon=Server.Createobject("adodb.connection")
adocon.open"Provider=microsof.jet.oledb.4.0;datasource=your_path;"&;_"ExtendedProperties'text;FMT=Delimited'"
<二>常用的四种SQL命令:
1.查询数据记录(Select)
语法:Select字段串行FromtableWhere字段=内容例子:想从book表中找出作者为"cancer"的所有记录,SQL语句便如下:
CODE:[Copyauthor='cancer'
to
clipboard]select
*
from
book
where
"*"是取出book表所有的字段,如查询的字段值为数字,则其后的"内容"便无须加上单引号,如是日期,则在Access中用(#)包括,而在SQLserver中则用(')包括,如:
CODE:select*frombookwhereid=1select*frombookwherepub_date=#2002-1-7#(Access)
select*frombookwherepub_date='2002-1-7'(SQLServer)提示:日期函数to_date不是标准sql文,不是所有的数据库适用,所以大家在使用的时候要参考数据库具体语法
另外如果是查询传入的变量,则如下:
CODE:strau=request.form("author")strsql="select*frombookwhereauthor='"&;strau&;"'"如果查询的是数字,则:
CODE:intID=request.form("id")strsql="select*frombookwhereid="&;intID在很多数据库中,如:oracle,上面的语句是可以写成:
CODE:strsql="select*frombookwhereid='"&;intID&;"'"但是字符型一定不能按照数字格式写,需要注意.
2.添加记录(Insert)
语法:
CODE:Insertintotable(field1,field2,....)Values(value1,value2,....)例子:添加一作者是"cancer"的记录入book表:
CODE:insertintobook(bookno,author,bookname)values('CF001','cancer','Cancer无组件上传程序')同样,如果用到变量就如下:
CODE:strno=request.form("bookno")strau=request.form("author")strname=request.form("bookname")strsql="insertintobook(bookno,author,bookname)values
('"&;strno&;"','"&;strau&;"','"&;strname&;"')"
3.用Recordset对象的Addnew插入数据的方法:
语法:
CODE:rs.addnewrs("field1").value=value1rs("field2").value=value2...rs.update
4.修改数据记录(Update)
语法:
CODE:updatefieldx=valuex例子:
table
set
field1=value1,field2=value2,...where
CODE:updatebooksetauthor='babycrazy'wherebookno='CF001'如果用到变量就如下:
CODE:strno=request.form("bookno")strau=request.form("author")strsql="updatebooksetauthor='"&;strau&;"'where
bookno='"&;strno"'"
5.Recordset对象的Update方法:
语法:
CODE:rs("field1").value=value1rs("field2").value=value2...rs.update注意:使用语法3和语法5的时候,一定要注意字段的类型(尤其是日期型)一致,否则出错的几率非常的高.
例子:
CODE:strno=request.form("bookno")strau=request.form("author")
setadocon=server.createobject("adodb.connection")adocon.open"Driver={MicrosoftAccessDriver(*.mdb)};DBQ="&;_Server.Mappath=("/cancer/cancer.mdb")strsql="select*frombookwherebookno='"&;strno&;"'"setrs=server.createobject("adodb.recordset")rs.openstrsql,adconn,1,3ifnotrs.eofthen'如果有此记录的话rs("author").value=straurs.updateendifrs.closesetrs=nothingadocon.closesetadocon=nothing
6.删除一条记录(Delete)
语法:
CODE:Deletetablewherefield=value
例子:删除book表中作者是cancer的记录
CODE:deletebookwhereauthor='cancer'(注意:如果book表中author字段的值为cancer的记录有多条,将会删除所有author为cancer的记录)
好了,学会了用这些操作,大家在用asp操作数据库的时候,该是没有什么问题了.9:20|添加评论|固定链接|引用通告(0)|记录它|计算机与Internet1月10日.net获取用户电脑名,IP,当前电脑用户1.在ASP.NET中专用属性:获取服务器电脑名:Page.Server.ManchineName获取用户信息:Page.User获取客户端电脑名:Page.Request.UserHostName获取客户端电脑IP:Page.Request.UserHostAddress
2.在网络编程中的通用方法:获取当前电脑名:staticSystem.Net.Dns.GetHostName()根据电脑名取出全部IP地址:static
System.Net.Dns.Resolve(电脑名).AddressList也可根据IP地址取出电脑名:static
System.Net.Dns.Resolve(IP地址).HostName
3.系统环境类的通用属性:当前电脑名:staticSystem.Environment.MachineName当前电脑所属网域:static
System.Environment.UserDomainName当前电脑用户:staticSystem.Environment.UserName
4利用System.Security.Principal;
if(User.Identity.IsAuthenticated){WindowsIdentityCurrentIdentity=
WindowsIdentity.GetCurrent();message.Text="用户的windows登陆名
称:"+CurrentIdentity.Name+"
";Response.Write(str.Substring(0,4));}
12:10|添加评论|固定链接|引用通告(0)|记录它|计算机与InternetASP.NET中时间格式的转换有时候我们要对时间进行转换,达到不同的显示效果默认格式为:2005-6-614:33:34如果要换成成200506,06-2005,2005-6-6或更多的该怎么办呢我们要用到:DateTime.ToString的方法(String,IFormatProvider)
usingSystem;usingSystem.Globalization;Stringformat="D";DateTimedate=DataTime,Now;Response.Write(date.ToString(format,DateTimeFormatInfo.InvariantInfo));结果输出Thursday,June16,2005
参数format格式详细用法格式字符关联属性/说明dShortDatePatternDLongDatePatternf完整日期和时间(长日期和短时间)
FFullDateTimePattern(长日期和长时间)g常规(短日期和短时间)G常规(短日期和长时间)m,MMonthDayPatternr,RRFC1123Patterns使用当地时间的SortableDateTimePattern(基于ISO8601)tShortTimePatternTLongTimePatternuUniversalSortableDateTimePattern用于显示通用时间的格式U使用通用时间的完整日期和时间(长日期和长时间)y,YYearMonthPattern
下表列出了可被合并以构造自定义模式的模式.这些模式是区分大小写的;例如,识别"MM",但不识别"mm".如果自定义模式包含空白字符或用单引号括起来的字符,则输出字符串页也将包含这些字符.未定义为格式模式的一部分或未定义为格式字符的字符按其原义复制.
格式模式说明d月中的某一天.一位数的日期没有前导零.dd月中的某一天.一位数的日期有一个前导零.ddd周中某天的缩写名称,在AbbreviatedDayNames中定义.
dddd周中某天的完整名称,在DayNames中定义.M月份数字.一位数的月份没有前导零.MM月份数字.一位数的月份有一个前导零.MMM月份的缩写名称,在AbbreviatedMonthNames中定义.MMMM月份的完整名称,在MonthNames中定义.y不包含纪元的年份.如果不包含纪元的年份小于10,则显示不具有前导零的年份.yy不包含纪元的年份.如果不包含纪元的年份小于10,则显示具有前导零的年份.yyyy包括纪元的四位数的年份.gg时期或纪元.如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式.h12小时制的小时.一位数的小时数没有前导零.hh12小时制的小时.一位数的小时数有前导零.H24小时制的小时.一位数的小时数没有前导零.HH24小时制的小时.一位数的小时数有前导零.m分钟.一位数的分钟数没有前导零.mm分钟.一位数的分钟数有一个前导零.s秒.一位数的秒数没有前导零.ss秒.一位数的秒数有一个前导零.f秒的小数精度为一位.其余数字被截断.ff秒的小数精度为两位.其余数字被截断.
fff秒的小数精度为三位.其余数字被截断.ffff秒的小数精度为四位.其余数字被截断.fffff秒的小数精度为五位.其余数字被截断.ffffff秒的小数精度为六位.其余数字被截断.fffffff秒的小数精度为七位.其余数字被截断.t在AMDesignator或PMDesignator中定义的AM/PM指示项的第一个字符(如果存在).tt在AMDesignator或PMDesignator中定义的AM/PM指示项(如果存在).z时区偏移量("+"或"-"后面仅跟小时).一位数的小时数没有前导零.例如,太平洋标准时间是"-8".zz时区偏移量("+"或"-"后面仅跟小时).一位数的小时数有前导零.例如,太平洋标准时间是"-08".zzz完整时区偏移量("+"或"-"后面跟有小时和分钟).一位数的小时数和分钟数有前导零.例如,太平洋标准时间是"-08:00".:在TimeSeparator中定义的默认时间分隔符./在DateSeparator中定义的默认日期分隔符.%c其中c是格式模式(如果单独使用).如果格式模式与原义字符或其他格式模式合并,则可以省略"%"字符.\c其中c是任意字符.照原义显示字符.若要显示反斜杠字符,请使用"\\".
只有上面第二个表中列出的格式模式才能用于创建自定义模式;在第一个表中列出的标准格式字符不能用于创建自定义模式.自定义模式的长度至少为两个字符;例如,
DateTime.ToString("d")返回DateTime值;"d"是标准短日期模式.DateTime.ToString("%d")返回月中的某天;%d""是自定义模式.DateTime.ToString("d")返回后面跟有一个空白字符的月中的某天;"d"是自定义模式.
比较方便的是,上面的参数可以随意组合,并且不会出错,多试试,肯定会找到你要的时间格式如要得到2005年06月这样格式的时间可以这样写:date.ToString("yyyy年MM月",DateTimeFormatInfo.InvariantInfo)如此类推常用SQL字符串函数常用SQL字符串函数今天一同学在群里问我一个问题.
问:
请教一个SQL
2000
SEVER问题:
select*fromitemcodewherecodelike'40%'如何让code=40101001变成code=401-01-001目前有666个CODE是类似40101001用什么语句能把它变成401-01-001
答:updateitemcodeset
code=replace(code,left(code,8),left(code,3)+'-'+substring(code,4,2)+'-'+substring(code,6,3))wherecodelike'40%'
问:replace(code,left(code,8),left(code,3)+'-'+substring(code,4,2)+'-'+substring(code,6,3))是什么意思?
答:拿code=123456789做例子a=left(code,8)=12345678b=left(code,3)=123c=substring(code,4,2)=45
d=substring(code,6,3)=678e=b+'-'+c+'-'+e=123-45-678f=replace(code,a,e)=123-45-6789配合下边的来看,应该能明白了1,left(code,8)取前8位2,substring(code,4,2)从第4位开始取2位3,+是字符串连接符4,replace(a,str1,str2)将a中的str1替换为str2
几问几答下来,我就想着要整理一份完整的SQL字符串函数出来,借以学习和方便以后查询.
SQL字符串函数
字符串函数对二进制数据,字符串和表达式执行不同的运算.此类函数作用于CHAR,VARCHAR,BINARY,和VARBINARY数据类型以及可以隐式转换为CHAR或VARCHAR的数据类型.可以在SELECT语句的SELECT和WHERE子句以及表达式中使用字符串函数.常用的字符串函数有:
一,字符转换函数
1,ASCII()返回字符表达式最左端字符的ASCII码值.在ASCII()函数中,纯数字的字符串可不用''括起来,但含其它字符的字符串必须用''括起来使用,否则会出错.
2,CHAR()将ASCII码转换为字符.如果没有输入0~255之间的ASCII码值,CHAR()返回NULL.
3,LOWER()和UPPER()LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写.
4,STR()把数值型数据转换为字符型数据.STR([,length[,]])
length指定返回的字符串的长度,decimal指定返回的小数位数.如果没有指定长度,缺省的length值为10,decimal缺省值为0.当length或者decimal为负值时,返回NULL;当length小于小数点左边(包括符号位)的位数时,返回length个*;先服从length,再取decimal;当返回的字符串位数小于length,左边补足空格.
二,去空格函数1,LTRIM()把字符串头部的空格去掉.
2,RTRIM()把字符串尾部的空格去掉.
三,取子串函数1,left()LEFT(,)返回character_expression左起integer_expression个字符.
2,RIGHT()
RIGHT(,)返回character_expression右起integer_expression个字符.
3,SUBSTRING()SUBSTRING(,,length)返回从字符串左边第starting_position个字符起length个字符的部分.
四,字符串比较函数1,CHARINDEX()返回字符串中某个指定的子串出现的开始位置.CHARINDEX(<'substring_expression'>,)其中substring_expression是所要查找的字符表达式,expression可为字符串也可为列名表达式.如果没有发现子串,则返回0值.此函数不能用于TEXT和IMAGE数据类型.
2,PATINDEX()返回字符串中某个指定的子串出现的开始位置.PATINDEX(<'%substring_expression%'>,)其中子串表达式前后必须有百分号"%"否则返回值为0.
与CHARINDEX函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR,VARCHAR和TEXT数据类型.
五,字符串操作函数1,QUOTENAME()返回被特定字符括起来的字符串.QUOTENAME(<'character_expression'quote_character])其>[,中quote_character标明括字符串所用的字符,缺省值为"[]".
2,REPLICATE()返回一个重复character_expression指定次数的字符串.REPLICATE(character_expressioninteger_expression)如果
integer_expression值为负值,则返回NULL.
3,REVERSE()将指定的字符串的字符排列顺序颠倒.REVERSE()其中character_expression可以是字符串,常数或一个列的值.
4,REPLACE()返回被替换了指定子串的字符串.REPLACE(,用,替换在
)
string_expression3
string_expression1中的子串string_expression2.
4,SPACE()返回一个有指定长度的空白字符串.SPACE()如果integer_expression值为负值,则返回NULL.
5,STUFF()用另一子串替换字符串指定位置,长度的子串.STUFF(,,,)如果起始位置为负或长度值为负,或者起始位置大于character_expression1的长度,则返回NULL值.如果length长度大于character_expression1中start_position以右的长度,则character_expression1只保留首字符.
六,数据类型转换函数1,CAST()CAST(AS[length])
2,CONVERT()CONVERT([length],[,style])
1)data_type为SQLServer系统定义的数据类型,用户自定义的数据类型不能在此使用.2)length用于指定数据的长度,缺省值为30.3)把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型,结果必须是带正号或负号的数值.4)TEXT类型到CHAR或VARCHAR类型转换最多为8000个字符,即CHAR或VARCHAR数据类型是最大长度.5)IMAGE类型存储的数据转换到BINARY或VARBINARY类型,最多为8000个字符.6)把整数值转换为MONEY或SMALLMONEY类型,按定义的国家的货币单位来处理,如人民币,美元,英镑等.7)BIT类型的转换把非零值转换为1,并仍以BIT类型存储.8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示"+",以标识发生了这种截断.9)用CONVERT()函数的style选项能以不同的格式显示日
期和时间.style是将DATATIME和SMALLDATETIME数据转换为字符串时所选用的由SQLServer系统提供的转换样式编号,不同的样式编号有不同的输出格式.
七,日期函数1,day(date_expression)返回date_expression中的日期值
2,month(date_expression)返回date_expression中的月份值
3,year(date_expression)返回date_expression中的年份值
4,DATEADD()DATEADD(,,)返回指定日期date加上指定的额外日期间隔number产生的新日期.参数"datepart"取值如下:
5,DATEDIFF()DATEDIFF(,,)返回两个指定日期在datepart方面的不同之处,即date2超过date1的差距值,其结果值是一个带有正负号的整数值.
6,DATENAME()DATENAME(,)以字符串的形式返回日期的指定部分此部分.由datepart来指定.
7,DATEPART()DATEPART(,)以整数值的形式返回日期的指定部分.此部分由datepart来指定.DATEPART(dd,date)等同于DAY(date)DATEPART(mm,date)等同于MONTH(date)DATEPART(yy,date)等同于YEAR(date)
8,GETDATE()
以DATETIME的缺省格式返回系统当前的日期和时间10:22|添加评论|固定链接|引用通告(0)|记录它|SQL3月29日ThreadThread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于Wait或者Sleep或者Join线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数;
Thread.Abort():以开始终止此线程的过程.如果线程已经在终止,则不能通过Thread.Start()来启动线程.14:38|添加评论|固定链接|引用通告(0)|记录它|计算机与Internet
3月28日PsPcngba/read-htm-tid-165055-fpage-1.html13:46|添加评论|固定链接|引用通告(0)|记录它3月27日c#贴士回车换行"\r\n"10:23|添加评论|固定链接|引用通告(0)|记录它3月20日有用的网址韩国网址大全krurl/图库tucoo/编程动网down.dvbbs.net/源码下载:codepub/index.htmlnetbei/Article/php/
dcn/sub_class.asp?id=11&;page=1
ljdn/AspxOS_bbs.aspx?A=D1_4&;TD=568&;NP=0huolx.t2008/index.asp99inf.net/Article/netjc/csharpl/2005-05-24/21018.html
14:50|添加评论|固定链接|引用通告(0)|记录它3月16日aspx小贴士dcn/sub_class.asp?id=11&;page=117:08|添加评论|固定链接|引用通告(0)|记录它asp.net中容易犯的错误1.使用serversideinclude给ASPX引入共同的页面构图.在ASP.NET的机制下,应使用ASCX(webusercontrol)来实现.ASCX提供了更多可控制接口.并且更重要的是,ASCX是一个类.一个实实在在的类.可以全面控制它.2.不使用web.configweb.config提供了非常丰富的配置管理接口.是一个应用程序最核心的部分.但是很多人的web.config往往是空的.或者就从来没有修改过.
web.config主要是保留服务器的配置的和全局的信息,这个在TelligentSystems的forums的代码中大大的体现:1.引入名称空间信息2.数据访问,文件上传目录,资源文件目录等全局信息
3.使用Response.Write向前端输出消息ASP.NET平台下的Response和ASP的Response有很大的不
同.虽然表示同一含义,但用法上已经大不相同.Response.Write的内容只会输出到页的最前端.向前端输出消息的正确方法是使用PlaceHolder.~~~~~~~~~~~这点说不上是任何技巧,熟悉HTML的人都应该知道这样做
4.使用一系列session管理用户连接状态这种方法在ASP里被滥用.在ASP.NET环境下,正确的做法应该是设计一个类.结构化地保存数据.将对session或者cookie的访问封装起来.~~~~~~~~~~~~~~意思应该是说把用户这个对象保存起来吧,这个的确应该如此
5.使用session验证身份这几乎是通病.ASP.NET提供了一组用于用户身份验证的API.类型是forms验证或者windows验证.这一点quickstart有一节讲解得很清楚.可以绝大部分人还是依靠给session赋值来保持用户身份验证状态.
~~~~~~~~~~~~~~很多人的确是这样使用,自己也有这样的毛病,应该改改
6.使用Response.Redirect重定向页这一点在必要的时候可以使用.但不可滥用.事实证明滥用重定向将导致逻辑上的严重混乱.这是在以页为程序单元的时候的做法.使用frontcontroller模式将使用户的操作逻辑集中起来]
~~~~~~~~~~~~~response.redirect只是页面跳转而已
7.使用太多ASPX页ASP环境下的程序单元只有*.asp页,ASP.NET可不是这样,还有后端的类库,ASCX等等.应将业务逻辑分别集中在不同的单元,而不应该一项操作使用一个ASPX.更多时候ASPX将做为ASCX或者customcontrol的容器而管理页内逻辑.ASPX重用ASCX的同时,ASPX也做为统一的页构图重用.
8.在多个逻辑单元之间复制代码并修改相应逻辑重用.重用.重用.处理此类问题的原则是不出现任何相同或相似的过程.如果你用上面的方法,一旦出现重大逻辑更改,带来的结果将是灾难性的.~~~~~~~~~~~~~~~~~~~
增加代码复用性,就应该少"复制"代码
9.害怕使用DataSet.很多人被DataSet吓坏了.认为"肯定"影响性能.但连最初的尝试都不敢.他们总认为他们的产品一定重大,设计上应该"慎重"他们往往使用ArrayList或者设计低级的类来保存集合数.据.进行艰难的数据倒入工作.~~~~~~~~~~~~~~~~~~~~~~~自己设置的类也是有自己的好处的,如果数据集合之后没有联系,那直接用dataTable即可.
10.对"性能"过多注意.对ASP.NETViewState的机制特别不满.或者总是挖空心思迫害人家.反倒把自己弄得很累.如果在对付ViewState的同时多注意少连几次数据库也许更文明些.
~~~~~~~~~~~~~~~如果开发使用人数比较少的系统,性能考虑倒不是主要,因为一般的服务器都可以伺候比较多的人数,如果性能可能成为系统瓶颈,那就应该大大的优化,少用服务器控件
11.应用程序根目录很乱.
ASP.NET是开发项目.不是网站.应该把不同的资源分类放置.例如把所有静态资源(样式表,脚本,图像)组织到一起.甚至可以写一组API来管理他们.ASPX应该放在一起.ASCX应该放在一起..*.cs呢?应该把他们放到另外一个project里.~~~~~~~~~~~~~这个同意,至少数据访问层要做为单独的类库.
12.不厌其烦的写访问数据库的过程应该把这工作交给DataAccessApplicationBlock.你自己还要开关connection,何苦呢.
13.自己写的东西最靠得住.事实往往正好相反.多注意使用人家写好的产品.又不收你钱,何苦那么爱面子呢.
14.胡乱命名ASPX文件名这是最让人痛苦的了.ASPX文件名不仅需要容易识别.还应该遵循一定规则.因为behind每个ASPX都会有一个同名的类,想象一下,多难受.另外大部分人不知道管理自己的项目的namespace.让人好像看到一本帐一样.
15.从来不作继承或派生
一些具有相同行为的类,应该从公共的基类派生出来.实际意义上,我们的ASPX应该有一个基类PageBase.因为总有一些公共的特性需要抽象出来.
16.零property他们的类(ASPX所对应)里只有privatemethod.不公开自己的任何秘密.可以这一定是JAVA的遗老干的事.
17.零ASCX不用说,他还没学会ASP.NET
18.使用DreamWeaver"画"ASPX这批人是美工.甚至有一些人在非常陶醉地讨论如何更好地"整合"DreamWeaver和VisualStudio.
19.
只
熟
悉
System.Web.UI.WebControl
和
System.Data.SqlClient应该还有一些值得熟悉的类库.
20.零注释这些都是心里很明白的快手.一任IDE生成的缺省注释横在那里不管.
21.零事件对"事件驱动"一无所知.只知道在Page_Load()里写过程.或者双击一个按钮写Xxx_Clock()过程.在他们的程序里看不到event和delegate.
SqlServer中Image类型字段在VB.NET中的读写操作DimtmpImgAsimageDimrAsDataRowDimmsAsNewMemoryStreamDimdata()AsByter=myDataSet.Tables(myTableName).NewRowtmpImg=Image.FromFile("c:\xxx.jpg")tmpImg.Save(ms,System.Drawing.Imaging.ImageFormat.J
peg)tmpImg.Dispose()ReDimdata(ms.Length)ms.Position=0ms.Read(data,0,System.Convert.ToInt32(ms.Length))......r("pic")=datamyDataSet.Tables(myTableName).Rows.Add(r)...2.图片数据的读出DimtmpImgAsimageDimrAsDataRowDimmsAsNewMemoryStreamDimdata()AsByteDimrAsIntegerdata=myDataSet.Tables(myTableName).Rows(r).Item("pic")ms=NewMemoryStreamms.Write(data(0),0,data(0).GetUpperBound(0))
'在窗体中显示
Me.pic0.Image=Image.FromStream(msImg(0))
'存入到文件IfFileI.Exists("c:\xxx.jpg")ThenFile.Delete("c:\xxx.jpg")EndIffs=File.Create("c:\xxx.jpg")fs.Write(data,0,data.GetUpperBound(0))fs.Close()
如何将.bmp文件读入image数据类型的字段中去?Image.Picture.LoadFromFile(...)ADOQuery.FieldByName('...').Assign(Image.Picture);
varms:TMemoryStream;beginImage1.Picture.LoadFromFile(...);ms:=TMemoryStream.Create;tryImage1.Picture.Bitmap.SaveTostream(ms);ms.Position:=0;ADOQuery1.Edit;TBlobField(ADOQuery1.FieldByName('img')).LoadFromStream(ms);ADOQuery1.Post;Finallyms.Free;end;end;