首页 > 解决方案 > 如何根据机器名过滤获取 SQL 数据值?

问题描述

当我尝试获取机器地址的特定数据值时,我无法获取此值

ALTER PROCEDURE [dbo].[Datade]
    @makineadı varchar,
    @startdate datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * 
    FROM HMI.[dbo].Tarihmakine 
    WHERE MakineAdı = @makineadı 
      AND Tarih = @startdate
END

我在这个 API 控制器中使用了这个存储过程,通常当我试图获取所需的 SQL 数据日期时,我可以提取它,但是当我尝试对机器名的字符串格式进行字符串处理时,我无法获取此数据,我认为这是由于双引号,但我无法将其转换为单引号

public class RaporController : ApiController
{
    public IHttpActionResult Getemprecords(string makineadı, DateTime? startdate)
    {
        HMIEntities1 sd = new HMIEntities1();
        var results = sd.Data(makineadı, startdate).ToList();
        return Ok(results);
    }
}

我使用此网页获取特定值 https://localhost:44355/api/rapor?makineadı=192.168.0.8&&startdate=2021-01-29

这是我的数据库在此处输入图像描述

标签: c#sqlasp.net-mvc

解决方案


您的代码看起来像 SQL Server。如果是这样,永远不要使用没有长度的字符串声明:

ALTER PROCEDURE [dbo].[Datade] (
    @makineadı varchar(255),
    @startdate datetime
) AS
BEGIN
    SET NOCOUNT ON;

    select *
    from HMI.[dbo].Tarihmakine
    where MakineAdı = @makineadı and Tarih = @startdate
END;

默认日期也因上下文而异——这些错误可能很难调试。在您的情况下,默认值为varchar(1),这不是您想要的。

另一个潜在的问题是使用datetimefor 第二个参数。但是,你想要什么并不清楚:

  • 如果你。Tarih是 a date,然后将参数作为 a 传入date
  • 如果Tarih是 adatetime并且您想要同一日期的值,则传入 adate并使用convert(date, Tarih) = @startdate
  • 仅按原样使用代码,如果Tarihdatetime(某种),并且您希望将比较降低到几分之一秒。

推荐阅读