【问题标题】:ADO.net query from coming from APP.config not working来自 APP.config 的 ADO.net 查询不起作用
【发布时间】:2017-07-22 12:46:39
【问题描述】:

下面是我用APP.Config写的sql查询

<add key="query" value="Select *
     from POManage po 
     Where po.VendorID = @manufacturerid
     and po.order_date between @StartDate and @EndDate order by PONumber asc"/>

这是我的程序 .cs 代码

 int manufacturerid = 32;     
 DateTime StartDate = DateTime.Now.AddDays(-1);
 DateTime EndDate = DateTime.Now;
 SqlCommand cmd = new SqlCommand(query, con);
 cmd.Parameters.Add("@manufacturerid", SqlDbType.BigInt,manufacturerid);
 cmd.Parameters.AddWithValue("@StartDate", StartDate);
 cmd.Parameters.AddWithValue("@EndDate", EndDate);
 cmd.CommandType = CommandType.Text;
 SqlDataAdapter ad = new SqlDataAdapter(query, con);
 ad.Fill(ds);

但@manufacturerid 显示错误必须声明标量变量。

StartDate 和 EndDate 也会出现类似问题。

【问题讨论】:

  • 不要将日期作为字符串传递,这肯定会导致转换问题。如果你想去掉时间部分并只传递你想要的日期值,请使用DateTime.Date
  • app.config 可能不是存储查询的最佳位置。我建议使用资源或设置文件或配置文件。
  • 为什么po.order_date 不是实际的date 类型(为什么要转换为Date 类型)?如果要存储日期,则需要使用 Date 类型,这就是它的用途。否则一切都只是字符串,不会有类型之类的东西......
  • @Igor 它的要求我不能做任何事情
  • 还有WHERE po.VendorID = @manufacturerid,除非VendorID 是字符串,否则不要将值括在引号中,在这种情况下,为什么它是字符串?

标签: c# asp.net ado.net app-config


【解决方案1】:

首先,将命令查询保留在 appconfig 中是一个非常糟糕的主意

您已经创建了一个带有查询的命令。您需要将命令传递给适配器。不查询。

 int manufacturerid = 32;     
 StartDate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");
 EndDate = DateTime.Now.ToString("yyyy-MM-dd");
 SqlCommand cmd = new SqlCommand(query, con);
 cmd.Parameters.Add("@manufacturerid", SqlDbType.BigInt,manufacturerid);
 cmd.Parameters.AddWithValue("@StartDate", StartDate);
 cmd.Parameters.AddWithValue("@EndDate", EndDate);
 cmd.CommandType = CommandType.Text;
 SqlDataAdapter ad = new SqlDataAdapter(cmd);
 ad.Fill(ds);

并在您的查询中将 Where po.VendorID = '@manufacturerid' 更改为 Where po.VendorID = @manufacturerid

更新:

        int manufacturerid = 32;
        var query = @"Select * from POManage po
            Where po.VendorID = @manufacturerid
            and CONVERT(DATE, po.order_date) between @StartDate and @EndDate 
            order by PONumber asc";
        var startDate = DateTime.Now.AddDays(-1);
        var endDate = DateTime.Now;
        var connectionString = "your connection string";
        var dataTable = new DataTable();
        using (SqlConnection con = new SqlConnection(connectionString))
        {
            using (SqlDataAdapter adapter = new SqlDataAdapter(query, con))
            {
                adapter.SelectCommand.Parameters.AddWithValue("@manufacturerid", manufacturerid);
                adapter.SelectCommand.Parameters.AddWithValue("@StartDate", startDate);
                adapter.SelectCommand.Parameters.AddWithValue("@EndDate", endDate);
                adapter.Fill(dataTable);
            }
        }

【讨论】:

  • 好的,我更新了,现在我遇到问题,因为参数化查询'(@manufacturerid bigint,@StartDate nvarchar(10),@EndDate nvarcha'需要参数'@manufacturerid',但未提供。
  • 我需要在 App.config 中编写的查询中进行更改吗?
  • 我需要在查询中进行哪些更改,如果我放置了正确的值并在 sql server 中运行,查询将正常运行
  • @Xtremcool 您没有复制 same 查询。首先,不是使用@manufacturerid 参数,而是使用文字'@manufacturerid'。其次,您在不知道服务器上使用的语言环境的情况下将字符串转换为日期。只是不要将日期作为字符串传递。在客户端计算您想要的日期并将日期值传递给查询
  • @PanagiotisKanavos 最初它不适用于manufacturerid,如果这个问题得到解决,我们可以继续寻找开始日期和结束日期
猜你喜欢
  • 2020-06-15
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多