发博文
个人资料
闫波
闫波
  • 博客等级:
  • 博客积分:216
  • 博客访问:27,395
  • 关注人气:5
博文
标签:

杂谈

分类: Oracle知识
方法一:

自己写的一个简单的string的split函数

因为有这个需求,需要切割字符串,在oracle中没有找到类似java的split函数,自己写了一个
plsql code:

 

data_type_for_cm中自定义类型:
type varcharArray is table of varchar2(25) index by binary_integer;

create or replace function str_split(
       str in varchar2,    --需要分割的字符串
       pattern in varchar2 --分隔符
      )
      return data_type_for_cm.varcharArray -- 自定义的字符串数组
      is
len number;--分割的数组元素个数
i number;--position位置
res varchar2(100);
up_len number;--上一个位置
down_len number;--下一个位置
cstr data_type_for_cm.varcharArray;--声明集合
begin
       --判断有多少个','号,那么分割的集合元素个数是len+1
       len:=length(trim(translate(str,replace(str,pattern),' ')));
       len := nvl(len, 0);--防止输入如"1",","
       if (len = 0) then
          cstr(1) := str;
          return cstr;
       end if;

       for j in 1..len+1 loop--j是集合元素下标
         if j=1 then
             i:=instr(str,pattern,1,j);
             res:=substr(str,1,i-1);
             --cstr.extend(1);
             res := nvl(res, '');--防止输入"1,,,2", ","
             if length( res) > 0 then
                cstr(cstr.count + 1):=trim(res);
             end if;
             up_len := i;
             down_len := i;
          elsif j<len+1 then
             i:=instr(str,pattern,1,j);
             down_len:=i;
             res:=substr(str,up_len+1,down_len-up_len-1);
             --cstr.extend(1);
             res := nvl(res, '');--防止输入"1,,,2", ","
             if length( res) > 0 then
                cstr(cstr.count + 1):=trim(res);
             end if;
             up_len:=i;
           else
             res:=substr(str,down_len+1);
             res := nvl(res, '');--防止输入"1,,,2", ","
             if length( res) > 0 then
                cstr(cstr.count + 1):=trim(res);
             end if;
           end if;  
      end loop;
      return cstr;
end str_split;

test

方法二:
在网上看了几个,下面发上来 




CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);


CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)

     RETURN ty_str_split PIPELINED

IS

     j INT := 0;

    i INT := 1;

    len INT := 0;

    len1 INT := 0;

    str VARCHAR2 (4000);

BEGIN

     len := LENGTH (p_str);

    len1 := LENGTH (p_delimiter);



     WHILE j < len

     LOOP

         j := INSTR (p_str, p_delimiter, i);



         IF j = 0

         THEN

             j := len;

            str := SUBSTR (p_str, i);

            PIPE ROW (str);



             IF i >= len

             THEN

                EXIT;

            END IF;

         ELSE

            str := SUBSTR (p_str, i, j - i);

            i := j + len1;

            PIPE ROW (str);

        END IF;

    END LOOP;



     RETURN;

END fn_split;

/





--测试:



SELECT * FROM TABLE (fn_split ('1;;12;;123;;1234;;12345', ';;'));





 

PLS-00653错误及解决

       声明为PIPELINED的函数不能在PL/SQL中使用,需要使用平面函数或者select * bulk collect into tab_oe_list from table(oe_list(pi_hr4u_id));代替

       如执行以下过程将会发生错误:

       create or replace type hrp_oe_list as table of varchar2(10)

       /

FUNCTION oe_list(pi_hr4u_id IN hrp_users.usr_hr4u_id%TYPE)
RETURN hrp_oe_list
PIPELINED

As

Begin

end;

       /

       然后在PL/SQL中调用将会失败:

       tab_oe_list hrp_oe_list;

       tab_oe_list := oe_list(pi_hr4u_id);

       会发生PLS-00653错误。

方法三:

将表格的某一列转换成逗号分隔的字符串的另类方法

A:dbms_utility.table_to_comma的使用
一:首先建立测试表
create table table1
(
dz varchar2(100)
)
insert into table1 values('v');
insert into table1 values('dywm');
commit;

SQL> select * from table1;

DZ
--------------------------------------------------------------------------------
v
dywm

二:建立存储过程
create or replace procedure test_column_row as
qq1 dbms_utility.uncl_array;
l_tablen number;
l_tab varchar2(1000);
begin
select dz bulk collect into qq1 from table1;
dbms_utility.table_to_comma(qq1, l_tablen, l_tab);
dbms_output.put_line(l_tab);
end;

三:运行结果如下:
SQL> set serveroutput on
SQL> execute test_column_row;

v,dywm

PL/SQL procedure successfully completed

附:字符串<=>table相互转换的例子
create or replace procedure schema_table as

type vcArray is table of varchar2(4000);
l_names vcArray := vcArray('sswe,oejic,wwer', 'a , b , c',
'e123o,a688j9,d557i5', 'd334a,q225d,w67s7');
l_tablen number;
l_tab dbms_utility.uncl_array;
begin
for i in 1 .. l_names.count
loop
dbms_output.put_line('i_names(' || i || ')=' || l_names(i));
begin
dbms_utility.comma_to_table(l_names(i), l_tablen, l_tab);
for j in 1 .. l_tablen
loop
dbms_output.put_line('l_tab(' || j || ')=' || l_tab(j));
end loop;
l_names(i) := null;
dbms_utility.table_to_comma(l_tab, l_tablen, l_names(i));
dbms_output.put_line(l_names(i));
end;
end loop;
end;

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: C#

在winform程序中给form添加了keyup事件,但是程序却不响应键盘事件,解决办法是重写Form基类的ProcessCmdKey(ref Message msg, Keys keyData)方法。

 

01 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
02        {
03            if (keyData == Keys.F4)
04            {
05                FormFastHitStates form = new FormFastHitStates();
06                form.ShowDialog();
07            }
08              
09            return true;
10            //return base.ProcessCmdKey(ref msg, keyData);
11        }

 

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: C#
 

   下面是一个最最简单的基本例子,在存储过程上oracle与sql还是有很大的区别。

 

    首先,创建包规范:

     create or replace package stupkg   ----stupkg是包的名称

    is

        type mycursor is ref cursor;     -------定义一个名为mycursor的类型

        procedure getstudentinfo(cur_mycursor out mycursor);  

    end;  ----包规范中包括定义的一个mycursor类型和存储过程getstudentinfo

 

   其次,创建包体(主要是存储过程)

   create or replace package body stupkg

    is

      procedure getstudentinfo(cur_mycursor out mycursor)

      is

      begin

           open cur_mycursor for select * from student;

      end getstudentinfo;

    end stupkg;

 

 以上也就完成了select结果集存储过程的创建,下面看一下C#如何使用其结果集:

 OracleCommand orclcomm = new OracleCommand("stupkg.getstudentinfo",oraconn);

 orclcomm.CommandType = CommandType.StoredProcedure;

 OracleParameter parament = new OracleParameter("cur_mycursor",OracleType.Cursor);

 parament.Direction = ParameterDirection.Output;

 orclcomm.Parameters.Add(parament);

 OracleDataAdapter oda = new OracleDataAdapter(orclcomm);

 DataSet ds = new DataSet();

 oda.Fill(ds);

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: C#

CREATE OR REPLACE PACKAGE pkg_tableType
IS
     type Tabletype is ref cursor;
     PROCEDURE SP_CPZD
      (
      CPNO IN VARCHAR2,
      STATUS IN VARCHAR2,
      t_sql out Tabletype
      );
END;
CREATE OR REPLACE package BODY pkg_tableType
is
PROCEDURE SP_CPZD
(
CPNO IN VARCHAR2,
STATUS IN VARCHAR2,
t_sql out Tabletype
)
IS
BEGIN
        OPEN t_sql FOR

        select *  from ball b where b.no=CPNO  and  b.type =STATUS ;

END SP_CPZD;
END pkg_tableType;
#region 存储过程操作
     /// <summary>
  /// 执行存储过程
  /// </summary>
  /// <param name="storedProcName">存储过程名</param>
  /// <param name="parameters">存储过程参数</param>
  /// <returns>OracleDataReader</returns>
  public static OracleDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )
  {
   OracleConnection connection = new OracleConnection(connectionString);
   OracleDataReader returnReader;
   connection.Open();
   OracleCommand command = BuildQueryCommand( connection,storedProcName, parameters );
   command.CommandType = CommandType.StoredProcedure;
   returnReader = command.ExecuteReader();    
   return returnReader;   
  }
  /// <summary>
  /// 执行存储过程
  /// </summary>
  /// <param name="storedProcName">存储过程名</param>
  /// <param name="parameters">存储过程参数</param>
  /// <param name="tableName">DataSet结果中的表名</param>
  /// <returns>DataSet</returns>
  public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName )
  {
   using (OracleConnection connection = new OracleConnection(connectionString))
   {
    DataSet dataSet = new DataSet();
    connection.Open();
    OracleDataAdapter sqlDA = new OracleDataAdapter();
    sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters );
    sqlDA.Fill(dataSet, tableName );
    connection.Close();
    return dataSet;
   }
  }  
  /// <summary>
  /// 构建 OracleCommand 对象(用来返回一个结果集,而不是一个整数值)
  /// </summary>
  /// <param name="connection">数据库连接</param>
  /// <param name="storedProcName">存储过程名</param>
  /// <param name="parameters">存储过程参数</param>
  /// <returns>OracleCommand</returns>
  private static OracleCommand BuildQueryCommand(OracleConnection connection,string storedProcName, IDataParameter[] parameters)
  {   
   OracleCommand command = new OracleCommand(storedProcName, connection );
   command.CommandType = CommandType.StoredProcedure;
   foreach (OracleParameter parameter in parameters)
   {
    command.Parameters.Add( parameter );
   }
   return command;   
  }
  /// <summary>
  /// 执行存储过程,返回影响的行数  
  /// </summary>
  /// <param name="storedProcName">存储过程名</param>
  /// <param name="parameters">存储过程参数</param>
  /// <param name="rowsAffected">影响的行数</param>
  /// <returns></returns>
  public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected )
  {
   using (OracleConnection connection = new OracleConnection(connectionString))
   {
    int result;
    connection.Open();
    OracleCommand command = BuildIntCommand(connection,storedProcName, parameters );
    rowsAffected = command.ExecuteNonQuery();
    result = (int)command.Parameters["ReturnValue"].Value;
    //Connection.Close();
    return result;
   }
  }
  /// <summary>
  /// 创建 OracleCommand 对象实例(用来返回一个整数值) 
  /// </summary>
  /// <param name="storedProcName">存储过程名</param>
  /// <param name="parameters">存储过程参数</param>
  /// <returns>OracleCommand 对象实例</returns>
  private static OracleCommand BuildIntCommand(OracleConnection connection,string storedProcName, IDataParameter[] parameters)
  {
   OracleCommand command = BuildQueryCommand(connection,storedProcName, parameters );
   command.Parameters.Add( new OracleParameter ( "ReturnValue",
    OracleType.Int32,4,ParameterDirection.ReturnValue,
    false,0,0,string.Empty,DataRowVersion.Default,null ));
   return command;
  }

  #endregion 

        public DataSet GetCPResult(string s_aN_CPNO)
        {
            OracleParameter[] parameter = {
                new OracleParameter("CPNO",OracleType.VarChar,100),
                new OracleParameter("STATUS",OracleType.VarChar,100),//注意:这里参数名称前面都不能加":"
                new OracleParameter("t_sql", OracleType.Cursor)};
            parameter[0].Value = s_aN_CPNO;
            parameter[1].Value = "3";
            parameter[2].Direction = System.Data.ParameterDirection.Output;
            return RunProcedure("pkg_tabletype.sp_cpzd", parameter, "ds");
        }

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2011-07-09 10:19)
标签:

杂谈

分类: C#

C# 中使用JSON - DataContractJsonSerializer

C#中使用JSON不需要使用第三方库,使用.NET Framwork3.5自带的System.Runtime.Serialization.Json即可很好的完成JSON的解析。

关于JSON的入门介绍见(首页的图很形象):

http://www.json.org/

一、Using

需要添加引用:System.ServiceModel.Web 和 System.Runtime.Serialization,然后使用Using:

using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;

 二、定义序列化的类

假如我们要转化的JSON字符串格式为:

{
    
"encoding":"UTF-8",
    
"plug-ins":["python","c++","ruby"],
    
"indent":{
        
"length":3,
        
"use_space":true
    }
}

然后编写相应的序列化的类,注意下面类加的Attribute:

JSON Object[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class Config
{
    [DataMember(Order 
= 0)]
    
public string encoding { getset; }
    [DataMember(Order 
= 1)]
    
public string[] plugins { getset; }
    [DataMember(Order 
= 2)]
    
public Indent indent { getset; }
}

[DataContract(Namespace 
= "http://coderzh.cnblogs.com")]
class Indent
{
    [DataMember(Order 
= 0)]
    
public int length { getset; }
    [DataMember(Order 
= 1)]
    
public bool use_space { getset; }
}

三、对象转化为JSON字符串

使用WriteObject方法:

WriteObject
var config = new Config(){
                         encoding 
= "UTF-8",
                         plugins 
= new string[]{"python""C++""C#"},
                         indent 
= new Indent(){ length = 4, use_space = false}
                         };
var serializer 
= new DataContractJsonSerializer(typeof(Config));
var stream 
= new MemoryStream();
serializer.WriteObject(stream, config);

byte[] dataBytes = new byte[stream.Length];

stream.Position 
= 0;

stream.Read(dataBytes, 
0, (int)stream.Length);

string dataString = Encoding.UTF8.GetString(dataBytes);

Console.WriteLine(
"JSON string is:");
Console.WriteLine(dataString);

四、JSON字符串转对象

使用ReadObject方法:

ReadObject
var mStream = new MemoryStream(Encoding.Default.GetBytes(dataString));
Config readConfig 
= (Config)serializer.ReadObject(mStream);

Console.WriteLine(
"Encoding is: {0}", readConfig.encoding);
foreach (string plugin in readConfig.plugins)
{
    Console.WriteLine(
"plugins is: {0}", plugin);
}
Console.WriteLine(
"indent.length is: {0}", readConfig.indent.length);
Console.WriteLine(
"indent.use_space is: {0}", readConfig.indent.use_space);

 五、输出结果:

JSON string is:
{
"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}
Encoding 
is: UTF-8
plugins 
is: python
plugins 
is: C++
plugins 
is: C#
indent.length 
is4
indent.use_space 
is: False
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: C#

asp.net基于jquery的ajax二级联动

(2010-05-25 13:32:16)
分类: ASP.NET

index.aspx

<script src="../ADMIN/js/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function() {

//预先加载第一个select,加载品牌,看好加载的的页面BrandHandler.ashx

        $.post('BrandHandler.ashx', {}, function(data) { $("#carbrand").html(data) }, 'html');

//当选择品牌的时候加载二级车系,构成联动
        $("#carbrand").change(function() {
        $.post('TypeHandler.ashx', { cartype: $(this).val() }, function(data) { $("#cartype").empty().html(data) }, 'html');
        });
    });
</script>
<table  width="950" height="35" border="0" cellpadding="0" cellspacing="0" class="left_tb">
  <tr>
    <td width="70" align="right" background="../IMAGES/b_4.gif"><img src="../IMAGES/serch_so.gif" width="59" height="17" /></td>
    <td width="100" background="../IMAGES/b_4.gif">
        <select id="carbrand" name="carbrand" >
            <option value="-1">--选择品牌--</option>
        </select>
        </td>
    <td width="105" background="../IMAGES/b_4.gif">
        <select id="cartype" name="cartype" >
            <option value="-1">--选择车系--</option>
        </select>
        </td>
    <td background="../IMAGES/b_4.gif" style="width:80px">
        &nbsp;
       <a href="###" id="search_type"><img  src="../IMAGES/serch.gif" alt="搜索" style="border:0px"/></a>
       </td>
    <td width="120" background="../IMAGES/b_4.gif">
        <input id="TextKeys" type="text"   />
        </td>
    <td width="100" align="left" background="../IMAGES/b_4.gif">
   <a href="###" id="search_news"> <img alt="新闻资讯" src="../IMAGES/serch.gif"  style="border:0"/></a>
    </td>
  </tr>
</table>

 

 

BrandHandler.ashx

  1. using System;   
  2. using System.Web;   
  3. using System.Data;   
  4. using System.Text;   
  5. using System.Data.SqlClient;   
  6. using Tools;   
  7. public class BrandHandler IHttpHandler {   
  8.        
  9.     public void ProcessRequest (HttpContext context) {   
  10.         context.Response.ContentType "text/plain";   
  11.         string ssql "select from D_CARS_BRAND_TYPE where CARS_BRAND_TYPE>=-1 order by ORDER_NO asc";   
  12.         SqlDataReader dr (SqlDataReader)DataBase.GetDataReader(ssql);   
  13.         StringBuilder st new StringBuilder();   
  14.         while(dr.Read())   
  15.         {   
  16.             st.Append("<option value=\"" dr["CARS_BRAND_TYPE"].ToString() "\">" dr["CARS_BRAND_TYPE_NAME"].ToString() "</option>\n");   
  17.         }   
  18.         dr.Close();   
  19.         context.Response.Write(st.ToString());   
  20.     }   
  21.     
  22.     public bool IsReusable {   
  23.         get {   
  24.             return false;   
  25.         }   
  26.     }   
  27.  

 

TypeHandler.ashx

 

  1. using System;   
  2. using System.Web;   
  3. using System.Data;   
  4. using System.Text;   
  5. using System.Data.SqlClient;   
  6. using Tools;   
  7. public class TypeHandler IHttpHandler   
  8. {   
  9.     public void ProcessRequest(HttpContext context)   
  10.     {   
  11.         context.Response.ContentType "text/plain";   
  12.         context.Response.Clear();   
  13.         int cartype 0;   
  14.         if (int.TryParse(context.Request.Form["cartype"].ToString(), out cartype))   
  15.         {   
  16.             string ssql "select from D_CARS_TYPE where CARS_BRAND_TYPE=" cartype order by ORDER_NO asc";   
  17.             SqlDataReader dr (SqlDataReader)DataBase.GetDataReader(ssql);   
  18.             StringBuilder st new StringBuilder();   
  19.             while (dr.Read())   
  20.             {   
  21.                 st.Append("<option value=\"" dr["CARS_TYPE"].ToString() "\">" dr["CARS_TYPE_NAME"].ToString() "</option>\n");   
  22.             }   
  23.             dr.Close();   
  24.             context.Response.Write(st.ToString());   
  25.         }   
  26.         else  
  27.             context.Response.Write("<option value='1'>--出现错误--</option>");   
  28.     }   
  29.     public bool IsReusable   
  30.     {   
  31.         get  
  32.         {   
  33.             return false;   
  34.         }   
  35.     }   
  36.  
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

eval和bind

杂谈

分类: C#
 
1.简单描述Eval和Bind的区别


绑定表达式
<%# eval_r("字段名") %>
<%# Bind("字段名") %>


区别 1.eval是只读数据,bind是可更新的.

        2.当对次表达式操作时候,必须用Eval 如<%# eval_r("字段名").ToString().Trim() %>

        2.若GridView中绑定列里面 设置 内容格式 DataFormateString ={0:d} ,则 必须把 属性 HtmlCode 设置为false,否则无法 起作用;

        Eval 单向绑定:数据是只读的
        Bind 双向绑定:数据可以更改,并返回服务器端,服务器可以处理更改后的数据,如存入数据库.


2、详细介绍
eval_r()方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法


Eval 方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。Bind 方法支持读/写功能,可以检索数据绑定控件的值并将任何更改提交回数据库。

使用 Eval 方法
Eval 方法可计算数据绑定控件(如 GridView、DetailsView 和 FormView 控件)的模板中的后期绑定数据表达式。在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如 GridView 控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用 Eval 方法。

Eval 方法以数据字段的名称作为参数,从数据源的当前记录返回一个包含该字段值的字符串。可以提供第二个参数来指定返回字符串的格式,该参数为可选参数。字符串格式参数使用为 String 类的 Format 方法定义的语法。

使用 Bind 方法
Bind 方法与 Eval 方法有一些相似之处,但也存在很大的差异。虽然可以像使用 Eval 方法一样使用 Bind 方法来检索数据绑定字段的值,但当数据可以被修改时,还是要使用 Bind 方法。  

在 ASP.NET 中,数据绑定控件(如 GridView、DetailsView 和 FormView 控件)可自动使用数据源控件的更新、删除和插入操作。例如,如果已为数据源控件定义了 SQL Select、Insert、Delete 和 Update 语句,则通过使用 GridView、DetailsView 或 FormView 控件模板中的 Bind 方法,就可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。出于这个原因,在数据绑定控件的 EditItemTemplate 或 InsertItemTemplate 中要使用 Bind 函数。

Bind 方法通常与输入控件一起使用,例如由编辑模式中的 GridView 行所呈现的 TextBox 控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。  

Bind 方法采用数据字段的名称作为参数,从而与绑定属性关联,如下面的示例所示:
<EditItemTemplate>
  <table>
    <tr>
      <td align=right>
        <b>Employee ID:</b>
      </td>
      <td>
        <%# eval_r("EmployeeID") %>
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>First Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
          Text='<%# Bind("FirstName") %>' />
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>Last Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
            Text='<%# Bind("LastName") %>'  />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:LinkButton ID="UpdateButton" RunAt="server"
          Text="Update" CommandName="Update" />
          
        <asp:LinkButton ID="CancelUpdateButton" RunAt="server"
          Text="Cancel" CommandName="Cancel" />
      </td>
    </tr>
  </table>
</EditItemTemplate>

单击行的 Update 按钮时,使用 Bind 语法绑定的每个控件属性值都会被提取出来,并传递给数据源控件以执行更新操作。


使用 DataBinder.Eval
ASP.NET 提供了一个名为 DataBinder.Eval 的静态方法,该方法计算后期绑定的数据绑定表达式,并将结果格式化为字符串(可选)。利用此方法,可以避免许多在将值强制为所需数据类型时必须执行的显式强制转换操作。

例如,在下面的代码片段中,一个整数显示为货币字符串。使用标准的 ASP.NET 数据绑定语法,必须首先强制转换数据行的类型以便检索数据字段 IntegerValue。然后,这将作为参数传递到 String.Format 方法:

<%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %>

将此语法与 DataBinder.Eval 的语法进行比较,后者只有三个参数:数据项的命名容器、数据字段名称和格式字符串。在模板化列表中(如 DataList 类、DataGrid 类或 Repeater 类),命名容器始终是 Container.DataItem。

<%# DataBinder.eval_r(Container.DataItem, "IntegerValue", "{0:c}") %>
  
格式字符串参数是可选的。如果它被忽略,DataBinder.Eval 将返回类型对象的值,如下面的示例所示:

<%# (bool)DataBinder.eval_r(Container.DataItem, "BoolValue") %>

当对模板化列表中的控件进行数据绑定时,DataBinder.Eval 特别有用,因为数据行和数据字段通常都必须强制转换。
3.其它
Eval:绑定的是只读数据的显示;Bind:可以绑定只读数据也可以绑定更新数据,Bind方法还把字段和控件的绑定属性联系起来,使得数据控件(比如GridView等)的Update、Insert和Delete等方法可以使用这种联系来作出相应的处理。

    Eval 和 Bind绑定的数据在<%# %> 显示, 若对要显示的数据作修改或者操作也在<%# %> 中,例如:

   1, 对显示的字符串作字符显示:<%# (eval_r("Address")).ToString().SubString(0,10)%>,显示10位数的地址。

   2, 对显示的信息作判断:<%# (eval_r("if_delete")).ToString == "yes" ?"已删除":"未删除"%>

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2011-06-11 12:12)
标签:

杂谈

分类: C#

C#数据绑定概述

C# 2009-07-22 16:46:41 阅读764 评论0   字号: 订阅

摘自  http://www.cnblogs.com/weishuai/archive/2009/05/12/1454611.html

个人在做asp.net项目实习时,遇到数据绑定,由于以前一直是复制别人的代码,所以这次自己从头到尾打算一个人开发,顿觉自己对数据绑定一知半解,所以上网搜索了一些文章,在次记录自己的心得与体会!

1、数据绑定表达式必须包含在<%#和%>字符之间。

2、ASP.NET 支持分层数据绑定模型,数据绑定表达式使用 Eval 和 Bind 方法将数据绑定到控件,并将更改提交回数据库。Eval 方法是静态单向(只读)方法,所以Eval 函数用于单向(只读)绑定,该方法采用数据字段的值作为参数并将其作为字符串返回。Bind 方法支持读/写功能,所以Bind 函数用于双向(可更新)绑定。该方法可以检索数据绑定控件的值并将任何更改提交回数据库。XPath 方法支持对XML类型的数据源提供支持。

3、数据绑定表达式都可以出现在页面的哪个位置呢?

  一,可以将数据绑定表达式包含在服务器控件或者普通的html元素的开始标记中属性名/属性值对的值侧。例如:

  <asp:TextBox ID="TextBox1" runat="server" Text='<%#数据绑定表达式%>' ></asp:TextBox><br />

  注意条款:此时数据的绑顶表达式可以是一个变量,也可以是一个带返回值的C#或者VB.NET方法,还可以是某个控件的某个属性的值,也可以是C#或者VB.NET对象的某个字段或者属性的值等等。当然也可以直接就是一个字符串,例如"hello"。

      如果此时的数据绑定表达式是Eval("数据库中某个表的某个字段")等,那么必须把TextBox1放在某个循环显示的控件的模板中才正确,否则会提示:Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。其实就是想让你把TextBox1放在像Repeater,DataList,GridView这样的控件的模板中。

  二、数据绑定绑定表达式包含在在页面中的任何位置。例如:

  <form id="form1" runat="server">

    <div>

     <%#Eval("数据绑定表达式1")%>  

     <%#Eval("数据绑定表达式2")%>        

    </div>

</form>

  同样遵循"一"的注意条款。

如果此时的数据绑定表达式是Eval("数据库中某个表的某个字段")等,那么必须把 <%#Eval("数据绑定表达式1")%>   <%#Eval("数据绑定表达式2")%>  放在像Repeater,DataList,GridView这样的控件的模板中。

  三、可以将数据绑定表达式包含在Javascript代码中,从而实现在Javascript中调用C#或者VB.NET的方法。

 4、数据绑定表达式都可以是什么类型呢?

  一、可以是一个变量

例如:<asp:Label ID="Label1" runat="server" Text="<%#变量名%>"></asp:Label>

  二、可以是服务器控件的属性值

例如: <asp:Label ID="Label1" runat="server" Text="<%#TextBox2.Text %>"></asp:Label>

  三、可以是一个数组等集合对象

例如把一个数组绑定到列表控件,例如ListBox等,或者Repeater,DataList,GridView这样的控件等,此时只需要把属性DataSource='<%# 数组名%>' 。

  四,可以是一个表达式

例如:Person是一个对象,Name和City是它的2个属性,则数据绑定表达式可以这样写:

<%#(Person.Name + " " + Person.City)%>。

  五、可以是一个方法

例如:<%#GetUserName()%>。GetUserName()是一个已经定义的C#方法,一般要求有返回值。

  六、可以是用Eval,DateBinder.Eval取得的数据表的字段,这个是最常见的了,不再举例。    

    5、与数据库有关而且绑定到DataView,DataTable,DataSet 等数据源的数据绑定表达式都有那些?

  一、<%#DataBinder.Eval(Container.DataItem,"字段名")%>

      <%#DataBinder.Eval(Container.DataItem,"字段名","{0:c}") %>

Container.DataItem相当于数据库中某个表或者视图中的一行记录,而一行可以有很多列。

      最后一个参数和 String.Format的形式一样。例如c代表货币,p代表百分号,d代表短日期格式显示,f代表浮点数现实,f3代表小数点后三为,一次类推。

  二、<%#Eval("字段名")%>

     <%#Eval("字段名","{0:c}")%>

     .NET 2.0新出现的一个方法。和DataBinder.Eval()等价。

     最后一个参数和 String.Format的形式一样。例如c代表货币,p代表百分号,d代表短日期格式显示,f代表浮点数现实,f3代表小数点后三位,一次类推。

   三、 <%#((DataRowView)Container.DataItem)["字段名"] %>

      <%# string.Format("{0:c}", ((DataRowView)Container.DataItem)["字段名"])%>

      Container.DataItem相当于数据库中某个表或者视图中的一行记录,而一行可以有很多列。  

      用String.Format方法设定字段的显示样式。例如c代表货币,p代表百分号,d代表短日期格式显示,f代表浮点数现实,f3代表小数点后三为,一次类推。

       

       类型转换例子:<%# (int)((DataRowView)Container.DataItem)["字段名1"]*(int)((DataRowView)Container.DataItem)["字段名2"]%>    意思是2个字段相乘。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: 通讯组件

破解telecomadmin的密码

之所以telecomadmin的密码会变,就是因为这个猫的远程控制功能,一街上电话线密码就被电信改了,导致我们无法设置路由功能。

ctce8.cfg复制到USB存储设备的根目录,该文件在文末可获取
切断大亚猫的电源
拔掉电话线
插入USB存储设备
开启大亚猫的电源,注意不要接电话线
打开电脑,插上网线,等待大亚猫启动并且刷新配置
在浏览器打开【http://192.168.1.1
输入用户名【telecomadmin
输入密码【nE7jA%5m
点击【网络】【远程管理】
通知:【不可用】
ACS URL
:把这个地址改了,让电信无法连接你,比如改成【http://abc.com/acs ,不过要记住原来的ACS URL
ACS
用户名随便改、ACS密码别动,不过要记住原来的用户名
选择【连接请求认证】为有效,注意一定要选中它
连接请求用户名,不要默认值,随便改,让电信无法连接你,比如都改成【howhfofjwoafe ,但是请记住原来的用户名
记得点击【保存/应用】以保存设置
点击【管理】【用户管理】,修改useradmin的密码,并且请记住这个密码
点击【管理】【设备管理】,记得这时一定拔掉USB存储设备
点击【保存/重启】以重启猫,使前面的设置生效,注意请耐心等待几分钟,还要记得拔下USB存储设备,不然又回去了
重新设置ADSL网络连接

重启完成后,在用前面的telecomadmin登录
点击【网络】【宽带设置】
遵循下列设置
连接名称:【新建一个连接】
连接模式:【Route
选择【PPPoE
选择【NAT】为有效
VPI】与【VCI】请咨询你的ADSL服务提供商,因为各个地区是不一样的
服务类别:【UBR Without PCR
选择【启用VLAN】为无效
VLAN ID
:为空白,即【】
封装:【LLC/SNAP-BRIDGING
【用户名】、【密码】填写你的ADSL帐号和密码
服务名称:【】
选择【启用802.1p队例优先级】为无效
服务类别绑定:【普通】
选择【LAN1】、【LAN3】、【LAN4】、【无线1】为有效,注意【LAN2】不要选,因为它是IPTV数字电视的端口
点击【确定】
无线网络设置

点击【网络】WLAN配置】
选择【启用无线】为有效
SSID
:随便一个名称,就是电脑连的时候看见的名字,然后填好密码,其他默认设置即可
点击【确定】
让电驴变成HighID(使用NAT虚拟服务器)

点击【应用】【高级NAT设置】
点击虚拟主机设置下的【添加】
弹出另一个页面,点击【添加】
服务器选【客户端服务器】,文本框起个名字,比如【P2P
服务器IP地址填写自己的内网地址,比如【192.168.1.100
下面的表格按照如下的方式填写 外部起始端口 外部结束端口 协议 内部起始端口 内部结束端口 远程IP 远程端口
xxxx xxxx TCP xxxx xxxx
yyyy yyyy UDP yyyy yyyy
其中xxxx是电驴的TCP端口号,yyyy是电驴UDP端口号,可以照着电驴的设置写,然后点击表格下方的【保存/应用】
点击【应用】UPNP配置】
选择【启用UPNP】为有效
点击【确定】
然后一定要重启猫才能让设置有效!
让电驴变成HighID(使用DMZ

点击【安全】【防火墙】
设置【防火墙】为关闭
点击【应用】【高级NAT设置】
选择【启用DMZ】为有效
DMZ主机IP地址】就看自己电脑的内网地址
点击【保存/应用】
点击【应用】UPNP配置】
选择【启用UPNP】为有效
点击【确定】
然后一定要重启猫才能让设置有效!
恢复IPTV

如果发现配置过路由了却无法连接上IPTV的话,那么请把远程管理的功能恢复到原来的状态,也就是ACS URLACS用户名和连接请求用户名都恢复成初始的值,但是可能下一次无法再用telecomadmin登录,但是不要紧只要这次修改好路由,以后应该用不着动它,大不了就再用USB存储设备的再来一下……

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

分类: 网络知识

本文网址:http://bbs.bitscn.com/265664 复制

 

子网掩码是每个网管必须要掌握的基础知识,只有掌握它,才能够真正理解TCP/IP协议的设置。以下我们就来深入浅出地讲解什么是子网掩码。

  IP地址的结构

  要想理解什么是子网掩码,就不能不了解IP地址的构成。互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。IP地址在设计时就考虑到地址分配的层次特点,将每个IP地址都分割成网络号和主机号两部分,以便于IP地址的寻址操作。

 

 

IP地址的网络号和主机号各是多少位呢?如果不指定,就不知道哪些位是网络号、哪些是主机号,这就需要通过子网掩码来实现。

  什么是子网掩码 ]
  子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。

  子网掩码的设定必须遵循一定的规则。与IP地址相同,子网掩码的长度也是32位,左边是网络位,用二进制数字“1”表示;右边是主机位,用二进制数字“0”表示。附图所示的就是IP地址为“192.168.1.1”和子网掩码为“255.255.255.0”的二进制对照。其中,“1”有24个,代表与此相对应的IP地址左边24位是网络号;“0”有8个,代表与此相对应的IP地址右边8位是主机号。这样,子网掩码就确定了一个IP地址的32位二进制数字中哪些是网络号、哪些是主机号。这对于采用TCP/IP协议的网络来说非常重要,只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。
QDanl3 6 
  常用的子网掩码

  子网掩码有数百种,这里只介绍最常用的两种子网掩码,它们分别是“255.255.255.0”和“255.255.0.0”。

  1.子网掩码是“255.255.255.0”的网络:最后面一个数字可以在0~255范围内任意变化,因此可以提供256个IP地址。但是实际可用的IP地址数量是256-2,即254个,因为主机号不能全是“0”或全是“1”。

  2.子网掩码是“255.255.0.0”的网络:后面两个数字可以在0~255范围内任意变化,可以提供2552个IP地址。但是实际可用的IP地址数量是2552-2,即65023个。 ‑
  IP地址的子网掩码设置不是任意的。如果将子网掩码设置过大,也就是说子网范围扩大,那么,根据子网寻径规则,很可能发往和本地机不在同一子网内的目的机的数据,会因为错误的判断而认为目的机是在同一子网内,那么,数据包将在本子网内循环,直到超时并抛弃,使数据不能正确到达目的机,导致网络传输错误;如果将子网掩码设置得过小,那么就会将本来属于同一子网内的机器之间的通信当做是跨子网传输,数据包都交给缺省网关处理,这样势必增加缺省网关的负担,造成网络效率下降。因此,子网掩码应该根据网络的规模进行设置。

  如果一个网络的规模不超过254台电脑,采用“255.255.255.0”作为子网掩码就可以了,现在大多数局域网都不会超过这个数字,因此“255.255.255.0”是最常用的IP地址子网掩码;笔者见到的最大规模的中小学校园网具有1500多台电脑,这种规模的局域网可以使用“255.255.0.0”。
服务器或路由器及电脑上上设置此子网掩码,上网电脑的IP可以设置为与服务器或路由器上的不同段,如:路由器为192.168.0.1 而其它电脑可以分别设置为:192.168.1.4或192.168.2.4,都可以上网!

  默认子网掩码

  在Windows 2000 Server中,如果给一个网卡指定IP地址,系统会自动填入一个默认的子网掩码。这是Windows 2000 Server为了节省用户输入时间自动产生的子网掩码。比如,局域网最常使用的IP地址“192.168.x.x”默认的子网掩码是“255.255.255.0”。一般情况下,IP地址使用默认子网掩码就可以了。【转自bbs.bitsCN.com】

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有