Asp.net web api 如何从WebAPI获取参数,以便在SQL查询中使用它们
因此,我使用本指南设置了一个使用SQL的WebAPI: 这一切都很好,但我注意到这只是从SQL中提取所有记录,并在C中执行Where,这对于我的数百万行的数据库来说并不理想 我认为应该有效的快速解决方案是在此处捕获参数:Asp.net web api 如何从WebAPI获取参数,以便在SQL查询中使用它们,asp.net-web-api,Asp.net Web Api,因此,我使用本指南设置了一个使用SQL的WebAPI: 这一切都很好,但我注意到这只是从SQL中提取所有记录,并在C中执行Where,这对于我的数百万行的数据库来说并不理想 我认为应该有效的快速解决方案是在此处捕获参数: public IEnumerable<ConfigMgrServerDB> GetByStateOrProvince(string StateOrProvince) { Debug.WriteLine(StateOrProvince
public IEnumerable<ConfigMgrServerDB> GetByStateOrProvince(string StateOrProvince)
{
Debug.WriteLine(StateOrProvince);
APIparam = StateOrProvince;
return customerAddressData;
}
但是,即使我在类的作用域中定义了APIparam,当我尝试在调用SQL的方法中使用它时,它显然没有值,发送到SQL的参数设置为“default”,如下所示:
,@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 ");
}
}
}
}
}
}
}
}
什么是APIparam?如何使用它来构造查询?让我通过编辑将整个类发布给您。第一个Debug.writeListateOrProvince;打印出我的参数很好。第二个没有,看起来我分配APIparam的代码实际上是在SQL命令之后运行的。因此,我需要找到另一种方法来获取SQL命令的API参数。我刚刚通过更改Debug.writelineApparam发现了这一点;如果String.isnulloremptyaparam Debug.WriteLineis为null或为空,则输入到中;现在,我的调试控制台显示:如果是null或空的r1122Right,它看起来像是在类构造函数中调用了debug.WriteLineApparam。那么它是如何获取参数的呢?不幸的是,WebAPI和SQL的所有在线示例都采用这种方法,但必须有另一种方法。