解决 选择位置

PDS8475

活跃成员
已加入
2019年6月25日
留言内容
41
编程经验
Beginner
你好

我有以下选择语句
Cmd.CommandText = "Select EquipmentMake, EquipmentModel, EquipmentSerial FROM Repairs WHERE CustomerName like @Name";
但这仅在输入值@Name的方式与在数据库中输入方式完全相同时才能找到结果。我如何更改它,以便用户输入paul或Paul并会得到相同的结果?
我敢肯定,这将在之前得到解答,但是我只能找到有关%和_的使用的信息,这意味着具有特定最小长度的特定字符。

提前致谢
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
首先,您是否在参数值中包含一个或多个通配符?如果没有,为什么要使用 喜欢 instead of =?

至于问题,您正在使用哪个数据库?在执行此类比较时,我不知道默认情况下区分大小写的数据库。虽然我对每个数据库都没有丰富的经验。可能是 喜欢 的行为也与=不同。
 

PDS8475

活跃成员
已加入
2019年6月25日
留言内容
41
编程经验
Beginner
嗨,参数中没有通配符,我使用的是LIKE而不是=
我正在使用Microsoft Access数据库。
就像您说的那样,我不希望它区分大小写,并且当我使用=发现它区分大小写时,我改用LIKE认为可以解决。可能是因为数据库中的CustomerName值是使用AES 256位加密的。因此,输入“ Paul”会为“ paul”提供不同的加密字符串。我没有考虑过,也许我需要更改它以标准化输入,所以如果输入“ paul”,它将自动更改为“ Paul”。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
尝试使用 Cmd.CommandText = "Select EquipmentMake, EquipmentModel, EquipmentSerial FROM Repairs WHERE CustomerName like @l_name*@u_Name";
Each parameter will need to be set separate, one with capital letter, one without. The * suggests looking for either. I am no fan of Access DB, so I am unaware of any other way to do what you want. It's easier to do in modern professional DB such as MySQL DB's etc.
 

PDS8475

活跃成员
已加入
2019年6月25日
留言内容
41
编程经验
Beginner
我用线 string n = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Detail_textBox.Text);
并传递n作为参数。那行得通,但我必须在所有表格上都做。
谢谢您的帮助。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,537
地点
弗吉尼亚州切萨皮克
编程经验
10+
我讨厌SQL,并且不经常使用它,因此请注意以下事项。当我过去经常使用SQL并且想进行不区分大小写的匹配时,我会强制使用大写或小写形式。因此,SQL将类似于:
SQL:
"Select EquipmentMake, EquipmentModel, EquipmentSerial FROM Repairs WHERE UPPER(CustomerName) = @Name";
然后将参数准备如下:
C#:
cmd.Parameter.AddWithValue("@Name", Detarl_textBox.Text.ToUpper());

暂时来说,我认为Access的SQL不接受"@name"参数。我以为只有 公认"?" parameters 并且您需要按使用顺序添加参数。这是因为您通常会使用OLEDB或ODBC连接来连接到MS Access数据库。

另外,请注意土耳其语I问题...
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
您可以同时使用跳伞运动员,请参阅: 在MS Access / OleDb中使用参数-VB.NET片段|梦想中的代码

While it is VB.NET, the principle is the same regardless if for C#. So in the case of : Cmd.CommandText = "Select EquipmentMake, EquipmentModel, EquipmentSerial FROM Repairs WHERE CustomerName like ?*?"; which should be the same as :
Try use Cmd.CommandText = "Select EquipmentMake, EquipmentModel, EquipmentSerial FROM Repairs WHERE CustomerName like @l_name*@u_Name";
唯一的区别是,需要按使用顺序调用参数。 ;)

语法应该按原样工作。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,537
地点
弗吉尼亚州切萨皮克
编程经验
10+
好发现!显然,MS提供的文档不正确。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
这通常就是为什么人们需要比编写文档的人更聪明的原因。 :/

In theory, you are also correct, since the documentation does state that the correct way; is to use nameless parameters ? and not named parameters @myParam. The difference being that both will work, but the correct preference is actually to use nameless parameters in ADO.Net, which such parameters should be executed in the order they are written in the statement. To further point out, that is irrelevant and unnecessary when using named parameters. :)
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,051
地点
挪威
编程经验
10+
如果您正在编写修改现有参数值的代码,则为该参数分配名称可以使您以后在集合中按其名称查找该名称。对于OleDbParameterCollection也是如此。据我了解,该名称未在查询中使用,仅在其位置使用。
 
最佳 底部