2017-07-12 12 views
0

SQL Serverのデータベースからユーザー名を選択する必要があります。 SqlCommandによって生成されるクエリは、SQL Server Management Studioでは動作しますが、自分のコードでは動作しません。C# - SqlCommandでクエリが機能しない

これは、AFFAQPC/affaqの入力が/の場合にのみ発生します。

コードは:

public int? getid() 
{ 
    SqlConnection Db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString); 

    Db.Open(); 

    // Searching for id in Users table from the logged in username 
    SqlCommand command = new SqlCommand("SELECT TOP 1 id FROM UsersLogin where username = '@user1';", Db); 
    command.Parameters.AddWithValue("@user1", userName); 
    string query = command.CommandText; 

    foreach (SqlParameter p in command.Parameters) 
    { 
     query = query.Replace(p.ParameterName, p.Value.ToString()); 
    } 

    Trace.WriteLine(query); 

    using (SqlDataReader reader = command.ExecuteReader()) 
    { 
     if (reader.Read()) 
     { 
      Trace.WriteLine("111"); 
      int id = Convert.ToInt32(reader["id"]); 
      Trace.WriteLine(id); 
      Db.Close(); 
      return id; 
     } 
    } 

    Db.Close(); 
    return null; 
} 

入力/が含まれている場合、エラーが発生します。 SqlCommandで生成され

クエリ:

SELECT TOP 1 id 
FROM UsersLogin 
WHERE username = 'AFFAQPC\affaq'; 
+0

[IDisposable](https://msdn.microsoft.com/en-us/library/system.idisposable(v = vs.110).aspx)オブジェクト(「SqlConnection」など)を正しく処理していません。 – mason

+1

C#の文字列では、バックスラッシュはエスケープ文字です。 C#でこのクエリを作成している場合、それは文字列リテラルです。文字列の前に "@"を使用して、エスケープ文字を指定しないでリテラル文字列を指定したいとします:username = @ 'AFFAQPC \ affaq'; – pmbAustin

+1

あなたは 'userName'変数がどこから来たのかわかりません。 – mason

答えて

1

は、クエリ文字列

username = '@user1' 
to 
username = @user1 

「パラメータ」「@」なしである必要があり、名前だけ

から単一引用符を削除します
command.Parameters.AddWithValue("user1", userName); 

userNameの値が文字列であれば(ソースが何であれ確認してください)、処理時に適切に認識されます。明示的に引用する必要はありません。それ以外の場合、クエリは特にユーザー '@ user1'を探しています。これは、おそらくあなたが期待しているものを返さない理由です。

私は、なぜあなたが値を割り当てるためにすべてのパラメータをサイクリングしているのか分からない... userNameフィールドは、foreachパラメータチェックを行わずに済んでいるはずです。

+0

が最初のアサーションに同意すると、それは引用符なしでuser1にありますが、AddWithValue、@userNameを呼び出すときに動作するはずです。 – derloopkat

+0

SQLコマンドによって生成された実際のクエリを生成するために、パラメータを循環させていました。 –

+0

ありがとう、あなたは今働いている人。 –

関連する問題