现在这是我在使用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();
}
}
我没有例外。
有什么想法吗?
答案 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)。因此,使用相同的数据类型&大小