在做Asp.Net开发的时候,经常会遇到页面乱码的问题,下面是在网上收集的相关资料,请大家参考:

解决的方法一般有3种:

1.设置web.config文件

<system.web>

......

<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />

......

</system.web>

2.传递中文之前,将要传递的中文参数进行编码,在接收时再进行解码。

>> 进行传递

string Name = "中文参数";

Response.Redirect("B.aspx?Name="+Server.UrlEncode(Name)) ;

>> 进行接收

string Name = Request.QueryString["Name"];

Response.Write(Server.UrlDecode(Name)) ;

3.如果是从 .HTML 文件向 .Aspx 文件进行传递中文参数的话(即不从后台用 Redirect()方法进行 Url 转换)。一样要将传递的中文参数进行编码,在接收时再进行解码。

>> 进行传递

<script language="JavaScript">

function GoUrl()


{

var Name = "中文参数";

location.href = "B.aspx?Name="+escape(Name) ;

}

<body onclick="GoUrl()">

>> 进行接收

string Name = Request.QueryString["Name"];

Response.Write(Server.UrlDecode(Name)) ;

总结:

一般来说。设置web.config文件就可以了。但是如果你用 JavaScript 调用 webservice 方法的话(往webservice里面传递中文参数)。设置 web.config 文件好象无效。

或用

Response.Redirect("test1.aspx?111="+System.Web.HttpUtility.UrlEncode("中华人明共和国")) ;

//建议使用最后如果是从其他的页面获取中文参数没有乱码,那就更简单了

string message ="http://localhost/Test/test1.aspx?111="+System.Web.HttpUtility.UrlEncode("中华人明共和国");

http:

//你要获取某个页面的返回值的地址"

//发送请求

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(message) ;

//接受请求

HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse() ;

Stream receiveStream = myHttpWebResponse.GetResponseStream() ;

StreamReader readStream = new StreamReader(receiveStream, System.Text.Encoding.GetEncoding("GB2312")) ;

//此为要取页面的返回值输出的返回结果

returnValue = readStream.ReadToEnd();

转摘自:http://hi.baidu.com/miracletan2008/blog/item/81edad988179ce016f068c28.html

1 设计处理图片的HttpHandler处理程序
添加一个“一般处理程序”模板,修改其中的代码,如下:
public void ProcessRequest(HttpContext context){
//判断是否是本地引用,如果是则给客户端返回正确的图片,这里的判断用到了http请求中所记录的页信息
//如果是网站,可将“localhost”修改为网站地址
if(context.Request.UrlReferrer.Host=="localhost"){
   //设置客户端缓冲文件过期时间为0,即立即过期
   context.Response.Expires=0;
   //清空服务器端为此会话开辟的输出缓存
   context.Response.Clear();
   //获得文件类型
   context.Response.ContentType="image/jpg";
   //将请求文件写如到输出缓存中
   context.Response.WriteFile(context.Request.PhysicalPath);
   context.Response.End();
}
//如果不是本地引用,则属于盗链引用,给客户端返回错误的图片
else{
   context.Response.Expires=0;
   context.Response.Clear();
   context.Response.ContentType="image/jpg";
   //将报告错误的图片文件写如到输出缓存中
   context.Response.WriteFile(context.Request.PhysicalApplicationPath+"error.jpg");
   context.Response.End();
}
}
public bool IsReusable{
get{
   return true;
}
}
将上述代码复制到一个类文件中,在App_Code目录下
在应用配置中注册HttpHandler,打开“web.config”,在“system.web”节点下,添加处理程序的注册信息,如下:
<httpHandlers>
<add verb="*" path="*.jpg" type="Handler" />
</httpHandlers>
在IIS中配置图片的特殊处理程序
虽然在应用程序中已经配置好了处理“.jpg”文件的程序,但浏览器的请求是直接发送给IIS的,而不是给应用程序,所以还需要在IIS中配置,使得当浏览器请求“.jpg”文件类型时,IIS可以交由ASP.NET处理,配置步骤如下:
(1) 打开系统自带的“Internet信息服务”,在左侧目录树中,右击“网站”节点。在弹出的快捷菜单中,选中“属性”菜单命令,打开网站的属性对话框,切换到“主目录”选项卡界面,单击“配置”按钮,打开“应用程序配置”对话框。“应用程序映射”列表框中,罗列出了IIS所有能够处理的文件格式,以及这些格式对应的处理程序。在此列表框中选中“.aspx”条目,单击“编辑”按钮,打开“添加/编辑应用程序扩展名映射”对话框,在“可执行文件”文本框中的内容为“C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”。为了让IIS能够将“JPG”格式的文件,正确映射到前面编写的“HttpHandler”处理中,需要为其加载“aspnet_isapi.dll”文件。单击“添加”按钮,打开空白的“添加/编辑应用程序扩展名映射”对话框,在“扩展名”文本框中输入“.jpg”。在“可执行文件”文本框中输入“C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”,单击“确定”,返回到“应用程序配置”对话框,单击“确定”按钮,返回到“网站属性”对话框,在单击其中的“确定”按钮。这样一个防止盗用“.jpg”图片的解决方案就完成了。
防盗链下载实例
以“.rar”压缩包格式为例,实现对非法下载的处理。
在页面中添加一个“LinkButton”控件,并修改其属性“PostBackUrl”为“~/Files/资源文件.rar”。
在类中添加处理请求的方法和返回属性。当请求来自于本站点时,不做任何处理,当请求来自其他站点时,将页面导航到本站的下载页(方法同上),具体代码如下。
public void ProcessRequest(HttpContext context){
if(context.Request.UrlReferrer.Host=="localhost"){
   //允许用户直接下载,不做任何操作
}
else{
   //将请求转到特殊处理页,以实现下载功能
   HttpResponse response=context.Response;
   //导航到下载页面
   response.Redirect(context.Request.PhysicalApplicationPath+"Download.aspx");
}  
}
//返回是否执行此处理程序
public bool IsReusable{
get{
   return true;
}
}
<httpHandlers>
<add verb="*" path="Files/*.rar" type="FileHandler" />
</httpHandlers>
打开IIS,添加应用程序的扩展,扩展名为“.rar”,同上。

转摘自:http://hi.baidu.com/sevenxue2008/blog/item/74f0262694fd0a05908f9d7e.html

标签:

在.NET环境下使用C#防止SQL注入式攻击,我们的解决方式是:

1、首先在UI录入时,要控制数据的类型和长度、防止SQL注入式攻击,系统提供检测注入式攻击的函数,一旦检测出注入式攻击,该数据即不能提交;

2、业务逻辑层控制,通过在方法内部将SQL关键字用一定的方法屏蔽掉,然后检查数据长度,保证提交SQL时,不会有SQL数据库注入式攻击代码;但是这样处理后,要求UI输出时将屏蔽的字符还原。因此系统提供屏蔽字符 的函数和还原字符的函数。

3、在数据访问层,绝大多数采用存储过程访问数据,调用时以存储过程参数的方式访问,也会很好的防止注入式攻击。

转摘自:http://www.chinaz.com/Program/.NET/0H3Sa62009.html

[转摘]编程能力的四种境界

利用心理学解释程序员的专业程度,视角新颖,翻译首发。
人类心理学研究中的一个基础支撑课题就是分析人的思维意识和潜意识。 Sigmund Freud是最早的一位能够清楚的认定和描述我们的心理活动“领域”的人。 在他著名的一生中的早期,他就指出我们的意识里分“潜意识”,“前意识”,“意识”。

如果想弄清楚理解它们跟我们的思想、感觉、认知、判断和动机(这些在我们每日生活、职场中里的关键因素)有什么关联,我们可以把自己想象成一个冰山。 冰山的尖端,唯一能从水面看到的一部分,可以当作是我们的的意识。 它是有逻辑、有组织的,可控的,但这部分很小。而庞大的水下部分则是我们的潜意识。 它们是无组织、无逻辑、无关联的,但它们取能决定我们的各自行为特征。

现代心理学上一直试图通过观察人们在这个“思维冰山”上能打多深的孔来评价他们掌握某一个专业技能的程度,并描述成四个阶段。
 
阶段一:无意识,无能力

小陈是一个年轻的网站开发者。 他是一个法律专业的学生,可他认为他的钱途不在律师行业,所以他灵光闪现,做了转行的决定。 他曾经帮他的朋友修过计算机,而且很成功,自认为这方面应该都很容易。 小陈很快找到了一些能够让他学习、工作的地方(当然,都是靠近他家的)。 六个月后,他向朋友说自己是个网站专家了,简历上也列举了不少汇编语言、应用程序,以及开发平台。

但实际上,小陈是一个冷酷的“拷贝/粘贴”者。 他以为能够成功地显示一个windows提示框,就表示对Javascript已经掌握了。 PHP? 也很简单:他成功的安装了Wordpress、Linux,他从LiveCD上启动了Ubuntu系统,能够搭建一个Apache负载均衡集群服务器。 他的意识告诉他,他已经无所不知了。

可是问题就在于,小陈没有意识到他可以学到更多的东西,所以他就简单地停止了学习的步伐。 他经常访问的在线论坛和邮件列表里有很多人都非常客气地告诉他,他的问题在于他肤浅的知识,但没有人捅破这层窗户纸。 而更悲哀的是,他在论坛里的能力值比你我加起来都高。呵呵,这很搞笑。

小陈是无意识的无能力。
 
阶段二:有意识的无能力

赵明是个数学老师。 他在一个大学里工作,他希望他的大学里能够拥至少是五倍于现有数量的图书馆藏书。 他知道在科技领域方面,他的大学相对于其他研究机构落后很多,所以他决定自己动手去做这个工作。 他想建立一个在线平台,能在社团里共享他们的课程。

赵明是天生的逻辑型的思维, 他知道为了实现这个目标,他需要去做研究,搜集信息。 他的搜索从维基百科开始,但最终在大量的浏览阅读后他明白其实世界上已经有不少团队对他的这种问题提供了开源方案。

他 从那些工程中选择了一个最能满足他的需求的一个。 他开始着手阅读在它的网站上找到的文档和手册,最后他把源程序下载下来。 但他的兴奋状态推着时间推移逐步退去,因为他看到了很多’数据库连接错误’。 他试了又试,不少于三次地检查他的每一步骤,还是不成功。 赵明并不恼怒,因为他知道自己在这个领域并不是专家。

他开始转向它邮件列表平台,在里面,他用他所知道的(其实很少)最精确的语言描述了他的问题。 他提醒每个人,他并不清楚他所做的这个东西,所以,他希望能得到更多的文档去阅读,或人们给他提供这方面的提示。 他不需要等待很久就能得到解决方案,因为他采取了正确的方法。

赵明是有意识的无能力
 
阶段三:有意识的有能力

自从锋仔拿起他的第一本HTML书至今已经有两年了。 很显然这是一条不归路,对于锋仔来说,每天思考的问题都是如何去提高自己喜爱的这个专业。 从他拿起第一本书几个月后,他得到了第一个作为自由工作者开发一个网站的机会,他投入了极大的热情,不管这个工作的薪酬有多低,这个工作有多简单 (甚至是对于他的水平)。他深信一点:最好的学习的方式就是坚持不懈,屡战屡败,屡败屡战。 
他经常去研究如何以最好的方式执行一个功能,因为他知道最好的代码不是第一次就能获得的。 他必须去优化代码,他一遍又一遍地审查。 他一次又一次地修正。
之 后,他又给他自己写了一个大概有30到40行的程序。 几天之后,他忍不住感到失望,因为他在上网时发现了一段更省事的、而且更简洁的程序,代码行只有他的一半。 他渴望知道何时才能轻松的写出如此高质量的代码。 然而,经过一段思考之后,他开始分析自己的代码。 他知道必须去重写这些代码,否则睡觉都不会安稳。 他不愿意去拷贝粘贴它们。
锋仔正走在成为一个优秀的专家的路上,但他不会给自己加上这个称号,他愿意去等,他是有意识的有能力。
 
阶段四:无意识的有能力

这是汇编水平的终极阶段。 它不仅仅是知识积累的结果,更是一系列的逻辑规则在数年里慢慢的刻印到脑海中的结果。

我们面对这样的一个人时,不得不由衷的佩服他对如此复杂的问题,竞能如此轻松地应对。 这种汇编者看起来就像是能够嗅出问题的解决方案,而不是思考出的。

优化的编写,可维护的、安全性的程序,应用各种设计模式,使用正确的开发工具组合,这些会自动的在他的工作中体现出来。 这种人能够轻松的使用多种语言在多种操作系统平台上工作。
 
最后值得一提的是,一些学者提出第五种阶段:成熟的有能力,定义为有能力去教育和传承他所学的、甚至是还未意识到的知识。 我们可以从一些才智超凡的人哪里看到这些特征,他们可以教学和讲解,这些很显然是多年实践经验积累出的技能。
 

网上查了很多方法,都不太好使,不如自己写一个,思路就是把按钮按下时用Javascript在客户端把按钮下一次的onclick事件改为return false; 这样在服务器端页面重新送回客户端之前,再次点击按钮都不会Post到服务端。同时将按钮的style改为一行字的样子,光标也变成沙漏状。当服务端页面重新产生后Button又会回到初始状态。该方法对于F5刷新还不能防范,只是简单封闭了F5的按键,为了防止刷新时再次提交可以在页面返回前将一些TextBox控件清空,这样就可以判断如果该TextBox为空则不再进行后续操作(如写库)。 或是后台操作成功后跳转到另一个页面以防止恶意刷新。主要是考虑在企业内网使用,不是为了防黑客,所以不是非常严格。         

以下为引用的内容:《br/> <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server">
            <title>禁止多次提交网页测试</title>
            <style type="text/css">
            .disable
            {
                border-style:none;
                border-width: thin;
                background-color:Transparent;
                color: #CCCCCC;
                cursor:wait;
            }
            </style>
            <script type="text/javascript" language="javascript">
            function DisableButton()
            {
                document.getElementById("Button2").className  = "disable";
                document.getElementById("Button2").value = '正在提交.';
                document.getElementById("Button2").onclick=Function("return false;");
                return true;
            }
            document.onkeydown=mykeydown;
            function   mykeydown()
            {
                if(event.keyCode==116) //屏蔽F5刷新键
                {
                    window.event.keyCode=0;
                    return   false;
                }
            }
            </script>
        </head>
        <body>
            <form id="form1" runat="server">
            <div>
                输入一些内容<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <br />
                <asp:ListBox ID="ListBox1" runat="server" Height="77px" Width="332px">
            </asp:ListBox><br />
                <asp:Button ID="Button2" runat="server" Text="OK" Width="77px"
                    onclick="Button2_Click" />
            </div>
            </form>
        </body>
        </html>
 

转摘自:http://www.chinaz.com/Program/.NET/11264D292008.html

1. 查看数据库的版本

select @@version

2.查看数据库所在机器操作系统参数

exec master..xp_msver

3. 查看数据库启动的参数

sp_configure

4.查看数据库启动时间

select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1

查看数据库服务器名和实例名

print ''Server Name...............: '' + convert(varchar(30),@@SERVERNAME)

print ''Instance..................: '' + convert(varchar(30),@@SERVICENAME)

5. 查看所有数据库名称及大小

sp_helpdb

重命名数据库用的SQL

sp_renamedb ''old_dbname'', ''new_dbname''

6. 查看所有数据库用户登录信息

sp_helplogins

查看所有数据库用户所属的角色信息

sp_helpsrvrolemember

修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程

更改某个数据对象的用户属主

sp_changeobjectowner [@objectname =] ''object'', [@newowner =] ''owner''

注意: 更改对象名的任一部分都可能破坏脚本和存储过程。

把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本

7. 查看链接服务器

sp_helplinkedsrvlogin

查看远端数据库用户登录信息

sp_helpremotelogin

8.查看某数据库下某个数据对象的大小

sp_spaceused @objname

还可以用sp_toptables过程看最大的N(默认为50)个表

查看某数据库下某个数据对象的索引信息

sp_helpindex @objname

还可以用SP_NChelpindex过程查看更详细的索引情况

SP_NChelpindex @objname

clustered索引是把记录按物理顺序排列的,索引占的空间比较少。

对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。

查看某数据库下某个数据对象的的约束信息

sp_helpconstraint @objname

9.查看数据库里所有的存储过程和函数

use @database_name

sp_stored_procedures

查看存储过程和函数的源代码

sp_helptext ''@procedure_name''

查看包含某个字符串@str的数据对象名称

select distinct object_name(id) from syscomments where text like ''%@str%''

创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数

解密加密过的存储过程和函数可以用sp_decrypt过程

10.查看数据库里用户和进程的信息

sp_who

查看SQL Server数据库里的活动用户和进程的信息

sp_who ''active''

查看SQL Server数据库里的锁的情况

sp_lock

进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.

spid是进程编号,dbid是数据库编号,objid是数据对象编号

查看进程正在执行的SQL语句

dbcc inputbuffer ()

推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句

sp_who3

检查死锁用sp_who_lock过程

sp_who_lock

11.收缩数据库日志文件的方法

收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M

backup log @database_name with no_log

dbcc shrinkfile (@database_name_log, 5)

12.分析SQL Server SQL 语句的方法:

set statistics time {on | off}

set statistics io {on | off}

图形方式显示查询执行计划

在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的图形

文本方式显示查询执行计划

set showplan_all {on | off}

set showplan_text { on | off }

set statistics profile { on | off }

13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法

先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作

alter database [@error_database_name] set single_user

修复出现不一致错误的表

dbcc checktable(''@error_table_name'',repair_allow_data_loss)

或者选择修复出现不一致错误的小型数据库名

dbcc checkdb(''@error_database_name'',repair_allow_data_loss)

alter database [@error_database_name] set multi_user

CHECKDB 有3个参数:

repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,

以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。

修复操作可以在用户事务下完成以允许用户回滚所做的更改。

如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。

如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。

修复完成后,请备份数据库。

repair_fast 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。

这些修复可以很快完成,并且不会有丢失数据的危险。

repair_rebuild 执行由 repair_fast 完成的所有修复,包括需要较长时间的修复(如重建索引)。

执行这些修复时不会有丢失数据的危险。

转摘自:http://www.chinaz.com/Program/MSSQL/050C4O52009.html 

ADO.NET提供了多种对象模型,比较典型的以下有五种,它们全部归类在System.Data.SqlClient名称空间下。

一、SqlConnection对象

ADO.NET使用SqlConnection对象与SQL Server进行连接。连接字符串的常用形式有两种:

1.使用Windows集成安全身份认证,例如:string connectionString ="IntegratedSecurity=SSPI;Database=MyDatabase.mdf;Server=localhost;";

或:string connectionString = "Initial Catalog= MyDataBase; Data Source=localhost;Integrated Security=SSPI;"

2.在连接字符串中指定服务器名、用户id、用户口令、数据库名等信息。例如:string connectionString = "server=localhost; uid=sa; pwd=123; database=MyDatabase.mdf";

然后通过连接字符串直接创建SqlConnection对象,如SqlConnection conn = new SqlConnection(connectionString);

二、SqlCommand对象

在ADO.NET中,有两种操作数据库的方式:

1.无连接的方式;

2.保持连接的方式。

不论采用哪种方式,都可以通过SqlCommand对象提供的方法传递对数据库操作的命令,并返回命令执行的结果。

在保持连接的方式下操作数据库的一般步骤为:

1.创建SqlConnection的实例;

2.创建SqlCommand的实例;

3.打开连接;

4.执行命令;

5.关闭连接。

SqlCommand对象提供了多种完成对数据库操作的方法。常用有:

1.ExecuteNonQuery

该方法执行SQL语句的结果,但不返回命令执行的表数据,仅返回操作所影响的行数。

2.ExecuteReader

ExecuteReader方法提供了只向前的、顺序的快速读取数据库中数据的方法。该方法根据提供的SELECT语句,返回一个可以顺序读取的SqlDataReader对象,编程者可以使用Read方法循环依次读取每个记录中各字段(列)的内容。

3.ExecuteScaler()

该方法用于执行SELECT查询,得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。

三、SqlDataAdapter对象

SqlDataAdapter对象通过无连接的方式完成数据库和本地DataSet之间的交互。使用这种方式操作数据库的一般步骤为:

1.创建SqlConnection的实例;

2.创建SqlDataAdapter的实例,需要的话,根据select语句生成其他SQL语句;

3.创建DataSet的实例;

4.使用Fill方法将数据库中的表填充到DataSet的表中;

5.利用DataGridView或者其他控件对象编辑或显示数据;

6.需要的话,使用Update方法更新数据库。

SqlDataAdapter对象通过SelectCommand、InsertCommand、UpdateCommand和DeleteCommand属性为后台数据库提供对应的操作命令,并传递需要的参数。一般情况下,只需要提供SELECT语句和连接字符串创建SqlDataAdapter对象,然后利用SqlCommandBuilder对象生成InsertCommand、UpdateCommand和DeleteCommand属性。

四、DataTable对象

ADO.NET可以在与数据库断开连接的方式下通过DataSet或DataTable对象进行数据处理,当需要更新数据时才重新与数据源进行连接,并更新数据源。DataTable对象表示保存在本机内存中的表,它提供了对表中行列数据对象的各种操作。可以直接将数据从数据库填充到DataTable对象中,也可以将DataTable对象添加到现有的DataSet对象中。在断开连接的方式下,DataSet对象提供了和关系数据库一样的关系数据模型,代码中可以直接访问DataSet对象中的DataTable对象,也可以添加、删除DataTable对象。

1. 创建DataTable对象

可以通过以下两种方式创建DataTable对象:

1) 通过DataTable类的构造函数创建DataTable对象,例如:

DataTable table = new DataTable();

2) 通过DataSet的Tables对象的Add方法创建DataTable对象,例如:

DataSet dataset = new DataSet();

DataTable table = dataset.Tables.Add("MyTableName");

2. 在DataTable对象中添加列

在DataTable对象中添加列的最常用的方法是通过DataTable对象的Column属性中的Add方法。添加后的每一列都是一个DataColumn对象。

3. 设置DataTable对象的主键

关系数据库中的表一般都有一个主键,用来惟一标识表中的每一行记录。通过DataTable对象的PrimaryKey属性可以设置Datatable的主键。主键可以是一个或者多个DataColumn对象组成的数组。例如:

DataColumn[] key = new DataColumn[1];//dt是一个DataTable对象

key[0] = dt.Columns[0];

dt.PrimaryKey = key;

4. 在DataTable对象中创建行

DataTable对象的每一行都是一个DataRow对象,所以创建行时可以先利用DataTable对象的NewRow方法创建一个DataRow对象,并设置新行中各列的数据,然后利用Add方法将DataRow对象添加到表中

5. 将SQL Server数据库中的表填充到DataTable中

除了可以直接创建DataTable对象的行列信息外,也可以通过DateAdapter对象的Fill方法将SQL Server数据库中的表填充到DataTable对象中。

五、DataSet对象

1. 创建DataSet对象

使用创建的DataSet对象可以完成各种数据操作,利用向导生成的数据库数据源是一个强类型的DataSet以及一对或多对强类型的DataTable和TableAdapter的组合。类型化的DataSet是一个生成的类,是从.NET Framework的一般DataSet类衍生来的,但提供了已定义的架构以及特定于该架构的属性和方法。同时,对于DataSet中的每个表,还生成了特定于该DataSet的附加衍生类,而且每个类都为相关的表提供了特定的架构、属性和方法。

当然,也可以直接创建一般的DataSet对象,例如:

DataSet myDataset = new DataSet();

2. 填充DataSet对象

创建DataSet后,就可以使用SqlDataAdapter对象把数据导入到DataSet对象中,比如通过Fill方法将数据填充到DataSet中的某个表中。

转摘自:http://www.chinaz.com/Program/.NET/0511K2A2009.html

[SQL]Transact-SQL

查询分析器的颜色类别

颜色 类别
蓝色 关键字
暗红色 存储过程
绿色 系统表
暗绿色 注释
洋红色 系统函数
红色 字符串
灰色 运算符

Transact-SQL 语法规则:
 大写:Transact-SQL 关键字。
斜体  :  Transact-SQL 语法中用户提供的参数。
|(竖线): 分隔括号或大括号内的语法项目。只能选择一个项目。
[ ](方括号): 可选语法项目。不必键入方括号。
{}(大括号): 必选语法项。不要键入大括号。
[ ,...n ] :表示前面的项可重复 n 次。每一项由逗号分隔。
[ ...n ] :表示前面的项可重复 n 次。每一项由空格分隔。
加粗: 数据库名、表名、列名、索引名、存储过程、实用工具、数据类型名以及必须按所显示的原样键入的文本。

存取记录
INSERT [INTO] 目标表名  [(字段列表)] VALUES (值列表)
UPDATE   目标表名    SET {字段名=表达式}[,…n]    [WHERE <搜索条件>
DELETE  [FROM] 目标表名    [WHERE <搜索条件>]
TRUNCATE  TABLE  表名  -- 删除表中所有记录

查询记录
SELECT  字段列表 [INTO 新表] FROM 数据源 [WHERE 搜索条件] [ORDER BY 排序表达式[ASC|DESC]] [GROUP BY 分组表达式] [HAVING  搜索表达式]
DISTINCT -- 不显示重复行
TOP n -- 限制结果集返回行数
[NOT] BETWEEN 起始值 AND 终止值 - [非]介于起始-终止之间
介于80-90之间的条件 Where 字段 BETWEEN 80 And 90
80-90之间除外的条件 Where 字段 Not BETWEEN 80 And 90
Where SUBSTRING(e­xpression , start , length) in ('一','二','三')
查找名为"红"的单字姓学生 Where 字段 Like '_红'
查找所有姓"李"的学生 Where 字段 Like '李%'
查找姓名含有"红"字 Where 字段 Like '%红%'
查找姓名统配字符陈张刘 Where 字段 Like '[陈张刘]%'
查找末尾数字为2-6 Where 字段 Like '%[2-6]'
查找末尾数字不为2-6 Where 字段 Like '%[^2-6]'
通配符解释 Where 字段 Like '%/_%' escape '/'
空值比较 Where 字段 IS [NOT] NULL
累加和函数SUM 语法:SUM([ALL|DISTINCT] 表达式)
ALL:对所选字段的所有值求和
DISTINCT:对重复的记录仅计算一次.

标签:

[T-SQL]SQL相关笔记

★常用数据类型
1.字符型数据varchar类型可以存储的字符串最长为255个字符
2.文本型数据text可以存放超过二十亿个字符的字符串
3.数值型数据int可以存储整数、小数、和钱数.INT型数据的表数范围是从-2,147,483,647到2,147,483,647的整数。
4.数值型数据SMALLINT 型数据可以存储从-32768到32768的整数。这种数据类型的使用方法与INT型完全相同。
5.数值型数据TINYINT这种类型的使用方法也与INT型相同,这种类型的字段只能存储从0到255的整数,不能用来存储负数。
6.存储逻辑值bit,BIT型字段只能取两个值:0或1.表创建后.不能添加字段.必须在创建时完成.BIT型数据不能是空值
7.存储日期和时间datatime,一个DATETIME型的字段可以存储的日期范围是从1753年1月1日到9999年12月31日。
8.存储日期和时间smalldatatime,个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒
★数据库操作代码
新建数据库   Create Database 数据库
删除数据库   Drop Database 数据库
查看数据库   sp_helpdb 数据库
选择数据库   Use 数据库
★表字段操作代码
查询表    Select * From 表
条件查询表   Select * From 表 Where 字段='内容'
字段取代显示   Select Username"用户名" From 表
加减乘除显示字段  Select 字段(+-*/)(数字或字段) From 表   (int类型)
建立新表   Create Table 表(字段 类型(长度)not null,.....) 默认值:Defalut '默认值' or getdate()
添加表数据   insert into 表(字段,字段)values('内容','内容')   数字型不加引号
删除表    Drop Table 表
删除表所有数据   truncate table 表 OR DELETE 表
增加表新字段   alter table 表 add 字段 数据类型 null
删除表某数据   DELETE 表  WHERE 字段='内容'
修改表某数据   update 表 set 字段='内容' where 字段='条件内容'
★ASP相关
<% OPTION EXPLICI %>  OPTION EXPLICIT语句强制所有的变量必须专门声明
时间函数:   <%=DATE%>:日期时间、<%=NOW%>:日期、<%=TIME%>:时间、<%=DAY(DATE)%>:日、<%=MONTH(DATE)%>:月、<%=WEEKDAY(DATE)%>:星期、<%=YEAR(DATE)%>:年份、<%=HOUR(TIME)%>小时、<%=MINUTE(TIME)%>分钟、<%=SECOND(TIME)%>秒、
时间函数2:   <%=DATEADD("s",15,TIME)%>输出15秒后的时间,yyyy 年,q 季度,m 月,y 天,d 天,w 天,ww 星期,h 小时,m 分钟,s 秒
日或时间的间隔   <%=DATEDIFF("d",DATE,"8/8/2008")%> 距离奥运开幕式的天数
变量数据范围:   Byte 0到255、Boolean TRUE或FALSE、Integer -32,768到32,767、Long -2,147,483,648 到2,147,483,647、Date 100年1月1日到9999年12月31日、object 任何对象、string 变长字符串,长度从0个字符到大约20亿个字符
<%=ISEMPTY(变量)%>  检查变量是否为空,为空则输出True,不为空则输出False
五个取舍函数   这些函数是ABS(),INT(),FIX(),ROUND(),和SGN()。函数ABS()返回一个绝对值。函数INT()四舍五入后最接近的整数。函数FIX()也返回最接近的整数,不过这个函数对复数是向下舍入而不是向上舍入。函数ROUND()允许你指定舍入后小数部分的位数。最后,函数SGN()返回1,0,或-1,分别对应其参数是正数,零,或复数。
用IF.THEN测试单个条件  VBscript最有用的语句之一是IF...THEN语句
用SELECT CASE 测试多个条件 SELECT CASE语句于IF...THEN语句关系密切。IF...THEN语句只能允许你测试一个条件;SELECT CASE语句允许你一次测试多个条件
用FOR循环执行重复操作  当你需要重复执行一组语句一定次数时,你可以使用一个FOR...NEXT循环 
用WHILE和DO执行条件循环  当以指定的次数执行一组语句或显示HTML代码块时,FOR...LOOP循环是有用的。但是,在许多情况下,当一个循环执行之前,你并不知道它需要执行的次数。在这些情况下,你需要使用WHILE循环或DO循环。

convert(char(10),getdate(),120)  SQL默认值仅日期 无时间 
user_name=request.querystring("user") 或许网页地址上user=XXX的内容
order by 字段 ASC(升序) or DESC(降序)
isnull(rs(0))    判断字段是否为空
wid=int(request.querystring("wid")) 加int 凡是不为数字的一律为0
Response.AddHeader"P3P", "CP=CAO PSA OUR" 【很值钱的一句整合代码,可以解决很多跨站整合问题,IE6测试通过,Oh Yes!】
Split  将数据分成数组分别显示
<a href="#" onclick="javascript:if (confirm('您確定要脩改這個頭像的信息嗎?')) href='iconedit.asp?id=<%=rs("id")%>'; else return;">[脩改]</a>
<input type="submit" name="VersionUpdate" value="版本升级" onClick="javascript:return confirm('您确定要升级版本吗?');" > 提交按钮增加确认
onKeypress="if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false; "  只允许输入数字

'+document.inputform.talkto2.value+' 获取from(name=inputform)里面的文本框(name=talkto2)的value
oncontextmenu="event.returnValue=false;" 禁鼠标右键.放置body
document.write('<%=Productshits+1%>'); script
abs() 绝对值 SQL
value="请输入类型名称" onblur="if(this.value=='' || this.value=='请输入类型名称'){this.value='请输入类型名称';}" onfocus="this.value=''"
onclick="window.location.href='register.asp'" input按钮超链接
@@IDENTITY as id  获取最后写入的ID -TSSQL
alter table 表名 alter 字段名 counter(1,1)  清空数据之后.重建标识 For Access
truncate table 表名  '清空数据并重建标识 For SQL Server
readonly="yes"  input不可修改.value有效..类似disabled却value有效

'asp.net取大写
string s = "asd";
            s.ToUpper()

select * from SnSn_Products_Info where Snsn_ID=94 or Snsn_ID=67 or Snsn_ID=1
select * from SnSn_Products_Info where Snsn_ID IN (94,67,1)

介于80-90之间的条件 Where ZD BETWEEN 80 And 90
80-90之间除外的条件 Where ZD Not BETWEEN 80 And 90
Where SUBSTRING(e-xpression , start , length) in ('一','二','三')
查找名为"红"的单字姓学生 Where ZD Like '_红'
查找所有姓"李"的学生 Where ZD Like '李%'
查找姓名含有"红"字 Where ZD Like '%红%'
查找姓名统配字符陈张刘 Where ZD Like '[陈张刘]%'
查找末尾数字为2-6 Where ZD Like '%[2-6]'
查找末尾数字不为2-6 Where ZD Like '%[^2-6]'
通配符解释 Where ZD Like '%/_%' escape '/'
空值比较 Where ZD IS [NOT] NULL
累加和函数SUM 语法:SUM([ALL|DISTINCT] 表达式)
ALL:对所选字段的所有值求和
DISTINCT:对重复的记录仅计算一次。


Select * From 学生信息 Inner Join 选课表 ON 学生信息.学号=选课表.学号
Select * From 学生信息,选课表 WHERE 学生信息.学号=选课表.学号

Select * from SnSn_Account_Info as 用户表,SnSn_Products_Info as 产品表 where 用户表.SnSn_ID=产品表.SnSn_AccountID

标签:

最近在用asp.net ,在将绑定数据到DropDownList。时抛出了一个很奇怪的异常。
异常详细信息: System.ArgumentOutOfRangeException: “DropDownList1”有一个无效 SelectedValue,因为它不在项目列表中。

于是查了一下MSDN:DropDownList.SelectedValue 属性:
此属性返回选定的 ListItem 的 Value 属性。通常使用 SelectedValue 属性确定列表控件中选定项的值。如果选定了多个项,则返回索引最小的选定项的值。如果未选定任何项,则返回一个空字符串 ("")。
SelectedValue 属性还可以用于选择列表控件中的某一项,方法是用该项的值设置此属性。如果列表控件中的任何项都不包含指定值,则会引发 System.ArgumentOutOfRangeException。

检查了一下代码。发现自己在没有绑DropDownList1之前就给DropDownList1.SelectedValue ="qqcrazyer";
怪不得出现异常;这里的DropDownList1没有qqcrazyer这一项。
但是这样赋值在做如市、县连动的值改时候很难避免不碰到赋一个列表没有的值,
怎么办呢?

于是又去反射查了一下SelectedValue的实现,找到了解法。原来只有在this.Page.IsPostBack的情况下,赋值才会出错。只需这样赋值:

DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("qqcrazyer"));

就是如果通过FindByValue没有找到指定项则为null,而Items.IndexOf(null)会返回-1.

还有一种方法就是改一下你的代码,改成
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2"
DataTextField="a_code" DataValueField="a_code" SelectedValue='<%# Bind("a_code") %>' AppendDataBoundItems="True">
<asp:ListItem Value='' >(无)</asp:ListItem>
</asp:DropDownList>
在绑定的数据前加上一项(无),它对应null值。这样就不会出错了。

 

不过上述办法只是让它不出错而已,如果是因为页面加载时数据未绑定而导致上述错误,则最好是在页面加载时用一静态变量保存将要赋予下拉列表的值,等数据加载完毕,在下拉列表的DataBound(object sender, EventArgs e)事件中使用DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("qqcrazyer"));则能给综赋予想要给的值,前提是这个值本是它item值中之一,只是因为数据未绑定才导致上述错误的.

 

 

转摘自http://hi.baidu.com/nirvanan/blog/item/cce523964c09bb6a54fb96ac.html