【问题标题】:How to change SQL data sources for a search application?如何更改搜索应用程序的 SQL 数据源?
【发布时间】:2015-01-15 16:32:52
【问题描述】:

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

去 /****** 对象:StoredProcedure [dbo].[spVR092011] 脚本日期:1/15/2015 8:56:28 AM ******/ 设置 ANSI_NULLS ON 去 设置 QUOTED_IDENTIFIER ON 去 更改程序 [dbo].[spVR092011]

@LastName varchar(25),
@FirstName varchar(25),
@MiddleName varchar(25),
@NameSuffix varchar(4),
@City varchar(250),
@Zip varchar(10)

作为 开始 -- 添加了 SET NOCOUNT ON 以防止额外的结果集 -- 干扰 SELECT 语句。 设置无计数;

-- 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 + '%'

结束

【问题讨论】:

  • 你是说你在不同的表中有不同的“年”数据吗?另外,请注意SqlCommandSqlDataAdapter 都实现了IDisposable,因此应该明确关闭或包含在using 语句中
  • 所涉及的表的描述将很有用...
  • 您正在向现有的 cmd 对象添加参数.. 为什么不能在参数中添加年份并在数据库存储过程中将其默认为 null..?如果您不确定stuartd 是在说什么,根据您所解释的内容,这看起来并不那么困难seby408。如果您不确定如何将前面提到的对象包装在其中,您可以这样做using(){} ((IDisposable)cmd).Dispose(); 你也可以对 SqlAdapter Object 做同样的事情
  • 发布您的spVR092011 存储过程会很有帮助。正如@MethodMan 所说,这似乎是对您当前代码的一个微不足道的更改。
  • @stuartd 是的,这正是我要说的。

标签: c# asp.net sorting gridview


【解决方案1】:

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

这会起作用,但它很难看。你有几个选择,但它们也很丑:

  1. 在客户端构建您的 sql 查询(根据需要交换表名)并传递给服务器
  2. 为每组数据创建一个单独的存储过程,并根据用户输入决定调用哪个。

所有这些丑陋都源于您的次优数据结构。一个适当规范化的数据库将在一个表中包含所有年份的数据,以及一个允许过滤的年份列。如果您的数据采用这种结构,您的解决方案将像传入一个附加参数一样简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2023-04-10
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多