2016-06-13 6 views
2

これはMSSQLで作業しているときに私が遭遇した最も奇妙なことです。クエリはパラメータなしで動作しますが、パラメータなしで動作します

私はユーザーと呼ばれるテーブルを持って、それがユーザー名フィールドに「admin」を持っていることの1行、私は次のクエリを実行すると、それは私に何も結果を与えるものではありませんがあります。

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] 

そしてI 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(); 
    } 
} 

私は例外を取得していません。

アイデア?あなたは結果が表示されます

DECLARE @uname varchar; 

SET @uname = 'admin' 

SELECT @uname 

'a'ない 'admin'です:あなたはあなたの文字列変数を定義するときの長さがデフォルト1.

実行して、これを説明するためのよう

+0

問題が発生したコードを表示します。 – Chaitanya

+0

@durga、C#コードサンプルを追加しました。 – Glen

+0

@がパラメータ名にありません。 –

答えて

4

あなたはサイズを指定していません

に、あなたの定義を変更します。

DECLARE @uname varchar(100) 

また、ニコラのコメントどおり、あなたのC#コードから欠落@があり、注意してください。

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

それは、なぜ私はそれを考えるのではないか分かりません。@シンボルに関しては、それがなければ私がクエリで定義したように常に働いていましたが、おそらくSqlParameter名前もありがとう! – Glen

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)。したがって、同じデータ型を使用する方が良い&サイズ

+0

レッスンで学んだことは、常にサイズを指定していただき、ありがとう:) – Glen

+1

ああ、ちょうど他のユーザーが混乱することはありません。あなたは@記号をSqlParameter – Glen

関連する問題