开发中的技术问题 一
记录下开发中遇到的一些问题或细节,至于其原理,有时间再慢慢加。
1 c#中对象作函数参数
c#中对象作函数参数时,是作为引用传递的,但和使用ref关键字又不完全一样。示例代码如下
2 UpdatePanel 中FileUpload控件的应用
错误:将FileUpload控件放在UpdatePanel中,则会在服务器端出现“未将对象引用到实例”或“得不到上传文件”的问题。
解决:此时,需要使用触发器,把触发回送的控件放在<Triggers>内即可。
原理:
3 JavaScript中内嵌服务器代码的问题
错误:执行时抛出错误“控件包含代码块(即 <% ... %>),因此无法修改控件集合”。
原因:在page中使用了主题Theme,而主题要求header需要有runat="server"属性,而此时的脚本中不能包含<%# %>
解决:将javascript放在body内部。
原理:
4 数据源控件SqlDataSource在更新DateTime数据时出错。
错误:使用的 SQL Server 版本不支持数据类型“date”
原因:找到UpdateParamters字节段,会发现类型为DateTime的参数使用DbType属性,而不是通常用的Type,且DbType属性值为“Date”。这是出现不支持数据类型date的原因;
<UpdateParameters>
<asp:Parameter Name="dQueryDate" DbType="Date" />
<asp:Parameter Name="vCreator" Type="String" />
<asp:Parameter Name="vMethod" Type="String" />
<asp:Parameter Name="vScope" Type="String" />
<asp:Parameter Name="vContent" Type="String" />
<asp:Parameter Name="nID" Type="Int32" />
</UpdateParameters>
解决:将“Date”换成“DateTime”即可
5 SqlServer数据库的表和.net的TableAdapter同步问题
根据向导创建TableAdapter类型化的DataSet,使用时碰到几个错误
错误:删除datatable表中的行数据后,adapter.Update(datatable)进行更新数据库时,抛出异常:“当传递具有已删除行的 DataRow 集合时,更新要求有效的 DeleteCommand”
原因:自动生成的TableAdapter没有DeleteCommand语句。在创建TableAdapter时,虽然在"Advanced Options"选项卡中选择了"create insert,update and delete statements",但是并没有生成Delete和Insert语句,其原因是sqlserver的数据表没有主键。
解决:在sqlserver中为表设置主键,并在.net中重新配置TableAdapter
注意事项:在sqlserver中修改数据表后,在.net中必须重新配置TableAdapter才能使用新配置
1 c#中对象作函数参数
c#中对象作函数参数时,是作为引用传递的,但和使用ref关键字又不完全一样。示例代码如下
public class Roster
{
private string _name;
public string Name
{
get { return this._name; }
set { this._name = value; }
}
}
public class Default
{
public void MainFun()
{
Roster roster = new Roster();
roster.Name = "张三";
ChangeName3(roster);
name = roster.Name;
//name="张三"
ChangeName1(ref roster);
name = roster.Name;
//name = "李四"
ChangeName2(roster);
name = roster.Name;
//name=王二
}
private void ChangeName1(ref Roster roster)
{
roster = new Roster();
roster.Name = "李四";
}
private void ChangeName3(Roster roster)
{
roster = new Roster();
roster.Name = "李四";
}
private void ChangeName2(Roster roster)
{
roster.Name = "王二";
}
}
{
private string _name;
public string Name
{
get { return this._name; }
set { this._name = value; }
}
}
public class Default
{
public void MainFun()
{
Roster roster = new Roster();
roster.Name = "张三";
ChangeName3(roster);
name = roster.Name;
//name="张三"
ChangeName1(ref roster);
name = roster.Name;
//name = "李四"
ChangeName2(roster);
name = roster.Name;
//name=王二
}
private void ChangeName1(ref Roster roster)
{
roster = new Roster();
roster.Name = "李四";
}
private void ChangeName3(Roster roster)
{
roster = new Roster();
roster.Name = "李四";
}
private void ChangeName2(Roster roster)
{
roster.Name = "王二";
}
}
2 UpdatePanel 中FileUpload控件的应用
错误:将FileUpload控件放在UpdatePanel中,则会在服务器端出现“未将对象引用到实例”或“得不到上传文件”的问题。
解决:此时,需要使用触发器,把触发回送的控件放在<Triggers>内即可。
原理:
3 JavaScript中内嵌服务器代码的问题
<%@ Page Language="C#" AutoEventWireup="true" Theme="Default" CodeFile="Left.aspx.cs" Inherits="Strategy_Left" %>
<head runat = server>
<script language=javascript>
function query()
{
<%= ClientScript.GetCallbackEventReference(this, "", "GetResultFromServer", "")%>
}
</script>
</head>
<body>
<input id="querybtn" type=button value="查询" class="submit" onclick="query()"/>
</body>
<head runat = server>
<script language=javascript>
function query()
{
<%= ClientScript.GetCallbackEventReference(this, "", "GetResultFromServer", "")%>
}
</script>
</head>
<body>
<input id="querybtn" type=button value="查询" class="submit" onclick="query()"/>
</body>
错误:执行时抛出错误“控件包含代码块(即 <% ... %>),因此无法修改控件集合”。
原因:在page中使用了主题Theme,而主题要求header需要有runat="server"属性,而此时的脚本中不能包含<%# %>
解决:将javascript放在body内部。
原理:
4 数据源控件SqlDataSource在更新DateTime数据时出错。
错误:使用的 SQL Server 版本不支持数据类型“date”
原因:找到UpdateParamters字节段,会发现类型为DateTime的参数使用DbType属性,而不是通常用的Type,且DbType属性值为“Date”。这是出现不支持数据类型date的原因;
<UpdateParameters>
<asp:Parameter Name="dQueryDate" DbType="Date" />
<asp:Parameter Name="vCreator" Type="String" />
<asp:Parameter Name="vMethod" Type="String" />
<asp:Parameter Name="vScope" Type="String" />
<asp:Parameter Name="vContent" Type="String" />
<asp:Parameter Name="nID" Type="Int32" />
</UpdateParameters>
解决:将“Date”换成“DateTime”即可
5 SqlServer数据库的表和.net的TableAdapter同步问题
根据向导创建TableAdapter类型化的DataSet,使用时碰到几个错误
错误:删除datatable表中的行数据后,adapter.Update(datatable)进行更新数据库时,抛出异常:“当传递具有已删除行的 DataRow 集合时,更新要求有效的 DeleteCommand”
原因:自动生成的TableAdapter没有DeleteCommand语句。在创建TableAdapter时,虽然在"Advanced Options"选项卡中选择了"create insert,update and delete statements",但是并没有生成Delete和Insert语句,其原因是sqlserver的数据表没有主键。
解决:在sqlserver中为表设置主键,并在.net中重新配置TableAdapter
注意事项:在sqlserver中修改数据表后,在.net中必须重新配置TableAdapter才能使用新配置