查询不带参数但不带参数

时间:2016-06-13 08:26:46

标签: 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();
    }
}

我没有例外。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

定义字符串变量时,您尚未指定大小,因此默认为长度为1。

运行此说明:

 DECLARE @uname varchar;

 SET @uname = 'admin'

 SELECT @uname

您会看到结果为'a'而不是'admin'

将您的定义更改为:

 DECLARE @uname varchar(100) 

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

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

答案 1 :(得分:1)

DECLARE @uname nvarchar(256);

SET @uname = 'admin'

SELECT * FROM [User] WHERE UserName = @uname

和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();
    }
}

您在创建表时使用了UserName nvarchar(256)。因此,使用相同的数据类型&大小