在ASP.NET中使用NVARCHAR变量,而不声明其长度

本文关键字:声明 变量 NET ASP NVARCHAR | 更新日期: 2023-09-27 18:27:34

我有这个查询

SELECT COUNT(Email) FROM Blacklist WHERE (Email = @email OR (Email like '@%' AND @email like '%' + Email)) AND (CustomerId = @cid OR CustomerId = -1)

我想看看黑名单中的值是否以@开头,如果是,我还想检查参数,看看它是否以黑名单中值结尾。

(Email like '@%' AND @email like '%' + Email)

如果我像这样精确地声明表中的变量,这在SqlManager中是有效的。

declare @email as nvarchar(200) = 'firstname.lastname@xyz.com'
declare @cid as integer = 2
SELECT COUNT(Email) FROM Blacklist WHERE (Email = @email OR (Email like '@%' AND @email like '%' + Email)) AND CustomerId = @cid

黑名单中的值为"@xyz.com"

如果我从nvarchar(200)中移除(200)部件,它将停止工作。

所以我的问题是如何从.NET C#解决这个问题?

db.AddParameter("@email", SqlDbType.NVarChar, email);

在ASP.NET中使用NVARCHAR变量,而不声明其长度

你没有说"停止工作"是什么意思,会发生什么?你得到的结果是错误的还是错误的?为什么要从声明中删除长度?

如果您没有为nvarchar声明可变长度,那么默认情况下它是1,因此在这种情况下它的值为N'f';我猜你得到的是零,而不是你期望的任何数字?注意,nvarchar(200)不是"固定长度",它的意思是"最多200个字符";CCD_ 4确实是固定长度。

在任何情况下,都不清楚您的问题是什么:字符串长度只是TSQL中变量声明的一部分,也不清楚为什么您不能完全按照上面所示的操作。如果这是您的问题,您可以将变量声明为nvarchar(max),以避免处理特定的长度。

这是否对您有用可能取决于您如何连接到数据库(您提到了C#,但您使用的是ADO、LINQ还是其他什么?)。

EDIT:在C#中,如果您的问题中的db确实是SqlDatabase,那么您可能正在查找SqlDatabase.AddParameter方法的size参数。

问题是(我使用Fredrik),当从C#代码执行查询时,它返回0,即未列入黑名单。当从SQL管理工作室执行时,可以(必须)指定参数的长度,它返回1,即被列入黑名单。

我们的猜测是,该参数需要指定的大小(与数据库字段相同。然而,即使该参数被声明为nvarchar(100),它似乎也能在Management Studio中工作。

问题仍然存在,为什么从代码执行查询时返回0?

我遇到了和你一样的问题,经过多次尝试和错误/挖掘,我想我已经解决了。

我制作了一个SQL Fiddle来演示这个问题:http://sqlfiddle.com/#!3/c0a51/3

基本上,即使您可以将NVARCHAR设置为任何长度的字符串,它也只能节省定义的字符数。由于默认长度为1,LIKE语句中包含的唯一字符是第一个字符,在您的情况下,是电子邮件地址中的第一个字符。

这基本上是Marc_S所说的,但解释了为什么x="ab"只给了我们"a"。

更新

随着更多的挖掘,我发现如果你像我在Fiddle中那样写出SQL,会发生什么。但是,.NET会根据字符串的长度正确地推断NVARCHAR的长度,并适当地声明变量,因此它不会有这个问题:http://msdn.microsoft.com/en-us/library/hex23w80.因此,您在studio中的查询并不像您的应用程序那样运行。