C# 如何根据机器名筛选获取SQL数据值?

C# 如何根据机器名筛选获取SQL数据值?,c#,sql,asp.net-mvc,C#,Sql,Asp.net Mvc,当我试图获取机器地址的特定数据值时,我无法获取此地址的值 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

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

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数据的期望日期时,我可以提取它,但当我试图获取机器名的字符串格式时,我无法获取该数据,我认为这是双引号造成的,但我无法将其转换为单引号

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


这是我的数据库

您的代码看起来像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;
默认日期也因上下文而异——这些bug可能很难调试。在您的情况下,默认值是
varchar(1)
,这不是您想要的

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

  • 如果你愿意的话
    Tarih
    是一个
    日期
    ,然后将参数作为
    日期
    传入
  • 如果
    Tarih
    是一个
    datetime
    并且您希望值在同一日期,则传入
    date
    并使用
    convert(date,Tarih)=@startdate
  • 只有当
    Tarih
    datetime
    (某种类型)并且您希望将比较时间缩短到几分之一秒时,才可以按原样使用代码

用您正在使用的数据库标记您的问题。
sd.Data
做什么?这是执行存储过程并处理结果的方法。如果编写正确,即如果它使用参数化查询,则根本不需要转换或引用。我认为这只是字符串(varchar)格式问题造成的,因为在尝试根据日期时间值获取数据时不会出现错误。Data是我在下面的第一个查询中添加到的存储过程的数据表示名称。我添加数据库图片只是为了尝试获取值。我再说一遍,我只对机器名(MakineAdı)的情况有问题。-您应该始终为所使用的任何
varchar
变量和参数提供长度。否则,参数的默认长度为1个字符!我对日期查询没有问题,而且当我尝试仅根据无法找到的机器名makineadı进行查询时,例如在数据库中,我的机器名数据是Makine-1,当我尝试查找时,它无法向我显示Makine-1数据作为API表单,这有一个表单公共类RaporController:ApiController{public IHttpActionResult Getemprecords(字符串makineadı){HMienties1 sd=new HMienties1();var results=sd.Data(makineadı).ToList();return Ok(results);}}我认为这只是字符串(varchar)造成的格式问题,因为当我尝试根据DateTime值获取数据时不会出错。您可以设置某种类型的db/sql FIDLE。我怀疑问题只是机器名不匹配。
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;