【问题标题】:Query works without parameters but not with parameters查询不带参数但不带参数
【发布时间】:2016-06-13 08:26:46
【问题描述】:

这是迄今为止我在使用 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();
    }
}

我没有例外。

有什么想法吗?

【问题讨论】:

  • 显示你遇到问题的代码
  • @durga,我添加了 C# 代码示例
  • 参数名称中缺少@。

标签: c# sql-server


【解决方案1】:

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

运行这个来说明:

 DECLARE @uname varchar;

 SET @uname = 'admin'

 SELECT @uname

你会看到结果是'a' 而不是'admin'

将您的定义更改为:

 DECLARE @uname varchar(100) 

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

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

【讨论】:

  • 做到了,我不知道为什么我没有想到这一点,至于@符号它总是对我有用,因为我在查询中定义了它,但也许它是最好在 SqlParameter 名称中这样做,谢谢!
【解决方案2】:

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)。所以最好使用相同的数据类型和大小

【讨论】:

  • 哦,只是为了让其他用户不会感到困惑,我认为您将 @ 符号放在 SqlParameter 中是错误的
猜你喜欢
  • 2019-09-03
  • 2019-08-31
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2023-04-05
  • 2017-06-19
  • 2013-04-07
  • 2017-09-01
相关资源
最近更新 更多