我目前正在使用ASP.NET框架在Visual Studio 2010中使用C#在网站上创建一个非常简单的WebApp。
该网站将连接到我的笔记本电脑上运行的SQL EXPRESS服务器(全部基于本地)
我的表格定义如下
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
现在,我的网站上有一个名为Users的页面。注意:gname表示组名(即用户加入兴趣组。)
这里有一个看起来像这样的表格:
UserName:
Gender:
Age:
GroupName:
Location:
现在,这意味着我有5个不同的字段,因此,我必须为每个不同的情况编写25个SQL语句。我发现这很天真。
我尝试使用谷歌搜索动态SQL语句,这似乎没有解决我的问题(或者至少我不明白他们如何解决我的问题)。
有人能指出我正确的方向,学习如何实现足够智能的SQL语句,根据用户输入的字段生成查询吗?
向任何可能认为我没有对可能看似相当简单的事情进行研究的人道歉。
-Ali
答案 0 :(得分:3)
这里有很多不妥之处。
PRIMARY KEY(userName,email))
垃圾。主键是唯一的。用户名是唯一的。您想要的是电子邮件上的唯一索引,但不是组合的主键,因为这意味着只要拥有不同的电子邮件地址,就有2个用户“Joe”是合法的。
那就是说,也许不是使用电子邮件和用户名作为主键,而是使用合成的gi。
同样在这里:
性别varchar(50),
你的情况是什么性别? “王八蛋”?在大多数情况下,人们将其写为CHAR(1)NULL,表示“M”或“F”或NULL(用户未输入)。不要将已解码的字符串存储在数据库中以进行stati。
继续:
age int,
为什么呢?可以使用BIrthdate和当前日期在一行中的代码中计算年龄。这是一场维护噩梦。人们进入他们的生日。在您的计划中使用它。不保存更改数据(它们变老)不存储它。
和
location varchar(50),
现在,这没有任何意义。真。首先,它应该是一个表(位置),在这里有一个参考。其次,即使你不相信,50个字符太小了。有些空格的名字较长。无论如何,要学习数据规范化。
此:
gname varchar(50)
和此:
注意:gname表示组名(即, 用户加入兴趣小组。)
如果用户只加入一个组,那么任何意义都是有意义的,即使这样,它也会像设计那样发臭 - 应该有一个组表。简单案例:表组,这将是具有teh组的主(合成)键的GroupREF。否则它什么都不是,并且临时表将用户附加到组,因为用户可以是许多组的一部分。
任何人都可以指出我的权利 学习如何实施的方向 足够智能的SQL语句 根据哪个字段生成查询 已被用户输入?
是。它被称为学习编程。严重。
基本上,坐下来并建立一个SQL语句字符串,只执行您需要的操作。在你这样做之前,你可能想读一本像SQL for DUmmies的书来了解表设计。
如果你想要一个静态语句,你可以输入类似的东西 *参数@surname为surename - 始终使用参数传递您的字段中的值。
WHERE(姓氏LIKE @姓氏或姓氏为空)
并且SQL Server将以合理的效率处理它(因为它可以看到只有一个部分可以评估为null)。只是回答你的问题。
答案 1 :(得分: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
答案 2 :(得分:1)
您不需要使用动态sql。这是您的参数化查询或存储过程的解决方案:
-- assuming you have parameters @username,@gname,@pass for searching user
select * from Users
where (username like '%'+@username+'%' or @username is null)
and (gname = @gname or @gname is null)
and (password = @password or @password = null)
你可以根据需要添加任意数量的参数,并根据需要添加列名来代替*来获取
答案 3 :(得分:1)
考虑@GôTô的代码和下面的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)