所以我使用本指南设置了一个使用SQL的WebAPI: http://www.codeproject.com/Articles/715073/Creating-a-Proof-of-Concept-Web-API-App-that-Uses
一切都很好,但是我注意到这只是从SQL中取回所有记录并执行" Where"而在C#中,这对于数百万行的数据库来说并不理想。
我认为应该有效的快速解决方案是在这里捕获参数:
public IEnumerable<ConfigMgrServerDB> GetByStateOrProvince(string StateOrProvince)
{
Debug.WriteLine(StateOrProvince);
APIparam = StateOrProvince;
return customerAddressData;
}
但是,即使我在类的范围内定义APIparam,当我尝试在调用SQL的方法中使用它时,它显然没有值,发送到SQL的参数设置为&#39; default&#39;像这样: @ PARAM =默认 下面是完整的代码,它显示APIparam被定义为一个公共字符串,并且可以设置它并且回显正常。但是,当我想在SQL代码中使用它时,它就是null。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Web;
namespace WebApplication4.Models
{
public class ConfigMgrServerDBRepository : IConfigMgrServerDBRepository
{
private readonly List<ConfigMgrServerDB> customerAddressData = new List<ConfigMgrServerDB>();
public string APIparam ;
public string strProgramName;
public int GetCount()
{
return customerAddressData.Count;
}
public IEnumerable<ConfigMgrServerDB> GetByStateOrProvince(string StateOrProvince)
{
Debug.WriteLine(StateOrProvince);
APIparam = StateOrProvince;
return customerAddressData;
}
public IEnumerable<ConfigMgrServerDB> GetAll()
{
return customerAddressData;
}
public ConfigMgrServerDB Add(ConfigMgrServerDB item)
{
if (item == null)
{
throw new ArgumentNullException("item arg was null");
}
if (customerAddressData != null) customerAddressData.Add(item);
return item;
}
public ConfigMgrServerDBRepository()
{
using (var conn = new SqlConnection(
@"Data Source=RE8-PRIMB\PRIMB;Initial Catalog=PrimB;Persist Security Info=True;User ID=sa;Password=pass;"))
//@"Data Source=RE8-NWMMC1\NWMMC1;Initial Catalog=AdventureWorksLT2012;Persist Security Info=True;User ID=sa;Password=pass;"))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText =
@"CREATE TABLE #Package
(
PackageID NVARCHAR(8),
Name NVARCHAR(512),
ProgramName NVARCHAR(100),
CollectionID NVARCHAR(8),
)
CREATE CLUSTERED INDEX IDX_C_Package_CollectionID ON #Package(CollectionID)
INSERT INTO #Package
SELECT Pa.[PackageID],Pa.[Name],MAX(Pro.Name)ProgramName, A.CollectionID
FROM v_Package (nolock) Pa
INNER JOIN vSMS_Program (nolock) Pro ON Pro.PkgID = Pa.PackageID AND (ProgramFlags&0x00001000)/0x00001000 <> 1
INNER JOIN v_Advertisement (nolock) A ON A.PackageID = Pa.PackageID AND A.ProgramName = Pro.Name
WHERE Pa.PackageType = 0 AND Pro.Name <> '*' /*AND Pro.Name NOT LIKE '%Nomad%'*/
GROUP BY Pa.PackageID,Pa.Manufacturer,Pa.[Name],Pa.[Description], A.CollectionID
SELECT p.PackageID, p.ProgramName/*, p.Name, cm.Name MachineName,s.Hardware_ID0,mac.MAC_Addresses0*/
FROM #Package p
INNER JOIN CollectionMembers (nolock) cm ON cm.SiteID = p.CollectionID
INNER JOIN v_R_System_Valid (nolock) s ON s.ResourceID = cm.MachineID
INNER JOIN v_RA_System_MACAddresses (nolock) mac ON mac.ResourceID = s.ResourceID
WHERE cm.Name = @PackageID
OR mac.MAC_Addresses0 = '78:2B:CB:9B:56:F3'
GROUP BY p.PackageID,p.Name, p.ProgramName";
cmd.CommandType = CommandType.Text;
//cmd.Parameters.AddWithValue("@PackageID", APIparam );
cmd.Parameters.AddWithValue("@PackageID", "RE8-W7-1");
Debug.WriteLine(APIparam);
cmd.Connection.Open();
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader != null && dataReader.Read())
{
int i = 0;
while (dataReader.Read())
{
i++;
APIparam = Convert.ToString(dataReader["PackageId"]);
strProgramName = Convert.ToString(dataReader["ProgramName"]);
Add(new ConfigMgrServerDB { PackageId = APIparam , ProgramName = strProgramName });
}
if (i == 0) /* No Rows */
{
//collectionMessage = "Cannot add Machine to collection " + CMCollectionID + " because no CM resource found with this serial number" + System.Environment.NewLine;
Debug.WriteLine("no rows ");
}
}
}
}
}
}
}
}