2015-01-15 81 views
-1

目前我的工作,通過選民登記信息,如名字,姓氏,城市等如何更改搜索應用程序的SQL數據源?

到目前爲止,我只能夠通過一個表格來搜索,但我想要一個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]腳本日期:2015年1月15日8點56分28秒******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON。GO ALTER PROCEDURE [DBO] [spVR092011]

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

AS BEGIN - 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

你是說你在不同的表格中有不同的「年份」數據?另外請注意,'SqlCommand'和'SqlDataAdapter'都實現'IDisposable',因此應該明確地關閉或包含在'using'語句中 – stuartd 2015-01-15 16:36:45

+2

所涉及的表的描述將會很有用... – 2015-01-15 16:39:04

+0

您正在將參數添加到現有的cmd對象..爲什麼不能將參數添加多年,並在數據庫中將其默認爲null存儲過程..?如果你不確定「stuartd」在說什麼,你也可以根據你正在解釋的「seby408」來解決這個問題。如果你不確定如何包裝前面提到的對象,你可以做這樣的事情。一個'using(){}''((IDisposable)cmd).Dispose();'你也可以爲'SqlAdapter Object'做同樣的事情 – MethodMan 2015-01-15 16:42:36

回答

0

將參數添加到您的存儲過程來改變存儲過程中選擇的表從將要強迫你建立你的查詢語句的字符串,並與sp_executesql的執行,因爲預編譯SQL必須明確命名一張桌子。

這會工作,但它很醜。你有幾個選擇,但他們也難看:

  1. 構建SQL查詢的客戶端(換出需要的表名)上,並傳遞到服務器
  2. 創建爲每一個單獨的存儲過程根據用戶輸入決定要調用哪一組數據。

所有這些醜陋都源於您的次優數據結構。一個正常規範化的數據庫將有來自單個表中所有年份的數據和一個允許過濾的年份列。如果您的數據是以這種方式構建的,那麼您的解決方案就如同傳入一個附加參數一樣簡單。

相關問題