2010-10-15 98 views
4

即時通訊目前使用C#在Visual Studio 2010新來動態SQL語句

網站將連接到我的SQL Express服務器上我的筆記本電腦上運行使用ASP.NET Framework中的一個網站做一個非常簡單的Web應用程序(它的所有基於本地的)

我定義如下

CREATE TABLE Users(
userName varchar(50), 
email varchar(50), 
firstName varchar(50), 
lastName varchar(50), 
gender varchar(50), 
birthday date, 
age int, 
location varchar(50), 
gname varchar(50) 
PRIMARY KEY (userName, email)) 
GO 

現在的表,我已經在我的網站叫做用戶頁面。注:的gname指組名稱(即用戶加入一個利益集團。)

在這裏我有一個看起來是這樣一種形式:

UserName: 
Gender: 
Age: 
GroupName: 
Location: 

現在,這將意味着我有5個不同的領域,因此,我將不得不爲每種情況編寫25條SQL語句。我覺得很天真。

我試着用谷歌搜索動態SQL語句,這似乎並沒有解決我的問題在這裏(或者至少我不明白他們如何解決我的問題)。

任何人都可以指出我正確的方向來學習如何實現足夠聰明的SQL語句來生成基於哪個字段已被用戶輸入的查詢嗎?

向任何可能認爲我沒有完成我的研究的人道歉,這可能看起來很簡單。在查詢

-Ali

+0

你能解釋一下什麼是查詢需要做的是什麼呢? – JohnFx 2010-10-15 13:27:08

+0

用戶只能在一個興趣組中嗎?嗯相當限制作爲個人我有一堆興趣 – 2010-10-15 13:29:12

回答

1

考慮的@ GOTO的代碼組合及以下SQL

select * 
from Users u 
where (@username is null or Username like '%'+ @username + '%') 
    AND (@Gender is null or Gender = @gender) 
    AND (@age is null or Age = @age) 
    AND (@gname is null or gname = @gname) 
    AND (@location is null or location = @location) 
1

使用的參數是這樣的:

string commandText = "UPDATE Sales.Store SET Demographics = @demographics " 
    + "WHERE CustomerID = @ID;"; 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = new SqlCommand(commandText, connection); 
    command.Parameters.Add("@ID", SqlDbType.Int); 
    command.Parameters["@ID"].Value = customerID; 

    // Use AddWithValue to assign Demographics. 
    // SQL Server will implicitly convert strings into XML. 
    command.Parameters.AddWithValue("@demographics", demoXml); 

    try 
    { 
     connection.Open(); 
     Int32 rowsAffected = command.ExecuteNonQuery(); 
     Console.WriteLine("RowsAffected: {0}", rowsAffected); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

http://msdn.microsoft.com/en-gb/library/system.data.sqlclient.sqlcommand.parameters.aspx

1

你並不需要使用動態SQL。這裏是你的參數化查詢或存儲過程的解決方案:


-- assuming you have parameters @username,@gname,@pass for searching user 

select * from Users 
where (username like '%'[email protected]+'%' or @username is null) 
and (gname = @gname or @gname is null) 
and (password = @password or @password = null) 

,只要你想,你可以添加許多PARAMS和你在的地方*得到想要什麼錯在這裏與

+0

哦哇,謝謝lakhlaniprashant! – ali 2010-10-15 13:29:44

+0

我正在建議類似的東西:'[UserName] = ISNULL(@userName,[UserName])' – Brad 2010-10-15 13:29:55

+0

所以說是正確的,如果表單爲空,則查詢將採用@username爲空,而不是使用用戶名基於其搜索? – ali 2010-10-15 13:30:23

3

許多事情starte添加列名。

PRIMARY KEY(用戶名,電子郵件))

廢話。主鍵是唯一的。用戶名是唯一的。你想要的只是電子郵件上的唯一索引,而不是組合主鍵,因爲這意味着只要有兩個用戶「Joe」,只要他們具有不同的電子郵件地址就是合法的。

也就是說,也許不會使用電子郵件和用戶名作爲主鍵,但可以使用合成的電子郵件和用戶名。

同樣在這裏:

性別VARCHAR(50),

是什麼性別,你的情況? 「王八蛋」?在大多數情況下,人們將CHAR(1)NULL寫爲「M」或「F」或NULL(用戶未輸入)。不要將已解碼的字符串存儲在數據庫中以便靜態存儲。

接着說:

年齡INT,

爲什麼?年齡可以從日期和當前日期的一行代碼中計算得出。這是一個維護噩夢。人們輸入他們的生日。在你的程序中使用它。不要保存更改的數據(他們變老)。

和:

位置VARCHAR(50),

現在,這是沒有意義的。真。首先,它應該是一個表格(地點),在這裏有一個參考。其次,即使你不相信,50個字符太小。有些空間名稱較長。總之,學習數據規範化。

此:

的gname VARCHAR(50)

這:

注:的gname指組名稱(即 用戶加入一個利益集團。)

只有你有意義他們只會加入一個團隊,即使這樣,它也會像設計一樣發臭 - 應該有一個組表。簡單的情況:表組,這將是一個GroupREF與組的主要(合成)密鑰。否則就沒什麼了,臨時表將用戶附加到組,因爲用戶可以是許多組的一部分。

任何人都可以點我在正確的方向 學習如何在此基礎上現場 已經由用戶給定的輸入實現 SQL語句,這就是足夠聰明, 產生疑問?

是。它被稱爲學習編程。認真。

  • 沒有SQL語句能夠真正有效地執行此操作。
  • SQL是文本。字符串。操作字符串是基本編程。

基本上,坐下來,並建立一個SQL語句字符串,做你所需要的只。在你做之前,你可能需要閱讀一本像DUMMies這樣的書來了解表格設計的想法。

如果你想要一個靜態語句,你可以放入類似 *參數@surname for surename - 總是使用參數在你的字段中傳遞值。

WHERE(LIKE姓或@surname姓IS NULL)

和SQL Server將明智處理它體面效率(因爲它只能看到一部分可以計算爲NULL)。只是爲了回答你的問題。

+0

嗨,TomTom,我很欣賞你的意見。 它基本上是我的數據庫模塊的項目。我同意我的屬性的域名沒有意義。它真的在平庸的工作之下,因爲我想要掌握一些事情,所以我只是用一切行之有效的方法。 – ali 2010-10-15 13:41:51

+0

我也爲整個模型創建了ER圖(即我有一個表,稱爲用戶表引用的組)。 是的,我剛剛意識到我的用戶名的主鍵非常麻煩。感謝您的高舉。 – ali 2010-10-15 13:43:05