如何更改搜索应用程序的SQL数据源?

时间:2015-01-15 16:32:53

标签: c# asp.net sorting gridview

目前我正在开发一个应用程序,该应用程序在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

1 个答案:

答案 0 :(得分:0)

向存储过程添加一个参数以更改sproc选择的表将强制您将查询构建为字符串并使用sp_executesql执行,因为预编译的SQL必须显式命名表。

这会有效,但很难看。你有几个选择,但它们也很难看:

  1. 在客户端上构建sql查询(根据需要交换表名)并传递给服务器
  2. 为每组数据创建单独的存储过程,并根据用户输入决定调用哪个。
  3. 所有这些丑陋都源于您的次优数据结构。正确规范化的数据库将包含单个表中所有年份的数据,以及允许过滤的年份列。如果您的数据采用这种方式构建,那么您的解决方案就像传入其他参数一样简单。