首先 进行数据库操作

1、建立一个数据库【User】,建立一张数据表【UserInfo】

包含四个字段 UserID int,   UserName varchar(50),    UserSex varchar(10),     UserDesc varchar(50) 其中UserID为自动增长列

2、创建存储过程

(1)、查找表中所有数据

       create procedure [dbo].[uInfo_select]
       as
       select * from userInfo

(2)、根据ID查找表中数据

      create procedure [dbo].[uInfo_select_uid]
      @uID int
      as
      select * from UserInfo where UserID = @uID

(3)、向表中插入数据

      create procedure [dbo].[uInfo_inSert]
      @uName varchar(50),
      @uSex varchar(10),
      @uDesc varchar(100)
      as
      insert into userInfo(UserName,UserSex,UserDesc) values (@uName,@uSex,@uDesc)

(4)、更新表中数据

      create procedure [dbo].[uInfo_update]
      @uID int,
      @uName varchar(50),
      @uSex varchar(10),
      @uDesc varchar(100)
      as
      update userInfo set UserName=@uName,UserSex=@uSex,UserDesc=@uDesc where UserID = @uID

(5)、删除表中某条记录

      create procedure [dbo].[uInfo_delete]
      @uID int
      as
      delete userInfo where UserID = @uID

二、DAL 里面

类名叫:DAL_uInfo    要引用接口层IDAL (其他删除什么的方法我也都写了 ,本例只实现一个添加,其他的自己写吧。)

using System;
using System.Collections.Generic;
using System.Text;
using IDAL;

using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DAL
{

        public class DAL_uInfo : IDAL_uInfo
        {
            //获取web.config中的链接字符串
            static string connStr = ConfigurationSettings.AppSettings["ConnDb"];

            /// <summary>
            /// 查询表中所有的数据
            /// </summary>
            /// <returns></returns>
            public DataSet uinfo_select()
            {
                DataSet ds = new DataSet();
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    try
                    {
                        conn.Open();

                        SqlCommand comm = new SqlCommand("uInfo_select", conn);
                        comm.CommandType = CommandType.StoredProcedure;
                        SqlDataAdapter da = new SqlDataAdapter(comm);
                        da.Fill(ds);
                        return ds;
                    }
                    catch (SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }

            /// <summary>
            /// 查询表中所有的数据
            /// </summary>
            /// <param name="ID">根据ID</param>
            /// <returns></returns>
            public DataSet uinfo_select(int ID)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        conn.Open();

                        SqlCommand comm = new SqlCommand("uInfo_select_uid", conn);
                        comm.CommandType = CommandType.StoredProcedure;

                        SqlParameter puID = new SqlParameter("@uID", SqlDbType.Int);

                        puID.Value = ID;

                        comm.Parameters.Add(puID);

                        SqlDataAdapter da = new SqlDataAdapter(comm);
                        da.Fill(ds);

                        return ds;
                    }
                    catch (SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }

            /// <summary>
            /// 向表中插入数据
            /// </summary>
            /// <param name="uName">用户名称</param>
            /// <param name="uSex">性别</param>
            /// <param name="uDesc">信息</param>
            public void uinfo_insert(string uName, string uSex, string uDesc)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    try
                    {
                        conn.Open();

                        SqlCommand comm = new SqlCommand("uInfo_inSert", conn);
                        comm.CommandType = CommandType.StoredProcedure;

                        SqlParameter puName = new SqlParameter("@uName", SqlDbType.VarChar, 50);
                        SqlParameter puSex = new SqlParameter("@uSex", SqlDbType.VarChar, 10);
                        SqlParameter puDesc = new SqlParameter("@uDesc", SqlDbType.VarChar, 50);

                        puName.Value = uName;
                        puSex.Value = uSex;
                        puDesc.Value = uDesc;

                        comm.Parameters.Add(puName);
                        comm.Parameters.Add(puSex);
                        comm.Parameters.Add(puDesc);

                        comm.ExecuteNonQuery();
                    }
                    catch (SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }

            /// <summary>
            /// 更新表中数据
            /// </summary>
            /// <param name="uID">用户ID</param>
            /// <param name="uName">名称</param>
            /// <param name="uSex">性别</param>
            /// <param name="uDesc">信息</param>
            public void uinfo_update(int uID, string uName, string uSex, string uDesc)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    try
                    {
                        conn.Open();

                        SqlCommand comm = new SqlCommand("uInfo_updata", conn);
                        comm.CommandType = CommandType.StoredProcedure;

                        SqlParameter puName = new SqlParameter("@uName", SqlDbType.VarChar, 50);
                        SqlParameter puSex = new SqlParameter("@uSex", SqlDbType.VarChar, 10);
                        SqlParameter puDesc = new SqlParameter("@uDesc", SqlDbType.VarChar, 50);
                        SqlParameter puID = new SqlParameter("@uID", SqlDbType.Int);

                        puName.Value = uName;
                        puSex.Value = uSex;
                        puDesc.Value = uDesc;
                        puID.Value = uID;

                        comm.Parameters.Add(puName);
                        comm.Parameters.Add(puID);
                        comm.Parameters.Add(puDesc);
                        comm.Parameters.Add(puSex);

                        comm.ExecuteNonQuery();
                    }
                    catch (SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }

            /// <summary>
            /// 删除表中数据
            /// </summary>
            /// <param name="uID">用户ID</param>
            public void uinfo_delete(int uID)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    try
                    {
                        conn.Open();

                        SqlCommand comm = new SqlCommand("uInfo_delete", conn);
                        comm.CommandType = CommandType.StoredProcedure;

                        SqlParameter puID = new SqlParameter("@uID", SqlDbType.Int);

                        puID.Value = uID;

                        comm.Parameters.Add(puID);

                        comm.ExecuteNonQuery();
                    }
                    catch (SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }
        }
    }

三、BLL里面

类名叫:BLL_uInfo

using System;
using System.Collections.Generic;
using System.Text;

using System.Data;

namespace BLL
{
    public class BLL_uInfo
    {

        IDAL.IDAL_uInfo dal = new DAL.DAL_uInfo();

        /// <summary>
        /// 查询表中所有的数据
        /// </summary>
        /// <returns></returns>
        public DataSet uinfo_select()
        {
            return dal.uinfo_select();
        }

        /// <summary>
        /// 查询表中所有的数据
        /// </summary>
        /// <param name="ID">根据ID</param>
        /// <returns></returns>
        public DataSet uinfo_select_id(int ID)
        {
            return dal.uinfo_select(ID);
        }

        /// <summary>
        /// 向表中插入数据
        /// </summary>
        /// <param name="uName">用户名称</param>
        /// <param name="uSex">性别</param>
        /// <param name="uDesc">信息</param>
        public void uinfo_insert(string uName, string uSex, string uDesc)
        {
            dal.uinfo_insert(uName, uSex, uDesc);
        }

        /// <summary>
        /// 更新表中数据
        /// </summary>
        /// <param name="uID">用户ID</param>
        /// <param name="uName">名称</param>
        /// <param name="uSex">性别</param>
        /// <param name="uDesc">信息</param>
        public void uinfo_update(int uID, string uName, string uSex, string uDesc)
        {
            dal.uinfo_update(uID, uName, uSex, uDesc);
        }

        /// <summary>
        /// 删除表中数据
        /// </summary>
        /// <param name="uID">用户ID</param>
        public void uinfo_delete(int uID)
        {
            dal.uinfo_delete(uID);
        }
    }
}

四、IDAL(接口层)

类名:IDAL_uInfo

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace IDAL
{
    public interface IDAL_uInfo
    {
       
        /// <summary>
        /// 查询表中所有的数据
        /// </summary>
        /// <returns></returns>
        DataSet uinfo_select();

        /// <summary>
        /// 查询表中所有的数据
        /// </summary>
        /// <param name="ID">根据ID</param>
        /// <returns></returns>
        DataSet uinfo_select(int ID);

        /// <summary>
        /// 向表中插入数据
        /// </summary>
        /// <param name="uName">用户名称</param>
        /// <param name="uSex">性别</param>
        /// <param name="uDesc">信息</param>
        void uinfo_insert(string uName, string uSex, string uDesc);

        /// <summary>
        /// 更新表中数据
        /// </summary>
        /// <param name="uID">用户ID</param>
        /// <param name="uName">名称</param>
        /// <param name="uSex">性别</param>
        /// <param name="uDesc">信息</param>
        void uinfo_updata(int uID, string uName, string uSex, string uDesc);

        /// <summary>
        /// 删除表中数据
        /// </summary>
        /// <param name="uID">用户ID</param>
        void uinfo_delete(int uID);

    }
}

五、UI

1、界面代码

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CunchuDiaoyong._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <br />
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />
        <br />
        <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox><br />
        <br />
        <asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click" Text="添 加" /></div>
    </form>
</body>
</html>

2、后台代码

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace CunchuDiaoyong
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnAdd_Click(object sender, EventArgs e)
        {
            string a = TextBox1.Text.Trim();
            string b = TextBox2.Text.Trim();
            string c = TextBox3.Text.Trim();

            BLL.BLL_uInfo User = new BLL.BLL_uInfo();
            User.uinfo_insert(a, b, c);

        }
    }
}

六、Web.config

<?xml version="1.0" encoding="utf-8"?>

<configuration>

<appSettings>
    <add key="ConnDb" value="Server=192.168.18.246;Database=Sy_User;User ID=sa;Pwd=123"/>
</appSettings>
    <connectionStrings/>

    <system.web>
        <!--
            设置 compilation debug="true" 将调试符号插入
            已编译的页面中。但由于这会
            影响性能,因此只在开发过程中将此值
            设置为 true。
        -->
        <compilation debug="true" />
        <!--
            通过 <authentication> 节可以配置 ASP.NET 使用的
            安全身份验证模式,
            以标识传入的用户。
        -->
        <authentication mode="Windows" />
        <!--
            如果在执行请求的过程中出现未处理的错误,
            则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
            开发人员通过该节可以配置
            要显示的 html 错误页
            以代替错误堆栈跟踪。

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
    </system.web>
</configuration>

可以了,直接复制过去就可以用,想学习的话,还是必须得自己打几遍,设个断点,一步一步,一遍一遍的看,知道看会为止,学习没有好的技巧,Never Give Up!加油!

posted @ 2011-08-23 19:28 风之相随 阅读(15) 评论(0)  编辑

/// <summary>
    ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
    /// 使用参数数组形式提供参数列表
    /// </summary>
    /// <remarks>
    /// 使用示例:
    ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    /// </remarks>
    /// <param name="connectionString">一个有效的数据库连接字符串</param>
    /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
    public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    {

        SqlCommand cmd = new SqlCommand();

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
            PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
            int val = cmd.ExecuteNonQuery();

            //清空SqlCommand中的参数列表
            cmd.Parameters.Clear();
            return val;
        }
    }

 

 /// <summary>
    /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。
    /// 使用参数数组提供参数
    /// </summary>
    /// <remarks>
    /// 使用示例: 
    ///  SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    /// </remarks>
    /// <param name="connectionString">一个有效的数据库连接字符串</param>
    /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    /// <returns>返回一个包含结果的SqlDataReader</returns>
    public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    {
        SqlCommand cmd = new SqlCommand();
        SqlConnection conn = new SqlConnection(connectionString);

        // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在,
        //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。
        //关闭数据库连接,并通过throw再次引发捕捉到的异常。
        try
        {
            PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            return rdr;
        }
        catch
        {
            conn.Close();
            throw;
        }
    }

 


    /// <summary>
    /// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。
    /// 使用参数数组提供参数
    /// </summary>
    /// <remarks>
    /// 使用示例: 
    ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    /// </remarks>
    /// <param name="connectionString">一个有效的数据库连接字符串</param>
    /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
    public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    {
        SqlCommand cmd = new SqlCommand();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;
        }
    }

 

 

/// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>
        /// <param name="SQLStringList">多条SQL语句</param>  
        public static int ExecuteSqlTran(List<String> SQLStringList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return count;
                }
                catch
                {
                    tx.Rollback();
                    return 0;
                }
            }
        }

 

 

/// <summary>
        /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
        /// </summary>
        /// <param name="strSQL">查询语句</param>
        /// <returns>SqlDataReader</returns>
        public static SqlDataReader ExecuteReader(string strSQL)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(strSQL, connection);
            try
            {
                connection.Open();
                SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return myReader;
            }
            catch (System.Data.SqlClient.SqlException e)
            {
                throw e;
            }  

        }

 

 

 

 /// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                    command.Fill(ds, "ds");
                }
                catch (System.Data.SqlClient.SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }

 

 

 

 /// <summary>
        /// 执行查询语句,返回pageDataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet pageQuery(string SQLString, int PageIndex, int PageSize)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                    command.Fill(ds, PageIndex, PageSize, "ds");
                }
                catch (System.Data.SqlClient.SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }

 

 

 


        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        return rows;
                    }
                    catch (System.Data.SqlClient.SqlException e)
                    {
                        throw e;
                    }
                }
            }
        }

 

 

 

 

 /// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand cmd = new SqlCommand();
                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        da.Fill(ds, "ds");
                        cmd.Parameters.Clear();
                    }
                    catch (System.Data.SqlClient.SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }
        }

 

 

 

 

 

   private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            if (cmdParms != null)
            {


                foreach (SqlParameter parameter in cmdParms)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                        (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parameter);
                }
            }
        }

 

 

 /// <summary>
        /// 执行sql语句
        /// </summary>
        /// <param name="sqlstr">写上你们的sql</param>
        public static int ExecuteSql(string sqlstr)
        {
            int result = 0;
            try
            {
                openConnection();

                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sqlstr;
                result = cmd.ExecuteNonQuery();

                closeConnection();
                return result;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                closeConnection();
            }
        }

 

 

  public static SqlDataReader dataReader(string sqlstr)
        {
            SqlDataReader dr = null;
            try
            {
                openConnection();
                cmd.CommandText = sqlstr;
                cmd.CommandType = CommandType.Text;
                dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch
            {
                try
                {
                    dr.Close();
                    closeConnection();
                }
                catch
                {
                }
            }
            return dr;

 

 

 

public static DataSet dataSet(string sqlstr)
        {
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter();
            try
            {
                openConnection();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sqlstr;
                da.SelectCommand = cmd;
                da.Fill(ds);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                closeConnection();
            }
            return ds;
        }

 

 

//string table 为虚拟表 可以用 搜索的数据库表"name"
        //DataSet ds1 = DB.PagedataSet(sqlstr1, AspNetPager1.PageSize * (AspNetPager1.CurrentPageIndex - 1),
        //    AspNetPager1.PageSize,"newlist");
        //    Repeater1.DataSource = ds1.Tables[0];
        public static DataSet PagedataSet(string sqlstr, int pageindex, int pagesize, string table)
        {
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter();
            try
            {
                openConnection();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sqlstr;
                da.SelectCommand = cmd;
               
                da.Fill(ds, pageindex, pagesize, table);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                closeConnection();
            }
            return ds;
        }
posted @ 2011-08-23 19:26 风之相随 阅读(50) 评论(0)  编辑

下面总结了一些常用的Web Service,是平时乱逛时收集的,希望对大家有用。

============================================

天气预报Web Service,数据来源于中国气象局

Endpoint 

Disco 

WSDL

IP地址来源搜索Web Service(是目前最完整的IP地址数据)

Endpoint 

Disco 

WSDL

随机英文、数字和中文简体字Web Service

Endpoint 

Disco 

WSDL

中国邮政编码 <-> 地址信息双向查询/搜索Web Service

Endpoint 

Disco 

WSDL 

验证码图片Web Service 支持中文、字母、数字 图像和多媒体

Endpoint 

Disco 

WSDL

Email 电子邮件地址验证Web Service

Endpoint 

Disco 

WSDL 

中文简体字 <->繁体字转换Web Service

Endpoint 

Disco 

WSDL 

中文 <-> 英文双向翻译Web Service

Endpoint 

Disco 

WSDL 

火车时刻表Web Service (第六次提速最新列车时刻表)

Endpoint 

Disco 

WSDL 

中国股票行情数据Web Service(支持深圳和上海股市的基金、债券和股票)

Endpoint 

Disco 

WSDL

即时外汇汇率数据Web Service

Endpoint 

Disco 

WSDL 

腾讯QQ在线状态Web Service

Endpoint 

Disco 

WSDL 

中国电视节目预告(电视节目表)Web Service

Endpoint 

Disco 

WSDL

外汇-人民币即时报价Web Service

Endpoint 

Disco 

WSDL

中国股票行情分时走势预览缩略图Web Service

Endpoint 

Disco 

WSDL

国内飞机航班时刻表 Web Service

Endpoint 

Disco 

WSDL 

中国开放式基金数据Web Service

Endpoint 

Disco 

WSDL 

股票行情数据 Web Service(支持香港、深圳、上海基金、债券和股票;支持多股票同时查询)

Endpoint 

Disco 

WSDL 

posted @ 2011-08-11 13:37 风之相随 阅读(7) 评论(0)  编辑

最近在折腾 PHP + MYSQL 的编程。了解了一些 PHP SQL 注入攻击的知识,于是写了这篇文章 http://www.xiaohui.com/weekly/20070314.htm,总结一下经验。在我看来,引发 SQL 注入攻击的主要原因,是因为以下两点原因:

  1. php 配置文件 php.ini 中的 magic_quotes_gpc 选项没有打开,被置为 off

  2. 开发者没有对数据类型进行检查和转义

  不过事实上,第二点最为重要。我认为, 对用户输入的数据类型进行检查,向 MYSQL 提交正确的数据类型,这应该是一个 web 程序员最最基本的素质。但现实中,常常有许多小白式的 Web 开发者忘了这点, 从而导致后门大开。

  为什么说第二点最为重要?因为如果没有第二点的保证,magic_quotes_gpc 选项,不论为 on,还是为 off,都有可能引发 SQL 注入攻击。下面来看一下技术实现:

 一. magic_quotes_gpc = Off 时的注入攻击

  magic_quotes_gpc = Off 是 php 中一种非常不安全的选项。新版本的 php 已经将默认的值改为了 On。但仍有相当多的服务器的选项为 off。毕竟,再古董的服务器也是有人用的。

  当magic_quotes_gpc = On 时,它会将提交的变量中所有的 '(单引号)、"(双号号)、\(反斜线)、空白字符,都为在前面自动加上 \。下面是 php 的官方说明:

magic_quotes_gpc boolean

Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically

  如果没有转义,即 off 情况下,就会让攻击者有机可乘。以下列测试脚本为例:

http://www.xiaohui.com/weekly/20070314.htm

<?
if ( isset($_POST["f_login"] ) )
{
// 连接数据库...
// ...代码略...

// 检查用户是否存在
$t_strUname = $_POST["f_uname"];
$t_strPwd = $_POST["f_pwd"];
$t_strSQL = "SELECT * FROM tbl_users WHERE username='$t_strUname' AND password = '$t_strPwd' LIMIT 0,1";

if ( $t_hRes = mysql_query($t_strSQL) )
{
// 成功查询之后的处理. 略...
}
}
?>

<html><head><title>sample test</title></head>
<body>
<form method=post action="">
Username: <input type="text" name="f_uname" size=30><br>
Password: <input type=text name="f_pwd" size=30><br>

<input type="submit" name="f_login" value="登录">
</form>
</body>

  在这个脚本中,当用户输入正常的用户名和密码,假设值分别为 zhang3、abc123,则提交的 SQL 语句如下:

SELECT * FROM tbl_users 
WHERE username='zhang3' AND password = 'abc123' LIMIT 0,1

  如果攻击者在 username 字段中输入:zhang3' OR 1=1 #,在 password 输入 abc123,则提交的 SQL 语句变成如下:

SELECT * FROM tbl_users 
WHERE username='zhang3' OR 1=1 #' AND password = 'abc123' LIMIT 0,1

  由于 # 是 mysql中的注释符, #之后的语句不被执行,实现上这行语句就成了:

SELECT * FROM tbl_users 
WHERE username='zhang3' OR 1=1

  这样攻击者就可以绕过认证了。如果攻击者知道数据库结构,那么它构建一个 UNION SELECT,那就更危险了:

  假设在 username 中输入:zhang3 ' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #

  在password 输入: abc123,

  则提交的 SQL 语句变成:

SELECT * FROM tbl_users 
WHERE username='zhang3 '
OR 1 =1 UNION select cola, colb,cold FROM tbl_b #' AND password = 'abc123' LIMIT 0,1

  这样就相当危险了。如果agic_quotes_gpc选项为 on,引号被转义,则上面攻击者构建的攻击语句就会变成这样,从而无法达到其目的:

SELECT * FROM tbl_users 
WHERE username='zhang3\' OR 1=1 #'
AND password = 'abc123'
LIMIT 0,1

SELECT * FROM tbl_users
WHERE username='zhang3 \' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #'
AND password = 'abc123' LIMIT 0,1

 二. magic_quotes_gpc = On 时的注入攻击

  当 magic_quotes_gpc = On 时,攻击者无法对字符型的字段进行 SQL 注入。这并不代表这就安全了。这时,可以通过数值型的字段进行SQL注入。

  在最新版的 MYSQL 5.x 中,已经严格了数据类型的输入,已默认关闭自动类型转换。数值型的字段,不能是引号标记的字符型。也就是说,假设 uid 是数值型的,在以前的 mysql 版本中,这样的语句是合法的:

INSERT INTO tbl_user SET uid="1";
SELECT * FROM tbl_user WHERE uid="1";

  在最新的 MYSQL 5.x 中,上面的语句不是合法的,必须写成这样:

INSERT INTO tbl_user SET uid=1;
SELECT * FROM tbl_user WHERE uid=1;

  这样我认为是正确的。因为作为开发者,向数据库提交正确的符合规则的数据类型,这是最基本的要求。

  那么攻击者在 magic_quotes_gpc = On 时,他们怎么攻击呢?很简单,就是对数值型的字段进行 SQL 注入。以下列的 php 脚本为例:

<?
if ( isset($_POST["f_login"] ) )
{
// 连接数据库...
// ...代码略...

// 检查用户是否存在
$t_strUid = $_POST["f_uid"];
$t_strPwd = $_POST["f_pwd"];
$t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd' LIMIT 0,1";
if ( $t_hRes = mysql_query($t_strSQL) )
{
// 成功查询之后的处理. 略...
}

}
?>
<html><head><title>sample test</title></head>
<body>
<form method=post action="">
User ID: <input type="text" name="f_uid" size=30><br>

Password: <input type=text name="f_pwd" size=30><br>
<input type="submit" name="f_login" value="登录">
</form>
</body>

  上面这段脚本要求用户输入 userid 和 password 登入。一个正常的语句,用户输入 1001和abc123,提交的 sql 语句如下:

SELECT * FROM tbl_users WHERE userid=1001 AND password = 'abc123' LIMIT 0,1

  如果攻击者在 userid 处,输入:1001 OR 1 =1 #,则注入的sql语句如下:

SELECT * FROM tbl_users WHERE userid=1001 OR 1 =1 # AND password = 'abc123' LIMIT 0,1

  攻击者达到了目的。

 三. 如何防止 PHP SQL 注入攻击

  如何防止 php sql 注入攻击?我认为最重要的一点,就是要对数据类型进行检查和转义。总结的几点规则如下:

  1. php.ini 中的 display_errors 选项,应该设为 display_errors = off。这样 php 脚本出错之后,不会在 web 页面输出错误,以免让攻击者分析出有作的信息。
  2. 调用 mysql_query 等 mysql 函数时,前面应该加上 @,即 @mysql_query(...),这样 mysql 错误不会被输出。同理以免让攻击者分析出有用的信息。另外,有些程序员在做开发时,当 mysql_query出错时,习惯输出错误以及 sql 语句,例如:
    $t_strSQL = "SELECT a from b....";
    if ( mysql_query($t_strSQL) )
    {
    // 正确的处理
    }
    else
    {
    echo "错误! SQL 语句:$t_strSQL \r\n错误信息".mysql_query();
    exit;
    }

      这种做法是相当危险和愚蠢的。如果一定要这么做,最好在网站的配置文件中,设一个全局变量或定义一个宏,设一下 debug 标志:

    全局配置文件中:
    define("DEBUG_MODE",0); // 1: DEBUG MODE; 0: RELEASE MODE

    //调用脚本中:
    $t_strSQL = "SELECT a from b....";
    if ( mysql_query($t_strSQL) )
    {
    // 正确的处理
    }
    else
    {
    if (DEBUG_MODE)
    echo "错误! SQL 语句:$t_strSQL \r\n错误信息".mysql_query();
    exit;
    }
  3. 对提交的 sql 语句,进行转义和类型检查

 四. 我写的一个安全参数获取函数

  为了防止用户的错误数据和 php + mysql 注入 ,我写了一个函数 PAPI_GetSafeParam(),用来获取安全的参数值:

define("XH_PARAM_INT",0);
define("XH_PARAM_TXT",1);
function PAPI_GetSafeParam($pi_strName, $pi_Def = "", $pi_iType = XH_PARAM_TXT)
{
if ( isset($_GET[$pi_strName]) )
$t_Val = trim($_GET[$pi_strName]);
else if ( isset($_POST[$pi_strName]))
$t_Val = trim($_POST[$pi_strName]);
else
return $pi_Def;

// INT
if ( XH_PARAM_INT == $pi_iType)
{
if (is_numeric($t_Val))
return $t_Val;
else
return $pi_Def;
}

// String
$t_Val = str_replace("&", "&amp;",$t_Val);
$t_Val = str_replace("<", "&lt;",$t_Val);
$t_Val = str_replace(">", "&gt;",$t_Val);
if ( get_magic_quotes_gpc() )
{
$t_Val = str_replace("\\\"", "&quot;",$t_Val);
$t_Val = str_replace("\\''", "'",$t_Val);
}
else
{
$t_Val = str_replace("\"", "&quot;",$t_Val);
$t_Val = str_replace("'", "'",$t_Val);
}
return $t_Val;
}

  在这个函数中,有三个参数:

$pi_strName: 变量名
$pi_Def: 默认值
$pi_iType: 数据类型。取值为 XH_PARAM_INT, XH_PARAM_TXT, 分别表示数值型和文本型。

  如果请求是数值型,那么调用 is_numeric() 判断是否为数值。如果不是,则返回程序指定的默认值。

  简单起见,对于文本串,我将用户输入的所有危险字符(包括HTML代码),全部转义。由于 php 函数 addslashes()存在漏洞,我用 str_replace()直接替换。get_magic_quotes_gpc() 函数是 php 的函数,用来判断 magic_quotes_gpc 选项是否打开。

 

  刚才第二节的示例,代码可以这样调用:

<?
if ( isset($_POST["f_login"] ) )
{
// 连接数据库...
// ...代码略...

// 检查用户是否存在
$t_strUid = PAPI_GetSafeParam("f_uid", 0, XH_PARAM_INT);
$t_strPwd = PAPI_GetSafeParam("f_pwd", "", XH_PARAM_TXT);
$t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd' LIMIT 0,1";
if ( $t_hRes = mysql_query($t_strSQL) )
{
// 成功查询之后的处理. 略...
}
}
?>

  这样的话,就已经相当安全了。PAPI_GetSafeParam的代码有点长,但牺牲这点效率,对保证安全,是值得的。希望大家多批评指正。:)

posted @ 2011-08-11 13:34 风之相随 阅读(6) 评论(0)  编辑

今天研究了下PHP MVC结构,所以决定自己写个简单的MVC,以待以后有空再丰富。
至于什么MVC结构,其实就是三个Model,Contraller,View单词的简称,,Model,主要任务就是把数据库或者其他文件系统的数据按 照我们需要的方式读取出来。View,主要负责页面的,把数据以html的形式显示给用户。Controller,主要负责业务逻辑,根据用户的 Request进行请求的分配,比如说显示登陆界面,就需要调用一个控制器userController的方法loginAction来显示。
下面我们用PHP来创建一个简单的MVC结构系统。
首先创建单点入口,即bootstrap文件index.php,作为整个MVC系统的唯一入口。什么是单点入口呢?所谓单点入口就是整个应用程序只有一 个入口,所有的实现都通过这个入口来转发。为什么要做到单点入口呢?单点入口有几大好处:第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。 比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面。第二、程序的架构更加 清晰明了。当然好处还有很多的。:)

<?php
include("core/ini.php");
initializer::initialize();
$router = loader::load("router");
dispatcher::dispatch($router);

这个文件就只有4句,我们现在一句句来分析。
include(”core/ini.php”);

我们来看core/ini.php

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . "core/main");
//set_include_path — Sets the include_path configuration option
function __autoload($object){
require_once("{$object}.php");
}

这个文件首先设置了include_path,也就是我们如果要找包含的文件,告诉系统在这个目录下查找。其实我们定义__autoload()方法,这个方法是在PHP5增加的,就是当我们实例化一个函数的时候,如果本文件没有,就会自动去加载文件。官方的解释是:
Many developers writing object-oriented applications create one PHP source file per-class definition. One of the biggest annoyances is having to write a long list of needed includes at the beginning of each script (one for each class).

In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn’t been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error.

接下来我们看下面一句
initializer::initialize();
这就话就是调用initializer类的一个静态函数initialize,因为我们在ini.php,设置了include_path,以及定义了__autoload,所以程序会自动在core/main目录查找initializer.php.
initializer.php文件如下:

<?php
class initializer
{
public static function initialize() {
set_include_path(get_include_path().PATH_SEPARATOR . "core/main");
set_include_path(get_include_path().PATH_SEPARATOR . "core/main/cache");
set_include_path(get_include_path().PATH_SEPARATOR . "core/helpers");
set_include_path(get_include_path().PATH_SEPARATOR . "core/libraries");
set_include_path(get_include_path().PATH_SEPARATOR . "app/controllers");
set_include_path(get_include_path().PATH_SEPARATOR."app/models");
set_include_path(get_include_path().PATH_SEPARATOR."app/views");
//include_once("core/config/config.php");
}
}
?>

这个函数很简单,就只定义了一个静态函数,initialize函数,这个函数就是设置include_path,这样,以后如果包含文件,或者__autoload,就会去这些目录下查找。

OK,我们继续,看第三句
$router = loader::load(”router”);

这句话也很简单,就是加载loader函数的静态函数load,下面我们来loader.php

<?php
class loader
{
private static $loaded = array();
public static function load($object){
$valid = array( "library",
"view",
"model",
"helper",
"router",
"config",
"hook",
"cache",
"db");
if (!in_array($object,$valid)){
throw new Exception("Not a valid object '{$object}' to load");
}
if (empty(self::$loaded[$object])){
self::$loaded[$object]= new $object();
}
return self::$loaded[$object];
}
}

这个文件就是去加载对象,因为以后我们可能会丰富这个MVC系统,会有model,helper,config等等的组件。如果加载的组件不在有效 的范围内,我们抛出一个异常。如果在的话,我们实例化一个对象,其实这里用了单件设计模式。也就是这个对象其实就只能是一个实例化对象,如果没有实例化, 创建一个,如果存在的,则不实例化。

好,因为我们现在要加载的是router组件,所以我们看下router.php文件,这个文件的作用就是映射URL,对URL进行解析。
router.php

<?php
class router
{
private $route;
private $controller;
private $action;
private $params;
public function __construct()
{
$path = array_keys($_GET);
if (!isset($path[0])){
if (!empty($default_controller))
$path[0] = $default_controller;
else
$path[0] = "index";
}
$route= $path[0];
$this->route = $route;
$routeParts = split( "/",$route);
$this->controller=$routeParts[0];
$this->action=isset($routeParts[1])? $routeParts[1]:"base";
array_shift($routeParts);
array_shift($routeParts);
$this->params=$routeParts;
}
public function getAction() {
if (empty($this->action)) $this->action="main";
return $this->action;
}
public function getController() {
return $this->controller;
}
public function getParams() {
return $this->params;
}
}

我们可以看到,首先我们是拿到$_GET,用户Request的URL,然后从URL里我们解析出Controller和Action,以及Params
比如我们的地址是http://www.tinoweb.cn/user/profile/id/3
那么从上面的地址,我们可以拿到controller是user,action似乎profile,参数是id以及3

OK我们看最后一句,就是
dispatcher::dispatch($router);

这句话的意思很明了,就是拿到URL解析的结果,然后通过dispatcher来分发controlloer及action来Response给用户
好,我们来看下dispatcher.php文件

<?
class dispatcher
{
public static function dispatch($router)
{
global $app;
ob_start();
$start = microtime(true);
$controller = $router->getController();
$action = $router->getAction();
$params = $router->getParams();
$controllerfile = "app/controllers/{$controller}.php";
if (file_exists($controllerfile)){
require_once($controllerfile);
$app = new $controller();
$app->setParams($params);
$app->$action();
if (isset($start)) echo "

Tota1l time for dispatching is : ".(microtime(true)-$start)." seconds.

";
$output = ob_get_clean();
echo $output;
}else{
throw new Exception("Controller not found");
}
}
}

这个类很明显,就是拿到$router来,寻找文件中的controller和action来回应用户的请求。

OK,我们一个简单的,MVC结构,就这样,当然这里还不能算是一个很完整的MVC,因为这里还没有涉及到View和Model,有空我再这里丰富。

我们来写个Controller文件来测试下上面的这个系统。

我们在app/controllers/下创建一个user.php文件

//user.php
<?php
class user
{
function base()
{
}
public function login()
{
echo 'login html page';
}
public function register()
{
echo 'register html page';
}
public function setParams($params){
var_dump($params);
}
}

然后你可以在浏览器中输入http://localhost/index.php?user/register 或者 http://localhost/index.php?user/login来测试下。

posted @ 2011-08-11 13:32 风之相随 阅读(12) 评论(0)  编辑
1. 打开新的窗口并传送参数:

   传送参数:

response.write("<script> window .open('* .asp x?id="+this.DropDownList1.SelectIndex+"&id1="+...+"')</script>")  

   接收参数:

string a = Request.QueryString("id");
string b = Request.QueryString("id1");  

   2.为按钮添加对话框

Button1.Attributes.Add("onclick","return confirm('确认?')");
button.attributes.add("onclick","if(confirm('are you sure...?')){return true;}else{return false;}")  

   3.删除表格选定记录

int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "Delete from Employee where emp_id = " + intEmpID.ToString()  

   4.删除表格记录警告

private void DataGrid _ItemCreated( Object sender,DataGridItemEventArgs e)
{
  switch(e.Item.ItemType)
  {
   case ListItemType.Item :
   case ListItemType.AlternatingItem :
   case ListItemType.EditItem:
    TableCell myTableCell;
    myTableCell = e.Item.Cells[14];
    LinkButton myDeleteButton ;
    myDeleteButton = (LinkButton)myTableCell.Controls[0];
    myDeleteButton.Attributes.Add("onclick","return confirm('您是否确定要删除这条信息');");
    break;
   default:
    break;
  }

}  

   5.点击表格行链接另一页

private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
  //点击表格打开
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   e.Item.Attributes.Add("onclick","window.open('Default.aspx?id=" + e.Item.Cells[0]. Text + "');");
}  

   双击表格连接到另一页

   在itemDataBind事件中

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
  string orderItemID =e.item.cells[1].Text;
  ...
  e.item.Attributes.Add("ondblclick", "location.href='../ShippedGrid.aspx?id=" + orderItemID + "'");
}  

   双击表格打开新一页

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
  string orderItemID =e.item.cells[1].Text;
  ...
  e.item.Attributes.Add("ondblclick", "open('../ShippedGrid.aspx?id=" + orderItemID + "')");
}  


   ★特别注意:【?id=】 处不能为 【?id =】

   6.表格超连接列传递参数



<asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id='
  <%# DataBinder.Eval(Container.DataItem, "数据字段1")%>' & name='<%# DataBinder.Eval(Container.DataItem, "数据字段2")%>' />  

   7.表格点击改变颜色

if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
  e.Item.Attributes.Add("onclick","this.style.backgroundColor='#99cc00';
    this.style.color='buttontext';this.style.cursor='default';");
}  

   写在DataGrid的_ItemDataBound里

if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Attributes.Add("onmouseover","this.style.backgroundColor='#99cc00';
    this.style.color='buttontext';this.style.cursor='default';");
e.Item.Attributes.Add("onmouseout","this.style.backgroundColor='';this.style.color='';");
}  


   8.关于日期格式

   日期格式设定

DataFormatString="{0:yyyy-MM-dd}"  

   我觉得应该在itembound事件中

e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd"))  

   9.获取错误信息并到指定页面

   不要使用Response.Redirect,而应该使用Server.Transfer

   e.g

// in global.asax
protected void Application_Error(Object sender, EventArgs e) {
if (Server.GetLastError() is HttpUnhandledException)
Server.Transfer("MyErrorPage.aspx");

//其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :)
}  

   Redirect会导致post-back的产生从而丢失了错误信息,所以页面导向应该直接在服务器端执行,这样就可以在错误处理页面得到出错信息并进行相应的处理

   10.清空Cookie

Cookie.Expires=[DateTime];
Response.Cookies("UserName").Expires = 0  

   11.自定义异常处理

//自定义异常处理类
using System;
using System.Diagnostics;

namespace MyAppException
{
  /// <summary>
  /// 从系统异常类ApplicationException继承的应用程序异常处理类。
  /// 自动将异常内容记录到Windows NT/2000的应用程序日志
  /// </summary>
  public class AppException:System.ApplicationException
  {
   public AppException()
   {
    if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误。");
   }

  public AppException(string message)
  {
   LogEvent(message);
  }

  public AppException(string message,Exception innerException)
  {
   LogEvent(message);
   if (innerException != null)
   {
    LogEvent(innerException.Message);
   }
  }

  //日志记录类
  using System;
  using System.Configuration;
  using System.Diagnostics;
  using System.IO;
  using System.Text;
  using System.Threading;

  namespace MyEventLog
  {
   /// <summary>
   /// 事件日志记录类,提供事件日志记录支持
   /// <remarks>
   /// 定义了4个日志记录方法 (error, warning, info, trace)
   /// </remarks>
   /// </summary>
   public class ApplicationLog
   {
    /// <summary>
    /// 将错误信息记录到Win2000/NT事件日志中
    /// <param name="message">需要记录的文本信息</param>
    /// </summary>
    public static void WriteError(String message)
    {
     WriteLog(TraceLevel.Error, message);
    }

    /// <summary>
    /// 将警告信息记录到Win2000/NT事件日志中
    /// <param name="message">需要记录的文本信息</param>
    /// </summary>
    public static void WriteWarning(String message)
    {
     WriteLog(TraceLevel.Warning, message);  
    }

    /// <summary>
    /// 将提示信息记录到Win2000/NT事件日志中
    /// <param name="message">需要记录的文本信息</param>
    /// </summary>
    public static void WriteInfo(String message)
    {
     WriteLog(TraceLevel.Info, message);
    }
    /// <summary>
    /// 将跟踪信息记录到Win2000/NT事件日志中
    /// <param name="message">需要记录的文本信息</param>
    /// </summary>
    public static void WriteTrace(String message)
    {
     WriteLog(TraceLevel.Verbose, message);
    }

    /// <summary>
    /// 格式化记录到事件日志的文本信息格式
    /// <param name="ex">需要格式化的异常对象</param>
    /// <param name="catchInfo">异常信息标题字符串.</param>
    /// <retvalue>
    /// <para>格式后的异常信息字符串,包括异常内容和跟踪堆栈.</para>
    /// </retvalue>
    /// </summary>
    public static String FormatException(Exception ex, String catchInfo)
    {
     StringBuilder strBuilder = new StringBuilder();
     if (catchInfo != String.Empty)
     {
      strBuilder.Append(catchInfo).Append("\r\n");
     }
     strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);
     return strBuilder.ToString();
    }

    /// <summary>
    /// 实际事件日志写入方法
    /// <param name="level">要记录信息的级别(error,warning,info,trace).</param>
    /// <param name="messageText">要记录的文本.</param>
    /// </summary>
    private static void WriteLog(TraceLevel level, String messageText)
    {
     try
     {
      EventLogEntryType LogEntryType;
      switch (level)
      {
       case TraceLevel.Error:
        LogEntryType = EventLogEntryType.Error;
        break;
       case TraceLevel.Warning:
        LogEntryType = EventLogEntryType.Warning;
        break;
       case TraceLevel.Info:
        LogEntryType = EventLogEntryType.Information;
        break;
       case TraceLevel.Verbose:
        LogEntryType = EventLogEntryType.SuccessAudit;
        break;
       default:
        LogEntryType = EventLogEntryType.SuccessAudit;
        break;
      }

      EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );
      //写入事件日志
      eventLog.WriteEntry(messageText, LogEntryType);

     }
    catch {} //忽略任何异常
   }
  } //class ApplicationLog
}  

   12.Panel 横向滚动,纵向自动扩展

<asp:panel style="overflow-x:scroll;overflow-y:auto;"></asp:panel>  

   13.回车转换成Tab

<script language="javascript" for="document" event="onkeydown">
  if(event.keyCode==13 && event.srcElement.type!='button' && event.srcElement.type!='submit' &&     event.srcElement.type!='reset' && event.srcElement.type!=''&& event.srcElement.type!='textarea');
    event.keyCode=9;
</script>

onkeydown="if(event.keyCode==13) event.keyCode=9"


   14.DataGrid超级连接列

DataNavigateUrlField="字段名" DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}"  

   15.DataGrid行随鼠标变色

private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
  if (e.Item.ItemType!=ListItemType.Header)
  {
   e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");
   e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");
  }
}  

   16.模板列

<ASP:TEMPLATECOLUMN visible="False" sorte­xpression="demo" headertext="ID">
<ITEMTEMPLATE>
<ASP:LABEL text='<%# DataBinder.Eval(Container.DataItem, "ArticleID")%>' runat="server" width="80%" id="lblColumn" />
</ITEMTEMPLATE>
</ASP:TEMPLATECOLUMN>

<ASP:TEMPLATECOLUMN headertext="选中">
<HEADERSTYLE wrap="False" horizontalalign="Center"></HEADERSTYLE>
<ITEMTEMPLATE>
<ASP:CHECKBOX id="chkExport" runat="server" />
</ITEMTEMPLATE>
<EDITITEMTEMPLATE>
<ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" />
</EDITITEMTEMPLATE>
</ASP:TEMPLATECOLUMN>  

   后台代码

protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)
{
  //改变列的选定,实现全选或全不选。
  CheckBox chkExport ;
  if( CheckAll.Checked)
  {
   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
   {
    chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
    chkExport.Checked = true;
   }
  }
  else
  {
   foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
   {
    chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
    chkExport.Checked = false;
   }
  }
}  

   17.数字格式化

   【<%#Container.DataItem("price")%>的结果是500.0000,怎样格式化为500.00?】

<%#Container.DataItem("price","{0:¥#,##0.00}")%>

int i=123456;
string s=i.ToString("###,###.00");  

   18.日期格式化

   【aspx页面内:<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%>

   显示为: 2004-8-11 19:44:28

   我只想要:2004-8-11 】

<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%>  

   应该如何改?

   【格式化日期】

   取出来,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd");

   【日期的验证表达式】

   A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31]

^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$  

   B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03]

^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$  

   【大小写转换】

HttpUtility.HtmlEncode(string);
HttpUtility.HtmlDecode(string)  

   19.如何设定全局变量

   Global.asax中

   Application_Start()事件中

   添加Application[属性名] = xxx;

   就是你的全局变量

   20.怎样作到HyperLinkColumn生成的连接后,点击连接,打开新窗口?

   HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")

   【ASPNETMENU】点击菜单项弹出新窗口

   在你的menuData.xml文件的菜单项中加入URLTarget="_blank",如:

<?xml version="1.0" encoding="GB2312"?>
<MenuData ImagesBaseURL="images/">
<MenuGroup>
<MenuItem Label="内参信息" URL="Infomation.aspx" >
<MenuGroup ID="BBC">
<MenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/>
<MenuItem Label="编制信息简报" URL="NewInfo.aspx" LeftIcon="file.gif" />
......  

   最好将你的aspnetmenu升级到1.2版

   21.读取DataGrid控件TextBox值

foreach(DataGrid dgi in yourDataGrid.Items)
{
  TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");
  tb.Text....
}  

   23.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE(金额)分别在5.6.7列,要求在录入数量及单价的时候自动算出金额即:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?

   〖思归〗

<asp:TemplateColumn HeaderText="数量">
<ItemTemplate>
<asp:TextBox id="ShuLiang" runat='server' Text='<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%>'
onkeyup="javascript:DoCal()"
/>

<asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" />
</ItemTemplate>
</asp:TemplateColumn>

<asp:TemplateColumn HeaderText="单价">
<ItemTemplate>
<asp:TextBox id="DanJian" runat='server' Text='<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%>'
onkeyup="javascript:DoCal()"
/>

<asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" />

</ItemTemplate>
</asp:TemplateColumn>

<asp:TemplateColumn HeaderText="金额">
<ItemTemplate>
<asp:TextBox id="JinE" runat='server' Text='<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%>' />
</ItemTemplate>
</asp:TemplateColumn><script language="javascript">
function DoCal()
{
  var e = event.srcElement;
  var row = e.parentNode.parentNode;
  var txts = row.all.tags("INPUT");
  if (!txts.length || txts.length < 3)
   return;

  var q = txts[txts.length-3].value;
  var p = txts[txts.length-2].value;

  if (isNaN(q) || isNaN(p))
   return;

  q = parseInt(q);
  p = parseFloat(p);

  txts[txts.length-1].value = (q * p).toFixed(2);
}
</script>  

   24.datagrid选定比较底下的行时,为什么总是刷新一下,然后就滚动到了最上面,刚才选定的行因屏幕的关系就看不到了。

page_load
page.smartNavigation=true  

   25.在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小 ?

private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
  for(int i=0;i<e.Item.Cells.Count-1;i++)
   if(e.Item.ItemType==ListItemType.EditType)
   {
    e.Item.Cells[i].Attributes.Add("Width", "80px")
   }
}  

   26.对话框

private static string ScriptBegin = "<script language=\"JavaScript\">";
private static string ScriptEnd = "</script>";

public static void ConfirmMessageBox(string PageTarget,string Content)
{
  string ConfirmContent="var retValue=window.confirm('"+Content+"');"+"if(retValue){window.location='"+PageTarget+"';}";

  ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;

  Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;
  ParameterPage.RegisterStartupScript("confirm",ConfirmContent);
  //Response.Write(strScript);
}  

   27. 将时间格式化:string aa=DateTime.Now.ToString("yyyy年MM月dd日");

   1.1 取当前年月日时分秒

currentTime=System.DateTime.Now;  

   1.2 取当前年

int 年= DateTime.Now.Year;  

   1.3 取当前月

int 月= DateTime.Now.Month;  

   1.4 取当前日

int 日= DateTime.Now.Day;  

   1.5 取当前时

int 时= DateTime.Now.Hour;  

   1.6 取当前分

int 分= DateTime.Now.Minute;  

   1.7 取当前秒

int 秒= DateTime.Now.Second;  

   1.8 取当前毫秒

int 毫秒= DateTime.Now.Millisecond;  

   28.自定义分页代码:

   先定义变量 :

public static int pageCount; //总页面数
public static int curPageIndex=1; //当前页面  

   下一页:

if(DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1))
{
  DataGrid1.CurrentPageIndex += 1;
  curPageIndex+=1;
}

bind(); // DataGrid1数据绑定函数  

   上一页:

if(DataGrid1.CurrentPageIndex >0)
{
  DataGrid1.CurrentPageIndex += 1;
  curPageIndex-=1;
}

bind(); // DataGrid1数据绑定函数  

   直接页面跳转:

int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()为跳转值

if(a<DataGrid1.PageCount)
{
  this.DataGrid1.CurrentPageIndex=a;
}

bind();  

   29.DataGrid使用:

   添加删除确认:

private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
  foreach(DataGridItem di in this.DataGrid1.Items)
  {
   if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem)
   {
    ((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm('确认删除此项吗?');");
   }
  }
}  

   样式交替:

ListItemType itemType = e.Item.ItemType;

if (itemType == ListItemType.Item )
{
  e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor='#FFFFFF';";
  e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor='#d9ece1';cursor='hand';" ;
}
else if( itemType == ListItemType.AlternatingItem)
{
  e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor='#a0d7c4';";
  e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor='#d9ece1';cursor='hand';" ;
}  

   添加一个编号列:

DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sql返回的DataTable
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"));

for(int i=0;i<dt.Rows.Count;i++)
{
  dt.Rows[i]["number"]=(i+1).ToString();
}

DataGrid1.DataSource=dt;
DataGrid1.DataBind();  

   DataGrid1中添加一个CheckBox,页面中添加一个全选框

private void CheckBox2_CheckedChanged(object sender, System.EventArgs e)
{
  foreach(DataGridItem thisitem in DataGrid1.Items)
  {
   ((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked;
  }
}  

   将当前页面中DataGrid1显示的数据全部删除

foreach(DataGridItem thisitem in DataGrid1.Items)
{
  if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked)
  {
   string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString();
   Del (strloginid); //删除函数
  }
}  

   30.当文件在不同目录下,需要获取数据库连接字符串(如果连接字符串放在Web.config,然后在Global.asax中初始化)

   在Application_Start中添加以下代码:

Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
    AppSettings["ConnStr"].ToString();  

   31. 变量.ToString()

   字符型转换 转为字符串

12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16进制)
12345.ToString("p"); //生成 1,234,500.00%  

   32、变量.Substring(参数1,参数2);

   截取字串的一部分,参数1为左起始位数,参数2为截取几位。 如:string s1 = str.Substring(0,2);

   33.在自己的网站上登陆其他网站:(如果你的页面是通过嵌套方式的话,因为一个页面只能有一个FORM,这时可以导向另外一个页面再提交登陆信息)

<SCRIPT language="javascript">
<!--
  function gook(pws)
  {
   frm.submit();
  }
//-->

</SCRIPT> <body leftMargin="0" topMargin="0" onload="javascript:gook()" marginwidth="0" marginheight="0">
<form name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post">
<tr>
<td>
<input id="f_user" type="hidden" size="1" name="f_user" runat="server">
<input id="f_domain" type="hidden" size="1" name="f_domain" runat="server">
<input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server">

<INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng">
<INPUT id="tem" type="hidden" size="1" value="2" name="tem">

</td>

</tr>

</form>  

   文本框的名称必须是你要登陆的网页上的名称,如果源码不行可以用vsniffer 看看。

   下面是获取用户输入的登陆信息的代码:

string name;
name=Request.QueryString["EmailName"];

try
{
  int a=name.IndexOf("@",0,name.Length);
  f_user.Value=name.Substring(0,a);
  f_domain.Value=name.Substring(a+1,name.Length-(a+1));
  f_pass.Value=Request.QueryString["Psw"];
}

catch
{
  Script.Alert("错误的邮箱!");
  Server.Transfer("index.aspx");
}  

posted @ 2008-03-07 15:32 风之相随 阅读(30) 评论(0)  编辑
今天是第一次在这里写日记,留点文字纪念一下。
posted @ 2007-12-15 11:35 风之相随 阅读(11) 评论(0)  编辑