.Net3.5 和4.0竟如此区别?
clsConst.POINT_DATA_TABLE为一个DataTable,包含编号为1和①的记录各一条,如下代码s="①";
string strSql = " 编号='" + s + "'";
DataRow[] drs = clsConst.POINT_DATA_TABLE.Select(strSql);
在.Net3.5下编译drs 包含一条记录,结果正确;
在.Net4.0下编译drs 包含2条记录(1、①的全查出来了),不正确!!
Why? --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 试了一下还真是这样的 --------------------编程问答-------------------- 这个问题大家是怎么解决的? --------------------编程问答-------------------- --------------------编程问答--------------------
--------------------编程问答-------------------- 这样保存呢
public DataTable DataSource1()
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", Type.GetType("System.Int32"));
dt.Columns.Add("Name", Type.GetType("System.String"));
DataRow dr = dt.NewRow();
dr["ID"] = 1;
dr["Name"] = Server.UrlEncode("1");
dt.Rows.Add(dr);
DataRow dr1 = dt.NewRow();
dr1["ID"] = 2;
dr1["Name"] = Server.UrlEncode("①");
dt.Rows.Add(dr1);
return dt;
}
这样1还是1,①就变成 %e2%91%a0 了
读的时候 Server.UrlDecode("%e2%91%a0")
--------------------编程问答-------------------- 会不会跟区域语言有关系?.net3.5跟4.0都打了简体中文语言包了吗? --------------------编程问答-------------------- 另外可以查看生成IL代码,有什么区别。 --------------------编程问答-------------------- 也表示不理解,通过区分大小写的设置居然又正确了,求真相
--------------------编程问答-------------------- 。。一试不知道,试了还真是这样的 --------------------编程问答-------------------- 是不是那个值转换的问题? --------------------编程问答-------------------- 还是用2.0比较保险。。。 --------------------编程问答-------------------- 4.0还这么贱,微软自己给自己挖坑 --------------------编程问答-------------------- 微软那是在做模糊批判上下了大功夫,例如Google搜索等,一般我们搜索都喜欢可以找到更多的信息出来,不区分大小写,不区分全角半角,不区分简体繁体,这里就使用了这种技术,而这种技术却不符合你需要精确匹配的要求,那么你就必须有取舍,换其他方式来过滤,比如DataView的RowFilter属性。 --------------------编程问答--------------------
dt.CaseSensitive = true;
++1
通过设置区分大小写来判断吧 --------------------编程问答--------------------
DECLARE @A TABLE(ID VARCHAR(10) COLLATE Chinese_PRC_CI_AI)
INSERT @A SELECT '1' UNION ALL SELECT '①'
SELECT * FROM @A WHERE ID='1'
DECLARE @B TABLE(ID VARCHAR(10) COLLATE Chinese_PRC_CI_AS)
INSERT @B SELECT '1' UNION ALL SELECT '①'
SELECT * FROM @B WHERE ID='1'
/*
(所影响的行数为 2 行)
ID
----------
1
①
(所影响的行数为 2 行)
(所影响的行数为 2 行)
ID
----------
1
(所影响的行数为 1 行)
你可以指定你的排序规则是区分重音.就不会了 --------------------编程问答--------------------
DECLARE @A TABLE(ID VARCHAR(10))
INSERT @A SELECT '1' UNION ALL SELECT '①'
SELECT * FROM @A WHERE ID='1' COLLATE Chinese_PRC_CI_AS
SELECT * FROM @A WHERE ID='1' COLLATE Chinese_PRC_CI_AI
/*
(所影响的行数为 2 行)
ID
----------
1
(所影响的行数为 1 行)
ID
----------
1
①
(所影响的行数为 2 行)
类似这样的写法. --------------------编程问答-------------------- --------------------编程问答-------------------- 多了就不好办了。 --------------------编程问答-------------------- 哈哈,.NET还是这么蛋疼。
--------------------编程问答-------------------- 除 --------------------编程问答--------------------
--------------------编程问答--------------------
主要使用4.0吧。这个问题应当不是问题。 --------------------编程问答-------------------- 遇到如此蛋疼的问题,不试不知道,一试就出真理啊。 --------------------编程问答-------------------- 2.0的好用! --------------------编程问答-------------------- ①都能找出来,4.0噶强大 --------------------编程问答-------------------- 顶一个,这是.net的问题 --------------------编程问答-------------------- 竟然还真有这样在内存中直接过滤数据的!不会写select语句吗? --------------------编程问答--------------------
知道就好了!如果微软之前说过①不应该算是1的同义词,那么.net4.0是有bug。否则,可能是我们了解的太少,以前不知道而已。
补充:.NET技术 , C#