目前我正在开发一个应用程序,该应用程序在SQL表中搜索选民注册信息,例如名字,姓氏,城市等。
到目前为止,我只能搜索一个表格,但我希望能够让用户选择更改他们可以搜索的年份。
我该如何做到这一点?
这是我目前的代码:
namespace WebApplication1
{public class VoterDataLayer
{
public DataTable SelectSearch(string lastName, string firstName, string middleName, string nameSuffix, string city, string zip)
{
try
{
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["VoterReg"].ConnectionString;
using (SqlConnection Connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("spVR092011", Connection);
DataTable dt = new DataTable();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@LastName", lastName);
cmd.Parameters.AddWithValue("@FirstName", firstName);
cmd.Parameters.AddWithValue("@MiddleName", middleName);
cmd.Parameters.AddWithValue("@NameSuffix", nameSuffix);
cmd.Parameters.AddWithValue("@City", city);
cmd.Parameters.AddWithValue("@Zip", zip);
Connection.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
return dt;
}
}
catch (SqlException ex)
{
throw ex;
}
}
}
}
存储过程
USE [Voters]
GO / ******对象:StoredProcedure [dbo]。[spVR092011]脚本日期:1/15/2015 8:56:28 AM ****** / SET ANSI_NULLS ON 走 SET QUOTED_IDENTIFIER ON 走 ALTER PROCEDURE [dbo]。[spVR092011]
@LastName varchar(25),
@FirstName varchar(25),
@MiddleName varchar(25),
@NameSuffix varchar(4),
@City varchar(250),
@Zip varchar(10)
AS 开始 - 添加SET NOCOUNT ON以防止出现额外的结果集 - 干扰SELECT语句。 SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT TOP 1000 [LastName] AS [Last Name],
[FirstName] AS [First Name],
[MiddleName] AS [Middle],
[NameSuffix] AS [Suffix],
[City],
[Zip] AS [Zip Code],
[RegistrantID]
FROM [dbo].[VR092011]
WHERE
[LastName] LIKE '%' + @LastName + '%' AND
[FirstName] LIKE '%' + @FirstName + '%' AND
[MiddleName] LIKE '%' + @MiddleName + '%' AND
[NameSuffix] LIKE '%' + @NameSuffix + '%' AND
[City] LIKE '%' + @City + '%' AND
[Zip] LIKE '%' + @Zip + '%'
END
答案 0 :(得分:0)
向存储过程添加一个参数以更改sproc选择的表将强制您将查询构建为字符串并使用sp_executesql执行,因为预编译的SQL必须显式命名表。
这会有效,但很难看。你有几个选择,但它们也很难看:
所有这些丑陋都源于您的次优数据结构。正确规范化的数据库将包含单个表中所有年份的数据,以及允许过滤的年份列。如果您的数据采用这种方式构建,那么您的解决方案就像传入其他参数一样简单。