2017-07-12 64 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#構建這個查詢,並且這是一個字符串文字,那麼你需要在字符串前面使用「@」來指定一個沒有轉義的文字字符串:where username = @'AFFAQPC \ affaq'; – pmbAustin

+1

您沒有顯示'userName'變量來自哪裏。 – mason

回答

1

從您的查詢字符串

username = '@user1' 
to 
username = @user1 

「參數」應該沒有「@」,只是名字

刪除單引號
command.Parameters.AddWithValue("user1", userName); 

如果userName的值是一個字符串(確認你的源是什麼),在處理時會被正確識別。你不需要明確地引用它。否則,查詢會特別尋找用戶'@ user1',這可能是爲什麼它沒有返回你所期望的。

我不知道爲什麼你要通過所有參數循環來分配值... userName字段應該已經很好,不用做foreach參數檢查。

+0

同意第一個斷言,它在用戶1沒有引號,但是當調用AddWithValue時,@ userName應該工作。 – derloopkat

+0

我在循環查看參數以生成由sql命令生成的真實查詢。 –

+0

謝謝你現在正在工作的人。 –