2010-10-15 92 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