a colleague recently asked me a question:
"i'm modifying the data type of a column. when doing so i get the following error:
ora-54033: column to be modified is used in a virtual column expression
but there's no virtual columns defined on the table! what on earth's going on?!"
this was exceptionally confusing. looking at the table definition we couldn't see any virtual columns defined:
create table tab (
x integer,
y date,
z varchar2(30)
);
sure enough, when we tried to change the data type of y we got the exception:
alter table tab modify (y timestamp);
ora-54033: column to be modified is used in a virtual column expression
how could this be?
perhaps there was a column defined that we couldn't see. querying user_tab_cols revealed something interesting:
select column_name, data_default, hidden_column from user_tab_cols where table_name = 'tab'; column_name data_default hid ------------------------------ ----------------------------- --- sys_stuypw88oe302tfvbnc6$mmqxesys_op_combined_hash("x","y")yes z no yno xno
the sys_... column isn't in the table ddl! where does it come from? and what's sys_op_combined_hash all about? has someone been mucking around with the database?
the sys_ prefix is a sign that the column is system generated. so something's happened that's caused oracle to create this on our behalf.
sys_op_combined_hash is an undocumented feature. the name implies oracle is merging the arguments together to form a hash.
is there a feature where we want to capture information about a group of columns?
indeed there is -extended statistics!this feature enables to oracle calculate statistics on a group of columns. it uses this information to improve row estimates. this is useful when there's a correlation between the values of two (or more) columns in a table.
someone had created extended stats on this table for (x, y).
now we've identified the problem, how do we get around it?
simple: drop and recreate the extended stats:
exec dbms_stats.drop_extended_stats(user, 'tab', '(x, y)'); alter table tab modify (y timestamp); select dbms_stats.create_extended_stats(user, 'tab', '(x, y)') from dual; dbms_stats.create_extended_stats(user,'tab','(x,y)') -------------------------------------------------------------------------------- sys_stuypw88oe302tfvbnc6$mmqxe
success!
extended stats are a great way to improve the optimizer's row estimates. if you need to create these, i recommend you also do the following:
方法一:
1 var data, json; 2 json = '[{"id":"年计划","text":"年计划","selected":true}]'; 3 data = $.parsejson(json); 4 $("#rwlb").combobox("loaddata", data);
方法二:
1 var data,json; 2 data = []; 3 data.push({ "text": "测试", "id": 100 }); 4 $("#rwlb").combobox("loaddata", data);
easyui tree一直就没有提供这个方法,以前没有用到,所以一直没怎么在意,这次自己用到了,顺便扩展了一个方法,分享给大家.
1 |
$.extend($.fn.tree.methods, { |
2 |
getlevel: function (jq,target){ |
3 |
var l = $(target).parentsuntil( "ul.tree" , "ul" ); |
4 |
return l.length 1; |
5 |
} |
6 |
}); |
1 |
var node = $().tree( "getselected" ); |
2 |
var lv = $().tree( "getlevel" ,node.target); |
十进制-->十六进制
select to_char(100,'xx') from dual;
十六进制-->十进制
select to_number('7d','xx') from dual;
参数默认值是指在调用函数时,若省略了某个实参,函数会自动为该参数分配一个默认值,使得函数调用的方便性和灵活性大大提高。
举个例子,比如中的字符串截取函数substr(string,start,length),当不指定length时,函数将默认截取字符串中start位置到字符串结束,而如果指定了length,则截取从start位置开始的以length为长度的字符串,所以如果调用的是substr('http://www.hualai.net.cn',11,6),则返回的是hualai;如果省略掉最后一个参数,substr('http://www.hualai.net.cn',11),则返回hualai.net.cn。
再比如jquery框架中,$(selector).html()方法是获取该元素内的html代码,而$(selector).html(content)则是设置该元素内的html。我们知道,在c语言中,我们可以通过如下形式来为函数参数设置默认值:
[cpp]
void foo(int a, int b = 1, bool c = false);
在中,则可以通过函数重载来设置函数参数默认值:
[java]
public void foo(int a){
foo(a, 1);
}
public void foo(int a, int b){
foo(a, b, false);
}
public void foo(int a, int b, bool c){
//函数内容
}
而在中,如何像jquery那样设置函数参数默认值呢?javascript中并没有像c语言中定义函数时直接在参数后面赋值的方法,也没有像java里那样的函数重载,但我们可以通过javascript方法中的一个arguments只读变量数组来实现,具体如下:
[js]
function foo(){
var a = arguments[0] ? arguments[0] : 1;
var b = arguments[1] ? arguments[1] : false;
//函数内容
}
以上是通过判断参数是否存在,若不存在则将默认值附给变量,而我们可以通过判断参数的类型来实现重载:
[js]
function foo(){
if(typeof arguments[0] == 'string')
alert('参数类型为字符串');
else if(typeof arguments[0] == 'number')
alert('参数类型为数值');
}
或者:
[js]
function foo(){
if(arguments[0].constructor == string)
alert('参数类型为字符串');
else if(arguments[0].constructor == number)
alert('参数类型为数值');
}
感觉这个cte递归查询蛮好用的,先举个例子:
上面的sql语句再次插入一条数据:
insert tree values('网络1班','网络工程')
运行结果如下图:
图1 运行结果
注意点:貌似在递归成员处所选择的字段都必须tree表的数据,而不能是cte结果集中的除了tree中没有而cte中有的字段在这里才可以引用,比如字段te。
首先看下,遍历的第1条记录的sql语句:
获取的结果为:
name parent te levle
-------------------------------------
大学 null 大学 0
递归第2次所获取的结果集合的类sql语句为:
上面的cte子查询的结果就是第一次递归查询的结果集,上面sql运行结果为:
同样的,将第二次递归查询的上面三条记录作为第三次查询的‘定位成员’:
【这里要注意,上面的三条记录是从最后一条开始依次作为第三次递归的输入的,即第一条是id=9的记录,接下来是7和2,关于第四次递归也类似】
第三次递归类sql语句
结果如下:
其实每次递归的类sql可为如下所示:
第四次递归一次类推,最后所查询的结果为上面所有递归的union。
续:在上面的sq语句查询结果中,id为10的记录应该要放在id为4的后面。
往数据表中再次添加两条记录:
insert tree values('计科','计算机学院')
insert tree values('我','网络1班')
再次修改上面的sql语句:
最后的结果为:
图2 运行结果
这样,无论用户插入多少条记录都可以进行按部门,按规律进行查询。
bll层
public void update(datatable dt)
{
foreach (datarow dr in dt.rows)
{
if (dr.rowstate == datarowstate.deleted)
continue;
if (dr.rowstate == datarowstate.modified || dr.rowstate == datarowstate.added)
{
if (dr["usr_id"] == dbnull.value)
{
throw new exception("用户代码不能为空");
} }
}
dal.update(dt);
}
dal层
public void update(datatable dt)
{
sqldataadapter adapter = new sqldataadapter();
sqlconnection conn = new sqlconnection(sqlhelper.connectionstring);
conn.open();
adapter.insertcommand = new sqlcommand("insert into dbo.t6( com_id ,usr_id ) values( @com_id ,@usr_id)", conn);
adapter.insertcommand.commandtype = commandtype.text;
adapter.insertcommand.parameters.add("@com_id", sqldbtype.varchar, 4, "com_id");
adapter.insertcommand.parameters.add("@usr_id", sqldbtype.varchar, 8, "usr_id");
adapter.updatecommand = new sqlcommand("update t6 setwhereand usr_id", conn);
adapter.updatecommand.commandtype = commandtype.text;
adapter.updatecommand.parameters.add("@com_id", sqldbtype.varchar, 4, "com_id");
adapter.updatecommand.parameters.add("@usr_id", sqldbtype.varchar, 8, "usr_id");
adapter.updatecommand.parameters.add("@usr_id1", sqldbtype.varchar, 8, "usr_id");
adapter.updatecommand.parameters["@usr_id1"].sourceversion = datarowversion.original;
adapter.deletecommand = new sqlcommand("delete from t6 whereand usr_id", conn);
adapter.deletecommand.commandtype = commandtype.text;
adapter.deletecommand.parameters.add("@com_id", sqldbtype.varchar, 4, "com_id");
adapter.deletecommand.parameters.add("@usr_id", sqldbtype.varchar, 8, "usr_id");
adapter.deletecommand.parameters["@com_id"].sourceversion = datarowversion.original;
adapter.deletecommand.parameters["@usr_id"].sourceversion = datarowversion.original;
adapter.update(dt);
}
前台
public partial class datatableupdate : form
{
public bll.users bu = new bll.users();
public datatable dtusr = new datatable();
public mod.users modobject = new mod.users();
public string _userid = "";
public datatableupdate()
{
initializecomponent();
datagridview1.autogeneratecolumns = false;
}
//窗口加载
private void form1_load(object sender, eventargs e)
{
dtusr = bu.getlist();
datagridview1.datasource = dtusr;
bindvalue();
}
private void bindvalue()
{
tb_com_id.databindings.add("text", datagridview1.datasource, "com_id");
tb_usrid.databindings.add("text", datagridview1.datasource, "usr_id");
//手动修改可以; 代码赋值需要用下面这句话
tb_usrid.databindings[0].datasourceupdatemode = datasourceupdatemode.onpropertychanged;
}
private void 保存_click(object sender, eventargs e)
{
foreach (datarow dr in dtusr.rows)
{
dr.endedit();
}
try
{
bu.update(dtusr);
}
catch (exception ex)
{
messagebox.show(ex.message);
return;
}
messagebox.show("保存成功!", "系统提示");
}
private void 删除_click(object sender, eventargs e)
{
if (messagebox.show("您确认要删除用户:" tb_usrname.text.trim() " ?", "提示", messageboxbuttons.yesno, messageboxicon.question, messageboxdefaultbutton.button2) == dialogresult.no)
return;
if (datagridview1.currentcell == null)
return;
try
{
datagridview1.rows.remove(datagridview1.currentrow);
bu.update(dtusr);
}
catch (exception ex)
{
messagebox.show(ex.message);
return;
}
messagebox.show("删除成功!", "系统提示");
}
private void 增加_click(object sender, eventargs e)
{
datarow dr = dtusr.newrow();
dr["usr_id"] = _userid;
dtusr.rows.add(dr);
datagridview1.currentcell = datagridview1.rows[datagridview1.rows.count - 1].cells[0];
}
private void 取消_click(object sender, eventargs e)
{
dtusr.rejectchanges();
}
牛铁:
本节内容
将数据添至表中:说明如何创建新行并将其添至表中。
在创建 datatable 并使用列和约束定义其结构之后,您可以将新的数据行添至表中。要添加新行,可将一个新变量声明为 datarow 类型。调用 newrow 方法时,将返回新的 datarow 对象。然后,datatable 会根据表的结构按 datacolumncollection 的定义创建 datarow 对象。
以下示例演示了如何通过调用 newrow 方法来创建新行。 datarow workrow = worktable.newrow(); 然后您可以使用索引或列名来操作新添加的行,如下例所示。 workrow["custlname"] = "smith"; 在将数据插入新行后,add 方法可用于将行添至 datarowcollection,如以下代码所示。 worktable.rows.add(workrow); 您也可以通过传入值的数组(类型化为 object),调用 add 方法来添加新行,如下例所示。 worktable.rows.add(new object[] {1, "smith"}); 将类型化为 object 的值的数组传递到 add 方法,可在表内创建新行并将其列值设置为对象数组中的值。请注意,数组中的值会根据它们在表中出现的顺序相继与各列匹配。 以下示例将十行添至新建的 customers 表中。 datarow workrow; |
查看表中数据:说明如何访问行中的数据,包括数据的原始版本和当前版本。
可以使用 datatable 的 rows 和 columns 集合来访问 datatable 中的内容。也可以根据包括搜索标准、排序顺序和行状态等特定标准,使用 datatable.select 方法返回 datatable 中数据的子集。此外,用主键值搜索特定行时,还可使用 datarowcollection 的 datatable 对象的 select 方法返回一组与指定条件匹配的 datarow 对象。select 采用筛选表达式、排序表达式和 dataviewrowstate 的可选参数。筛选表达式根据 datacolumn 值(例如 提示 如果您将对 datatable 的 select 方法执行多次调用,可通过先为 datatable 创建 dataview来提高性能。创建 dataview 会为表中的行编制索引。然后,select 方法会使用该索引,这样将显著缩短生成查询结果的时间。有关为 datatable 创建 dataview 的信息,请参阅。 select 方法基于 dataviewrowstate 确定要查看或操作的行的版本。下表说明了可能的 dataviewrowstate 枚举值。
在下面的示例中,dataset 对象已经过筛选,这样,您可以只使用其 dataviewrowstate 设置为 currentrows的行。 datarow[] currrows = worktable.select(null, null, dataviewrowstate.currentrows); select 方法可用于返回具有不同 rowstate 值或字段值的行。以下示例返回一个引用所有已删除行的 datarow数组,并返回另一个引用所有已排序行(按照 custlname 排序,其中 custid 列大于 5)的 datarow 数组。 // retrieve all deleted rows. |
编辑表中的数据:说明如何修改行中的数据,包括挂起对行的更改,直至验证并接受了建议的更改。
当您在 datarow 中更改列值时,所做更改会立即置于行的 current 状态中。然后,rowstate 会设置为modified,并使用 datarow 的 acceptchanges 或 rejectchanges 方法来接受或拒绝所做更改。datarow还提供了三种可用于在编辑行时将行的状态挂起的方法。这些方法是 beginedit、endedit 和 canceledit。
当您直接在 datarow 中修改列值时,datarow 会使用 current、default 和 original 行版本来管理列值。除这些行版本以外,beginedit、endedit 和 canceledit 方法还使用第四个行版本:proposed。 在执行编辑操作(通过调用 beginedit 开始,并且通过使用 endedit 或 canceledit 或者通过调用acceptchanges 或 rejectchanges 结束)的过程中,proposed 行版本会存在。 在编辑操作过程中,您可以通过计算 datatable 的 columnchanged 事件中的 proposedvalue 来将验证逻辑应用于各列。columnchanged 事件保存 datacolumnchangeeventargs,可保持对正在更改的列和proposedvalue 的引用。计算了建议值后,可以对其进行修改或取消编辑。编辑结束时,行从 proposed 状态中移出。 您可以通过调用 endedit 来确认编辑,也可以通过调用 canceledit 来取消编辑。请注意,尽管 endedit 确实已确认您所做的编辑,但在调用 acceptchanges 之前,dataset 并没有实际接受更改。另外请注意,如果在endedit 或 canceledit 编辑结束之前调用 acceptchanges,编辑将会终止,并接受 current 和 original 行版本的 proposed 行值。调用 rejectchanges 会以同样的方式结束编辑,并放弃 current 和 proposed 行版本。在调用 acceptchanges 或 rejectchanges 之后调用 endedit 或 canceledit 不会起作用,因为编辑已经结束。 以下示例演示了如何将 beginedit 与 endedit 和 canceledit 一起使用。本示例也会检查 columnchanged 事件中的 proposedvalue,并决定是否取消编辑。 datatable worktable = new datatable(); |
行状态与行版本:提供有关行的不同状态的信息。
ado.net 用行状态和版本管理表中的行。行状态表示行的状态。当修改行时,行版本会维护存储于行中的值,包括当前值、原始值和默认值。例如,修改了某行中的一列后,该行会有一个 modified 的行状态,并且会存在两个行版本:current(包含当前行值)和 original(包含修改该列前的行值)。
每个 datarow 对象都具有 rowstate 属性,您可以检查此属性来确定行的当前状态。下表给出了对各rowstate 枚举值的简要说明。
在 dataset、datatable 或 datarow 上调用 acceptchanges 时,会移除行状态为 deleted 的所有行。剩余的行会被赋予 unchanged 行状态,并且 original 行版本中的值会改写为 current 行版本值。调用rejectchanges 时,会移除行状态为 added 的所有行。剩余的行会被赋予 unchanged 的行状态,并且current 行版本中的值会改写为 original 行版本值。 通过用列引用来传递 datarowversion 参数,您可以查看行的不同行版本,如下例所示。 datarow custrow = custtable.rows[0]; 下表给出了各 datarowversion 枚举值的简要说明。
通过调用 hasversion 方法并将 datarowversion 作为参数传递,您可以测试 datarow 是否具有特定的行版本。例如,在调用 acceptchanges 之前, 例如,以下代码示例显示了表中所有已删除行的值。已删除的行没有 current 行版本,因此在访问列值时必须传递 datarowversion.original。 datatable cattable = catds.tables["categories"]; |
从表中删除行:说明如何从表中移除行。
用于从 datatable 对象中删除 datarow 对象的方法有两种:datarowcollection 对象的 remove 方法和datarow 对象的 delete 方法。remove 方法从 datarowcollection 中删除 datarow,而 delete 方法只将行标记为删除。当应用程序调用 acceptchanges 方法时,才会发生实际的删除。通过使用 delete,您可以在实际删除之前先以编程方式检查哪些行标记为删除。如果将行标记为删除,其 rowstate 属性会设置为 deleted。
在将 dataset 或 datatable 与 dataadapter 和关系型数据源一起使用时,用 datarow 的 delete 方法移除行。delete 方法只是在 dataset 或 datatable 中将行标记为 deleted,而不会移除它。而 dataadapter 在遇到标记为 deleted 的行时,会执行其 deletecommand 以在数据源中删除该行。然后,就可以用acceptchanges 方法永久移除该行。如果使用 remove 删除该行,则该行将从表中完全移除,但dataadapter 不会在数据源中删除该行。 datarowcollection 的 remove 方法采用 datarow 作为参数,并将其从集合中移除,如下例所示。 worktable.rows.remove(workrow); 作为对比,以下示例演示了如何调用 datarow 上的 delete 方法来将其 rowstate 改为 deleted。 workrow.delete(); 如果将行标记为删除,并且调用 datatable 对象的 acceptchanges 方法,该行就会从 datatable 中移除。相比之下,如果调用 rejectchanges,行的 rowstate 就会恢复到被标记为 deleted 之前的状态。 注意 如果 datarow 的 rowstate 是 added,则意味着已将其添至表中,然后将其标记为deleted,从表中移除。 |
添加和读取行错误信息:说明如何按行插入错误信息,以用于解决有关应用程序内行中数据的问题。
为了避免在编辑 datatable 中的值时每次发生行错误都必须响应,可将错误信息添至行中,以便以后使用。datarow 对象通过对各行提供 rowerror 属性来支持此功能。将数据添至 datarow 的 rowerror 属性会将datarow 的 haserrors 属性标记为 true。如果 datarow 是 datatable 的组成部分,且 datarow.haserrors是 true,则 datatable.haserrors 属性也是 true。这也适用于 datatable 所属的 dataset。为错误做测试时,可以检查 haserrors 属性以确定错误信息是否已添至所有行。如果 haserrors 为 true,则可使用 datatable 的geterrors 方法以便只返回和检查有错误的行,如下例所示。
datatable worktable = new datatable("customers"); |
接受或拒绝对行的更改:说明如何接受或拒绝对行的更改。
在检验过对 datatable 中的数据所做更改的准确性之后,可使用 datarow、datatable 或 dataset 的acceptchanges 方法来接受更改,此方法会将 current 行值设置为 original 值,并会将 rowstate 属性设置为 unchanged。接受或拒绝更改会清除所有 rowerror 信息,并将 haserrors 属性设置为 false。接受或拒绝更改还可以影响在数据源中更新数据。有关更多信息,请参阅。
如果 datatable 上存在外键约束,使用 acceptchanges 和 rejectchanges 接受或拒绝的更改就会根据foreignkeyconstraint.acceptrejectrule 传播至 datarow 的子行。 以下示例检查有错误的行,在适用之处解决错误,拒绝无法解决错误的行。请注意,对于解决的错误,rowerror值会重置为空字符串,导致将 haserrors 属性设置为 false。当解决或拒绝了所有的有错误的行时,就会调用acceptchanges 来接受对整个 datatable 的所有更改。 if (worktable.haserrors) |
处理 datatable 事件:提供可用于 datatable 的事件的相关信息,包括修改列值和添加或删除行时的事件。
datatable 对象提供一系列可由应用程序处理的事件。下表说明了 datatable 事件。
以下示例创建 4 个事件:oncolumnchanged、oncolumnchanging、onrowchanged 和onrowchanging。这些事件中的每一个都在列或行更改时发生。 worktable.columnchanged = new datacolumnchangeeventhandler(oncolumnchanged); |
@sql=select coalesce(max(columnname),0) 10 as defaultvalue from tablename where xxparentcolumn=@xxparentcolumn@
the where part of this clause needs to be replaced with the required values. the code that should appear here is the name of the column which links with the id of the parent one. for example, each record of the c_invoiceline belongs to a particular c_invoice record and they are all sequenced. c_invoice is the parent table for the lines saved in c_invoiceline. this table has a column named line and the default value that it takes is:
@sql=select coalesce(max(line),0) 10 as defaultvalue from c_invoiceline where c_invoice_id=@c_invoice_id@
these changes can be done in two different locations:
the first option can be chosen if the original module author wants to add more columns to his/her module. the second option is possible for anyone as the columns are added by a new module to the existing one which is not changed directly.
the main difference between these two methods is the names which need to be chosen for the columns to comply with the modularity naming rules.
in the application dictionary || message window create a new record using the following details:
// create the object through the factory final category bpg = obprovider.getinstance().get(category.class);
hibernate will detect that a business object is new when:
so if you want to create a new business object with a specific id (by calling setid(...)) then you explicitly need to call businessobject.setnewobobject(true). otherwise, hibernate will throw an exception ('count of batch update operation....').
一是linux服务器端的tftp-server支持,
二是嵌入式目标系统的tftp-client支持.
因为u-boot本身内置支持tftp-client,所以嵌入式目标系统端就不用配置了.
下面就详细介绍一下linux服务器端tftp server配置.在redhat 9.0的第三张光盘中,有tftp-server的安装rpm包.(1) 安装
#mount –t iso9660 /dev/hdc /mnt/cdrom //挂载光盘
#rpm -ivh tftp-server-0.32-4.i386.rpm //安装
#umount /mnt/cdrom //卸载光盘
(2)修改文件在linux下,不管使用的是哪一种super-server,inetd或者xinetd,默认情况下tftp服务是禁用的,所以要修改文件来开启服务.
根据(1)的安装方法,可以修改文件/etc/xinetd.d/tftp.主要是设置tftp服务器的根目录,开启服务.
修改后的文件如下:
service tftp {
socket_type =dgram
protocol =udp
wait =yes
user =root
server =/usr/sbin/in.tftpd
server_args =-s /home/app -c
disable =no
per_source =11
cps =100 2
flags =ipv4
}
说明:修改项server_args= -s
(3)创建tftp根目录,关闭防火墙,启动tftp-server.
#mkdir /home/app
#chmod o w /home/app
#/etc/init.d/iptables stop //关闭防火墙
#service xinetd restart //重启 xinetd 服务
重启xinetd服务,因为tftp服务受控与xinetd, xinetd是管服务的服务,它是不开端口的.
验证一下tftp是否起来了:
# netstat -nlp
active internet connections (only servers)
proto recv-q send-q local address foreign address state pid/program name
tcp 0 0 0.0.0.0:32768 0.0.0.0:* listen 3122/rpc.statd
tcp 0 0 127.0.0.1:32781 0.0.0.0:* listen 4035/xinetd
tcp 0 0 0.0.0.0:111 0.0.0.0:* listen 3103/portmap
tcp 0 0 0.0.0.0:80 0.0.0.0:* listen 3324/httpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* listen 3255/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* listen 3213/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* listen 3295/sendmail: acce
tcp 0 0 127.0.0.1:6010 0.0.0.0:* listen 3415/0
tcp 0 0 0.0.0.0:443 0.0.0.0:* listen 3324/httpd
udp 0 0 0.0.0.0:32768 0.0.0.0:* 3122/rpc.statd
udp 0 0 0.0.0.0:69 0.0.0.0:* 4035/xinetd ;
可以看到69端口已经打开
udp 0 0 0.0.0.0:69 0.0.0.0:* 4012/in.tftpd
udp 0 0 0.0.0.0:111 0.0.0.0:* 3103/portmap
udp 0 0 0.0.0.0:754 0.0.0.0:* 3122/rpc.statd
udp 0 0 0.0.0.0:631 0.0.0.0:* 3213/cupsd
这样,tftp server配置的启动步骤就完成了。
你可以登陆本机测试以下,命令如下:
#tftp your-ip-address
tftp>get
tftp>put
tftp>q
原因 :工程只支持unicode字符
解决方法:
工程属性->配置属性–>常规—>字符集—->使用多字节符字符集
四 、几点要记住:
1 使用#using引用c# dll,而不是#include.我就是想当然的使用了后者,所以浪费了一上午的时间;
2 别忘了using namespace cslib;
3 使用c /clr语法,采用正确的访问托管对象,即:使用帽子‘^’,而不是星星‘*’。
ps:附上自己成功运行c 代码
#include "stdafx.h"
#include
//#using "..\..\sfcsdll.dll" //右击项目-->引用...,添加新引用,将dll添加到项目中,可以不用此行代码
using namespace std;
using namespace sfcsdll;
int _tmain(int argc, _tchar* argv[])
{
class1 ^c = gcnew class1();
c->sfcsdll_create_connection("127.0.0.1", 0, 0, 0, 0);
c->sfcsdll_get_dllversion();
c->sfcsdll_close_connection();
cout<<"end...";
system("pause");
return 0;
}
网上最常见的做法是用datagridview的rowpostpaint事件在rowheadercell中绘制行号:
privatevoiddatagridview1_rowpostpaint(objectsender, datagridviewrowpostpainteventargs e)
{
try
{
e.graphics.drawstring((e.rowindex 1).tostring(), e.inheritedrowstyle.font, new solidbrush(color.cadetblue), e.rowbounds.location.x 15, e.rowbounds.location.y 5);
}
catch(exception ex)
{
messagebox.show("添加行号时发生错误,错误信息:"ex.message, "操作失败");
}
}
但是这种方法在大数据量的时候性能比较差,每次滚动数据都会触发rowpostpaint事件。
在vs2008里,也可以像eclipse那样自动生成get 、set方法。
下面是两个具体操作的方法:
1、在编写的字段上单击右键----->重构------->封装字段
2、在空白行处,输入“prop”再按tab键
microsoft sql server 2000 - 8.00.2039 (intel x86)
may 3 2005 23:18:38
凯发天生赢家一触即发官网 copyright (c) 1988-2003 microsoft corporation
personal edition on windows nt 5.1 (build 2600: service pack 2)