c# - 查询可以不带参数,但不能带参数

标签 c# sql-server

这是迄今为止我在使用 MSSQL 时遇到的最奇怪的事情。

我有一个名为 User 的表,其中有一行的用户名字段中有“admin”,当我运行以下查询时,它不会给我任何结果:

DECLARE @uname varchar;

SET @uname = 'admin'

SELECT * FROM [User] WHERE UserName = @uname

但是当我运行这个时,我得到了预期的结果:

SELECT * FROM [User] WHERE UserName = 'admin'

这是表定义:

CREATE TABLE [dbo].[User](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](256) NOT NULL,
    [FirstName] [nvarchar](256) NULL,
    [LastName] [nvarchar](256) NULL,
    [Email] [nvarchar](512) NULL,
    [Password] [binary](64) NULL,
    [GroupID] [int] NOT NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ__Users__C9F284563A4F773F] UNIQUE NONCLUSTERED 
(
    [UserName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我在 C# 应用程序中访问此数据库,因此当我在 SqlParameter 中传递用户名时,它根本没有给我任何结果。

这是一个示例 C# 代码:

string query = "SELECT COUNT(*) FROM [User] WHERE UserName = @uname";

using (var connection = new SqlConnection(ConnectionString))
{
    connection.Open();
    using (var cmd = new SqlCommand(query, connection))
    {
        cmd.Parameters.Add(new SqlParameter("uname", "admin"));

        int rowCount = (int)cmd.ExecuteScalar();
    }
}

我没有异常(exception)。

有什么想法吗?

最佳答案

当您定义字符串变量时,您没有指定大小,因此它的长度默认为 1。

运行这个来说明:

 DECLARE @uname varchar;

 SET @uname = 'admin'

 SELECT @uname

您将看到结果是 'a' 而不是 'admin'

将定义更改为:

 DECLARE @uname varchar(100) 

另请注意,根据 Nikola 的评论,您的 C# 代码中缺少 @:

 cmd.Parameters.Add(new SqlParameter("@uname", "admin"));

关于c# - 查询可以不带参数,但不能带参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37784950/

相关文章:

sql - 如何在设计过程中更改SQL表默认数据类型

java - Row_number() 和按 SQL 语句分区在 java 类中不起作用

java - Java 的 sql.Date 会产生 off by one 错误吗?

sql-server - 使用 SQL Server 我只需要非空值的唯一索引

c# - 如何使用 Windows 窗体和 C# 将嵌入的音乐文件复制到路径

c# - 使用 C# 将 bool 数组转换为字符串

c# - 将多维集合转换为带分隔符的字符串

c# - 以相同的顺序在 C# 中随机化两个 List<string>

c# - Visual C# 程序仅将最后一个索引保存到 XML 文件

sql-server - SQL Server 通过聚合选择随机(或第一个)值