kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  412 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

#

mark 标记
http://hi.baidu.com/bitbull/blog/item/bc27581eca1886f61bd5768e.html

posted @ 2007-07-26 09:26 kenlistian 阅读(239) | 评论 (0)编辑 收藏

在用jsp开发网站时,其中需要连接到后台mssql server,但是mssql server 中的数据库是不是缺省的实例。因而在写jdbc的连接是不能直接用odbc来实现(主要我不会写),则采用微软的SQLServer2000 JDBC驱动来实现。如下:

public connsql()
    {
        //sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
        //sConnStr = "jdbc:odbc:gsjmanager";

       //采用的是micrsoft 的驱动,其中由于ms sql server 中的一个实例占用一个通讯端口,
      //在缺省状态是1433表示缺省数据库实例,(看某个实例的端口在企业管理器的数据库属性察看)

        sDBDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
        sConnStr = "jdbc:microsoft:sqlserver://127.0.0.1:1205;DatabaseName=gsjmanager";  
        name = "sa";
        password = "mjt_0755";
        conn = null;
        rs = null;
        prepStmt = null;
        try
        {
            Class.forName(sDBDriver);
        }
        catch(Exception e)
        {
            System.err.println("conn():" + e.getMessage());
        }
    }

由于开始没有找到sql server 的驱动,在tomcat服务器后面提示:

老是提示suitable driver jdbc 错误。只要下载微软的jdbc驱动即可。

在win下
http://www.uncj.com/upload/files/ms_jdbc_setup.exe
http://download.microsoft.com/download/3/0/f/30ff65d3-a84b-4b8a-a570-27366b2271d8/setup.exe

至于如何安装jdbc去冬,网上大把资料,不用介绍了,直接把3个微软驱动丢在jdk的lib/ext目录

中可以了。

posted @ 2007-07-02 17:43 kenlistian 阅读(795) | 评论 (0)编辑 收藏

在lua中有几个关键点必须搞清楚,这个都是需要仔细去揣摩的。


一。堆栈调用

lua和其他语言交互是通过堆栈来操作,那么那些明明了了的调用就变成在堆栈上push和pop上做文章了。

比如你要取一个lua文件中的某个数值,不是一个等号就能得到,而是调用lua_getglobal()把lua中数值变量压入堆栈,然后通过lua_tostring或者lua_tonumber来获取它。如果这还可以理解的话,那么把lua文件中表的处理,则需要一系列的压栈和处理索引后才能获取。如果参数很多,还要注意索引值的正确与否。


二表之堆栈调用

看手册时,发现这点非常不易理解。而且手册的帮助也是看得人琢磨不透。以下说明

lua_settable  表赋值

void lua_settable (lua_State *L, int index);

等价 t[k] = v 操作,这里 t 理解为table,为index索引所对应的表v 为值, k 键名。

实际上就是对表操作,再说白些,就是在堆上处理某个表的修改。其完整的操作都是先需要

lua_pushxxx后,对某个表做t[k]=v操作。完事后,该函数弹出-2,-1处值


英文:

lua_settable

void lua_settable (lua_State *L, int index);

Does the equivalent to t[k] = v, where t is the value at the given valid index index, v is the value at the top of the stack, and k is the value just below the top.

This function pops both the key and the value from the stack. As in Lua, this function may trigger a metamethod for the "newindex" event

其实画个图,就是这个样

 索引号     表      堆栈           堆栈相对位置

 index ----> t ------->v(值)         -1

                       k (键名)      -2

该操作其实对  表t[k]=v


lua_gettable    取表值

void lua_gettable (lua_State *L, int index);

t[k] 值压入堆栈,通过lua_toxxxx取出该值。

index 指向某个表,而 k 则为某个表的键名。调用该函数时,需要先压入一个k,表(索引)键名。

调用该函数,其实就是在堆中把t[k]的值获取处理,完事后弹出k,而返回的表值在堆的顶部(-1处)。


拿个例子来讲最生动:
比如调用一个函数,其中函数是在lua中定义的表中的函数,即:

mytable = {
   Function1 = function (var ) return var.."world,my test" end
}
。。。
lua_pushstring(L, "mytable");           --压表名,将在全局栈中找该表
lua_gettable(L, LUA_GLOBALSINDEX);      --以表名查表在全局表中的位置,结果在堆顶
lua_pushstring(L, "Function1");         --压函数名,“Function1”在堆栈-1处,
                                         mytable的表索引在-2位置(不是字符串)
lua_gettable(L, -2);                    --在mytable表中查找function1的索引值(指针),
                                         该操作完后,栈顶为function1函数指针。


lua_pushstring("hello");                 --压参
lua_pcall(L, 1, 1, 0);                   --调用函数,返回一个参数。
lua_String msg = lua_tostring(L, -1);
lua_pop(L, 1);

垃圾收集

  这个概念是这样的:
   lua不需要用户干预内存的操作,只是通过垃圾收集器来自动管理内存。所有对象都被自动管理,有: table, userdata、 函数、线程、和字符串。
  其管理机制是:通过递增的标志来决定是否收集,用2个标记数字来控制垃圾收集周期:
garbage-collector pausegarbage-collector step multiplier

collector pause  按收集周期决定收集内存,当其数值越大,则收集周期也越长。
step multiplier   按相对内存分配的速度来收集。数值越大收集器则收集更快。

posted @ 2007-05-24 15:36 kenlistian 阅读(1309) | 评论 (0)编辑 收藏

工作需要,没办法要搞搞asp。net,看来要想专行干某个行业,还是得进大公司,专职专能。在小公司干,什么都要能来一来。这不,项目要求要ASP。NET,得了解这些方面粗枝大叶了。

*******************

下面全是转帖,作为参考。

asp 技巧一:

1.为按钮添加确认对话框

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

2.删除表格选定记录

//获得DataGrid主键
int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString();

3.删除表格记录警告

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;
 }
}

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

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 + "’);");
}

5.双击表格连接到另一页

在itemDataBound事件中

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 + "’");
}

6.双击表格打开新一页

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 + "’)");
}

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

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

8.表格点击改变颜色

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’;");
}

9.在表格行中移动鼠标时改变颜色

写在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=’’;");
}

10.关于日期格式

日期格式设定

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

我觉得应该在itembound事件中

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

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

不要使用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的产生从而丢失了错误信息,所以页面导向应该直接在服务器端执行,这样就可以在错误处理页面得到出错信息并进行相应的处理。

12.清空Cookie

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

13.自定义异常处理

//自定义异常处理类
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
}

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

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

15.回车转换成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"

16.DataGrid超级连接列

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

17.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"+"\"");
 }
}

18.模板列

<ASP:TEMPLATECOLUMN visible="False" sortexpression="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;
  }
 }
}

19.数字格式化

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

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

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

20.日期格式化

  【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);

21.怎样作到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版

22.读取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=" 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=" 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= "varretValue=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(’确认删除此项吗?’);");
  }
 }
}

30.DataGrid样式交替:

ListItemType itemType = e.Item.ItemType;

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

31.DataGrid添添加一个编号列:

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();   

32.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;
 }
}

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

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

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

在Application_Start中添加以下代码:

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

35.变量.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%

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

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

</SCRIPT> <body leftMargin="0" topMargin="0" onload=" 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");
}

 

http://blog.csdn.net/allenbuaa/archive/2005/10/26/517143.aspx

http://blog.csdn.net/dotnetgroup/archive/2005/11/28/538397.aspx

posted @ 2007-05-24 14:22 kenlistian 阅读(125) | 评论 (0)编辑 收藏

Lua中的元表( metatable)概念

元表 是一个(普通的)Lua 表,它将标准操作映射成自定义的函数。类似于操作符重定义。
元表的键值称为事件;值(换而言之就是函数)称为元方法

 setmetatable()getmetatable() 分别对对象的元表进行修改和查询。每个表和 userdada 对象都可以具有自己的元表。其他的则没有元表之一说。
引入元表的好处,其实就像是c++中的sturct,在定义了数据类型后,还可以附加一些对数据的操作。

在lua中某个表需要对其元表做相应的增添 add 方法;方法:

mt = {}
function String(string)
  --对{value = s or ''}增添mt元表
  return setmetatable({value = string or ''}, mt)
end

-- The first operand is a String table
-- The second operand is a string
-- .. is the Lua concatenate operator
function mt.__add(a, b)
  return String(a.value..b)
end

s = String('Hello')
print((s + ' There ' + ' World!').value )
result :

Hello There World!
函数 mt.__add() 是一个元方法,它将字符串 b 添加到在 a.value 中找到的字符串后面 b 次。这行代码 print((s + ' There ' + ' World!').value ) 调用这个元方法两次。

__index 是另外一个事件。__index 的元方法是当表中不存在键值时就会被调用。

那么下面的代码应该是看得懂的:

-- catch "undefined" global variables

local f=function (t,i)
  error("undefined global variable `"..i.."'",2)
end
setmetatable(getfenv(),{__index=f})

-- an example
a=1
c=3
print(a,b,c) -- `b' is undefined

posted @ 2007-04-25 12:18 kenlistian 阅读(1005) | 评论 (0)编辑 收藏

Lua脚本语法说明(增加lua5.1部份特性)

 在Lua中,一切都是变量,除了关键字。

I.  首先是注释
  写一个程序,总是少不了注释的。
  在Lua中,你可以使用单行注释和多行注释。
  单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。相当于C++语言中的"//"。
  多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。这种注释相当于C语言中的"/*...*/"。在注释当中,"[["和"]]"是可以嵌套的(在lua5.1中,中括号中间是可以加若干个"="号的,如 [==[ ... ]==]),见下面的字符串表示说明。

II.  Lua编程
  a。在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开。
  b。Lua 有好几种程序控制语句
控制语句 格式 示例
If if 条件 then ... elseif 条件 then ... else ... end

if 1+1=2 then print("true")
elseif 1+2~=3 then print("true")
else print("false") end

While while 条件 do ... end while 1+1~=2 do print("true") end
Repeat repeat ... until 条件 repeat print("Hello") until 1+1~=2
For for 变量=初值, 终点值, 步进 do ... end for i = 1, 10, 2 do print(i) end
For for 变量1, 变量2, ... 变量n in 表或枚举函数 do ... end for a,b in mylist do print(a, b) end

  注意一下,for的循环变量总是只作用于for的局部变量;当省略步进值时,for循环会使用1作为步进值。
  使用break可以用来中止一个循环。
  c。相对C语言来说,Lua有几个地方是明显不同的,所以面要特别注意一下:

  .语句块
    语句块在C中是用"{"和"}"括起来的,在Lua中,要用do 和 end 括起来的。如:
    do print("Hello") end
    可以在 函数 中和 语句块 中定局部变量。

  .赋值语句
    赋值语句在Lua被强化了。它可以同时给多个变量赋值。
    例如:
    a,b,c,d=1,2,3,4
    甚至是:
    a,b=b,a  -- 多么方便的交换变量功能啊。
    在默认情况下,变量认为是全局的。如需要定义局部变量,则需要用local说明。比如:
    local a,b,c = 1,2,3  -- a,b,c都是局部变量

  .数值运算
    和C语言一样,支持 +, -, *, /。但Lua还多了一个"^"。这表示指数乘方运算。比如2^3 结果为8, 2^4结果为16。
    连接两个字符串,可以用".."运处符。如:
    "This a " .. "string." -- 等于 "this a string"

  .比较运算
比较符号 < > <= >= == ~=
含义 小于 大于 小于或等于 大于或等于 相等 不相等

    对于Table,Function和Userdata类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。如:

    a={1,2}
    b
=a
    
print(a==b, a~=b)  --输出 true, false
    a={1,2}
    b
={1,2}
    
print(a==b, a~=b)  --输出 false, true



  .逻辑运算
    and, or, not
    and 和 or 与C语言区别特别大。
    请先记住,在Lua中,只有false和nil才计算为false,其它任何数据都计算为true,0也是true!
    and 和 or的运算结果不是true和false,而是和它的两个操作数相关。
    a and b:如果a为false,则返回a;否则返回b
    a or b:如果 a 为true,则返回a;否则返回b

    举几个例子:

     print(4 and 5--输出 5
     print(nil and 13--输出 nil
     print(false and 13--输出 false
     print(4 or 5--输出 4
     print(false or 5--输出 5


    在Lua中这是很有用的特性,也是比较令人混洧的特性。
    我们可以模拟C语言中的语句:x = a? b : c,在Lua中,可以写成:x = a and b or c。
    最有用的语句是: x = x or v,它相当于:if not x then x = v end 。

  .运算符优先级,从低到高顺序如下:

     or
     and
     <     >     <=    >=    ~=    ==
     .. (字符串连接)
     +     -
     *     /     %
     not   #(lua5.1 取长度运算)     - (一元运算)
     ^

和C语言一样,括号可以改变优先级。

III.  关键字
  关键字是不能做为变量的。Lua的关键字不多,就以下几个:
    

and break do else elseif
end false for function if
in local nil not or
repeat return then true until while


IV.  变量类型
  用type()函数检查一个变量类型。Lua支持的类型有以下几种:

Nil 空值,所有没有使用过的变量,都是nil。nil既是值,又是类型。
Boolean 布尔值,只有两个有效值:true和false
Number 数值,在Lua里,数值相当于C语言的double
String 字符串,字符串是可以包含"\0"字符的(这和C语言总是以"\0"结尾是不一样的)
Table 关系表类型,这个类型功能比较强大,请参考后面的内容。
Function 函数类型,函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。
Userdata 这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的,在这种情况下,Userdata可以是宿主的任意数据类型,常用的有Struct和指针。
Thread 线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。

V.  变量的定义
  在Lua中,不管在什么地方使用变量,都不需要声明,并且变量是全局变量,除非在前面加上"local"。
  至于变量名字,它是大小写相关的。即A和a是两个不同的变量。
  定义一个变量的方法就是赋值。"="操作就是用来赋值的。
       看下面:

  A.  Nil
    正如前面所说的,没有使用过的变量的值,都是Nil。有时候我们也需要将一个变量清除,这时候,我们可以直接给变量赋以nil值。如:

    var1=nil  -- 请注意 nil 一定要小写


  B.  Boolean
               布尔值有两种:true 和 false。在Lua中,只有false和nil才被计算为false,而所有任何其它类型的值,都是true。比如0,空串等等,都是true。不要被 C语言的习惯所误导,0在Lua中的的确确是true。你也可以直接给一个变量赋以Boolean类型的值,如:

    theBoolean = true


  C.  Number
    在Lua中,是没有整数类型的,也不需要。一般情况下,只要数值不是很大(比如不超过100,000,000,000,000),是不会产生舍入误差的。在WindowsXP能跑的当今主流PC上,实数的运算并不比整数慢。
    实数的表示方法,同C语言类似,如:
    4 0.4 4.57e-3 0.3e12 5e+20

  D.  String
    字符串,总是一种非常常用的高级类型。在Lua中,我们可以非常方便的定义很长很长的字符串。
    字符串在Lua中有几种方法来表示,最通用的方法,是用双引号或单引号来括起一个字符串的,如:
    "That's go!"
    或
    'Hello world!'

    和C语言相同的,它支持一些转义字符,列表如下:
    \a  bell
    \b  back space
    \f  form feed
    \n  newline
    \r  carriage return
    \t  horizontal tab
    \v  vertical tab
    \\  backslash
    \"  double quote
    \"  single quote
    \[  left square bracket
    \]  right square bracket

    由于这种字符串只能写在一行中,因此,不可避免的要用到转义字符。加入了转义字符的串,看起来实在是不敢恭维,比如:
    "one line\nnext line\n\"in quotes\", "in quotes""
    一大堆的"\"符号让人看起来很倒胃口。如果你与我有同感,那么,我们在Lua中,可以用另一种表示方法:用"[["和"]]"将多行的字符串括起来。(lua5.1: 中括号中间可以加入若干个"="号,如 [==[ ... ]==],详见下面示例
    示例:下面的语句所表示的是完全相同的字符串:

= 'alo\n123"'
= "alo\n123\""
= '\97lo\10\04923"'
= [[alo
123"
]]
= [==[
alo
123"
]==]

   如果含有单独使用的"[["或"]]"就仍然得用"\["或"\]"来避免歧义。当然,这种情况是极少会发生的。

  E.  Table
    关系表类型,可以把这个类型看作是一个数组。只是C语言的数组,只能用正整数来作索引;
                在Lua中,你可以用任意类型来作数组的索引,除了nil。同样,在C语言中,数组的内容只允许一种类型;在Lua中,你也可以用任意类型的值来作数组的内容,除了nil。
    Table的定义很简单,它的主要特征是用"{"和"}"来括起一系列数据元素的。比如:

    T1 = {}  -- 定义一个空表
    T1[1]=10  -- 然后我们就可以象C语言一样来使用它了。

 

    T1["John"]={Age=27, Gender="Male"}
    这一句相当于:
    T1
["John"]={}  -- 必须先定义成一个表,还记得未定义的变量是nil类型吗
    T1["John"]["Age"]=27
    T1
["John"]["Gender"]="Male"
    当表的索引是字符串的时候,我们可以简写成:
    T1.John
={}
    T1.John.Age
=27
    T1.John.Gender
="Male"
    或
    T1.John{Age
=27, Gender="Male"}

    在定义表的时候,可以把所有的数据内容一起写在"{"和"}"之间,比如,前面的T1的定义,我们可以这么写:

    T1=
    {
      
10,  -- 相当于 [1] = 10
      [100] = 40,
      John
=  -- 可写成:["John"] =
      {
        Age
=27,   -- 可写成:["Age"] =27
        Gender=Male   -- 还可写成:["Gender"] =Male
      },
      
20  -- 相当于 [2] = 20
    }


             需要注意三点:
    一,所有元素之间,总是用逗号","隔开;
    二,所有索引值都需要用"["和"]"括起来;如果是字符串,还可以去掉引号和中括号;
    三,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编;

   表类型的构造是如此的方便,以致于常常被人用来代替配置文件。不用怀疑,它比ini文件要漂亮,并且强大。

  F.  Function
    函数,在Lua中,函数的定义也很简单。典型的定义如下:

    function add(a,b)  -- add 是函数名字,a和b是参数名字
     return a+b  -- return 用来返回函数的运行结果
    end

        return语言一定要写在end之前。假如我们非要在中间放上一句return,那么就应该要写成:do return end。
    还记得前面说过,函数也是变量类型吗?上面的函数定义,其实相当于:

    add = function (a,b) return a+end

当重新给add赋值时,它就不再表示这个函数了。甚至可以赋给add任意数据,包括nil (这样,赋值为nil,将会把该变量清除)。Function是不是很象C语言的函数指针呢?
   和C语言一样,Lua的函数可以接受可变参数个数,它同样是用"..."来定义的,比如:

    function sum (a,b,)

如果想取得...所代表的参数,可以在函数中访问arg局部变量(表类型)得到 (lua5.1: 取消arg,并直接用"..."来代表可变参数了,本质还是arg)。
    如 sum(1,2,3,4)
    则,在函数中,a = 1, b = 2, arg = {3, 4}  (lua5.1:  a = 1, b = 2, ... = {3, 4})
    更可贵的是,它可以同时返回多个结果,比如:

    function s()
      
return 1,2,3,4
    
end
    a,b,c,d 
= s()  -- 此时,a = 1, b = 2, c = 3, d = 4


    前面说过,表类型可以拥有任意类型的值,包括函数!因此,有一个很强大的特性是,拥有函数的表,哦,我想更恰当的应该说是对象吧。Lua可以使用面向对象编程了。举例如下:

    t =
    {
     Age 
= 27
     
add = function(self, n) self.Age = self.Age+end
    }
    
print(t.Age)  -- 27
    t.add(t, 10)
    
print(t.Age)  -- 37


    不过,t.add(t,10) 这一句实在是有点土对吧?没关系,在Lua中,我们可以简写成:

    t:add(10)    -- 相当于 t.add(t,10)

 
1. Lua 官方网站: http://www.lua.org
2. Lua Wiki网站,你可以在这里找到很多相关的资料,如文档、教程、扩展,以及C/C++的包装等: http://lua-users.org/wiki/
                                 http://www.lua.org/pil/index.html

posted @ 2007-04-25 10:23 kenlistian 阅读(569) | 评论 (0)编辑 收藏

今天同事数据库无法恢复,了解原来是差异备份所致。

采用企业管理器去恢复数据库时,好像无法实现。

但是通过如下语句实现了差异还原。

restore database 数据库 from disk='c:\你的差异备份文件名' with norecovery

最后一个差异文件不用带参数,即可把将所有的加载差异加入。

posted @ 2007-04-11 10:52 kenlistian 阅读(96) | 评论 (0)编辑 收藏

如何在cbuilder中调试soap 的web server,特别是那些写到iis中的dll,就是以isapi,nsapi编写的服务程序。在http://dn.codegear.com/article/23024有说明。

下面简要的用中文描述一下。

1.打开run|parameters ,填入iis的执行文件:”c:\windows\system32\inetsrv\inetinfo.exe“,输入参数-e w3svc。图如下:

2.关闭iis中的管理网站,连同smtp,ftp全停掉,

  同时在iis中点开网站虚拟目录属性,把 程序保护 下拉栏中选择 “low”。

3.打开管理工具的服务,停掉服务列表中的iis 服务。

4.打开管理工具的”本地安全策略“,在”用户权利指派“中,选择以操作系统方式,添加当前用户名。如图:

  

5.修改iis在注册表中的服务项,添加注册表如下的内容:(粘贴出新建一个reg文件后双击处理)

注意:iis要在自己的系统文件夹下,如果不是windows则改成自己的机子一样路径。

regedit4

[hkey_classes_root\appid\{61738644-f196-11d0-9953-00c04fd919c1}]
"localservice"=-
"runas"=-
[hkey_classes_root\appid\{9f0bd3a0-ec01-11d0-a6a0-00a0c922e752}]
"localservice"=-
"runas"=-

[hkey_classes_root\appid\{a9e69610-b80d-11d0-b9b9-00a0c922e750}]
"localservice"=-
"runas"="interactive user"

[hkey_classes_root\clsid\{61738644-f196-11d0-9953-00c04fd919c1}]
"localservice"=-

[hkey_classes_root\clsid\{9f0bd3a0-ec01-11d0-a6a0-00a0c922e752}]
"localservice"=-

[hkey_classes_root\clsid\{a9e69610-b80d-11d0-b9b9-00a0c922e750}]
"localservice"=-

[hkey_classes_root\clsid\{61738644-f196-11d0-9953-00c04fd919c1}\localserver32]
""="c:\\windows\\system32\\inetsrv\\inetinfo.exe -e w3svc"

[hkey_classes_root\clsid\{9f0bd3a0-ec01-11d0-a6a0-00a0c922e752}\localserver32]
""="c:\\windows\\system32\\inetsrv\\inetinfo.exe -e w3svc"

[hkey_classes_root\clsid\{a9e69610-b80d-11d0-b9b9-00a0c922e750}\localserver32]
""="c:\\windows\\system32\\inetsrv\\inetinfo.exe -e w3svc"

[hkey_local_machine\system\currentcontrolset\services\iisadmin]
"start"=dword:3

[hkey_local_machine\system\currentcontrolset\services\msdtc]
"start"=dword:3

[hkey_local_machine\system\currentcontrolset\services\w3svc]
"start"=dword:3

[hkey_classes_root\appid\{61738644-f196-11d0-9953-00c04fd919c1}]
"localservice"="iisadmin"
"runas"=-

[hkey_classes_root\appid\{9f0bd3a0-ec01-11d0-a6a0-00a0c922e752}]
"localservice"="iisadmin"
"runas"=-

[hkey_classes_root\appid\{a9e69610-b80d-11d0-b9b9-00a0c922e750}]
"localservice"="iisadmin"
"runas"=-

[hkey_classes_root\clsid\{61738644-f196-11d0-9953-00c04fd919c1}]
"localservice"="iisadmin"

[hkey_classes_root\clsid\{9f0bd3a0-ec01-11d0-a6a0-00a0c922e752}]
"localservice"="iisadmin"

[hkey_classes_root\clsid\{a9e69610-b80d-11d0-b9b9-00a0c922e750}]
"localservice"="iisadmin"

6.编写soap web server并把该程序生成的路径放在iis中的虚拟目录中,在程序中

 设置断点,run!

7.到ie中输入http:\\127.0.0.1\test_websoap\xxx.dll,在ide中就被激活运行。

如图:

注意:

  在调试中有要发现程序已在运行的话,则打开任务管理器中杀掉dllhost.exe,

  关掉所有的dllhost。exe。如果还关不完(关了又出来了),则看看iis中是否启动了,把它再停掉。

 

 

 

 

 

 

 

 

 

posted @ 2007-04-06 16:31 kenlistian 阅读(1024) | 评论 (0)编辑 收藏

IntraBob——调试CGI/WinCGI/ISAPI程序的利器

IntraBob是资深程序员Dr.Bob编写的,用于测试Delphi/Cbuilder编写的CGI/WinCGI/ISAPI程序。调试本地的 CGI/WinCGI/ISAPI程序,其原理是模拟PWS/IIS接受WWW请求,并根据类似于“http: //www.123.com/testisapi.dll”的URL映射到本地文件,如“d:\intrabob\demo\TestISAPI.dll”。

IntraBob下载在 http://www2.drbob42.com/drbob42/intrabob.zip解压在“d:\intrabob\”,调试的ISAPI位于文件夹d:\intrabob\demo\”下。

一、先编写调用页

 要一个页面用于向ISAPI程序传递参数,用户输入姓名、性别、省份,用户提交后将这三个参数给http://www.123.com/testisapi.dll 用于显示。其HTML代码如下:

< HTML >
< HEAD >
< TITLE >IntraBob调试ISAPI< /TITLE >
< /HEAD >
< BODY >
< H2 >用IntraBob调试ISAPI< /H2 >
< HR >
< FORM ACTION=“http://www.123.com/
testisapi.dll" METHOD=“POST" >
< br >姓名:< INPUT TYPE=“text" NAME=“Name" 
SIZE=“40" value=‘王发军' >
< br >性别:< INPUT TYPE=
 “radio"NAME=“Sex"value= ‘男'
checked>男 < INPUTTYPE=“radio"NAME=“Sex" value=‘女' >女
< br >省份:< Select Name=Province >< Option >河南
< /Option >< Option >河北< /Option >< /Select >
< br >< INPUT TYPE=“SUBMIT" VALUE=“提交测试ISAPI" >
< INPUT TYPE=“RESET" VALUE=“重新填写" >
< /FORM >
< /BODY >
< /HTML >
粘贴以上页面建一html文件保存。(这里放在“D:\INTRABOB\demo\testisapi.htm”)
二、写ISAPI程序

  写一个ISAPI程序,接受姓名、性别、省份三个参数并将其显示出来。

 (1)建立Web Server Application工程文件
 
(2)在WebModule1中增加一个WebActionItem1,在其OnAction事件中写下如下代码:

procedure TWebModule1.WebModule1WebActionItem1Action
(Sender: TObject;Request: TWebRequest; Response: 
TWebResponse; var Handled: Boolean);
var
   Name,Sex,Province : string;
begin
   Name := Request.ContentFields.values[‘name'];
     Sex := Request.ContentFields.values[‘Sex'];
 Province := Request.ContentFields.values[‘Province'];
   Response.Content := ‘您的输入如下:';
  Response.Content :=   
  Response.Content+姓名:'+name;
  Response.Content :=   
  Response.Content+性别:'+sex;
  Response.Content :=   
  Response.Content+'省份:'+Province;
   Response.Content :=  Response.Content +'';
end;
(3)存到文件夹“d:\intrabob\demo\”下,工程文件为TestISAPI.dpr。 
(4)生成ISAPI的TestISAPI.DLL。

三、用IntraBob5.0调试

 1. 先在IDE中Run|Paramters中设置“D:\INTRABOB\Intrabob.exe”,如图:

 2.调试

  run后弹出IntraBob.exe的地址栏中输入testisapi.htm路径及名称,如图:

 3.设置IntraBob选项

    选择“Options”页,IntraBob已从testisapi.htm页面中提出URL http://www.123.com/testisapi.dll”在“Remote URL”栏,这里只需要将“Local App”栏指定为“d:\intrabob\demo\TestISAPI.dll”即可。
  

  返回到 “Browser”页,点击页面“提交测试ISAPI”按钮来提交已输入的数据。我们的IDE的代码窗口激活,程序就能进入设置的断点处。
  运行到结束,IntraBob将输出结果以“D:\INTRABOB\output.htm”的形式显示在“Browser”页中。这样 在本机上调试 CGI/WinCGI/ISAPI程序就不必用IIS了。

 

 

 

posted @ 2007-04-06 15:56 kenlistian 阅读(672) | 评论 (1)编辑 收藏

最直接了当的调试

在cbuilder中编写好服务程序后,按下列步骤:
1. 在命令行运行myServiceapp.exe /INSTALL,安装服务程序。
2. 选择Start | Settings | Control Panel | Administrative Tools | Services,将运行Services 小应用程序。找到MyService,然后单击Start Service 工具栏按钮。
3. 在ide中打开myServiceApp.dpr 工程。
5. 选择Run | Attach to Process 菜单项。
6. 在Attach to Process 对话框,选中Show System Processes 复选框。 
7. 找到myServiceApp.exe,然后单击Attach 按钮。
8. 在源文件的OnExecute 事件方法设置断点,然后按键F9。
  

如果权限不足,那么附加到服务进程可能会失败。当只要对PC 拥有管理员权限,附加到运行的服务进程总是工作正常。

posted @ 2007-04-03 16:05 kenlistian 阅读(1818) | 评论 (0)编辑 收藏

仅列出标题
共42页: First 34 35 36 37 38 39 40 41 42