";将varchar值转换为int“”时转换失败;尝试按日期筛选表时

本文关键字:转换 失败 日期 筛选 varchar quot int | 更新日期: 2023-09-27 17:59:56

我想从C#中ASP.NET中的数据库中进行一个简单的选择。我在aspx页面上有一个SqlDataSource,我有一个名为Eventmsgs的表,其中有3列——id (int), Msg (Varchar(max)), date (Varchar(max)),其中包含每天的事件。

我只想选择今天的消息。这是我的代码:

    String date = System.DateTime.Now.Date.ToShortDateString();
    SqlDataSource1.SelectCommand = "SELECT * FROM EventMsgs WHERE Date="+date;
    DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);

但是当我调用Select方法时,我会得到以下错误:

将varchar值"4/25/2014"转换为时转换失败数据类型int

但为什么要将其转换为int

";将varchar值转换为int“”时转换失败;尝试按日期筛选表时

尝试用单引号('4/25/2014')包装date值,如下所示:

SqlDataSource1.SelectCommand 
  = String.Format("SELECT * FROM EventMsgs WHERE Date='{0}'",date);

无论何时在SQL中比较不同类型的两个值,服务器都必须首先转换其中一个。那么你比较的两种类型是什么?

在左侧,您的Date列的类型显然是varchar(max)。然而,在右边,你得到了值4/25/2014,它是4,除以25,除以2014,一个值为0int

因此,当服务器尝试进行比较时,它会尝试将左侧(字符串)转换为整数,但无法这样做,因为它不是整数。

你的问题是字符串文字必须被引用,同样的事情也适用于例如日期。如果你使用了不同的日期格式或任何其他字符串,你会得到一个语法错误,这会使错误更清楚——事实上,US格式实际上是一个可解析的表达式(尽管它总是会导致0)。因此,为了实现这一点,您必须在文本/日期值周围使用引号,例如'4/25/2014'

无论如何,你所做的在很多层面上都是错误的:

  • 您不应该使用varchar列来存储日期。更不用说varchar(max)了。这就是datetimedate的作用——使用正确的数据类型。这一点很重要,原因有很多-您可以获得正确的排序、比较,还可以获得日期函数(dateadddatepart…)的支持。更不用说它节省了一点空间。你保存了一个日期值,这也意味着,如果你传递了一个不是有效日期的东西,你会在插入时受到折磨,而不是在以后处理不正确的数据时——尽快发现错误要容易得多
  • 您不应该像这样将值传递到SQL查询中。相反,您应该始终使用参数-select * from EventMsgs where Date = @Date;。您只需将参数添加为原始DateTime值,.NET(和SQL服务器)将自行处理传递,从而避免SQL注入开口和许多其他问题(例如,如果您与将日期解释为dd/MM/yyy而不是MM/dd/yyyy的SQL服务器交谈,则会出现非常"有趣"的错误)
  • 通常,除非需要,否则您不希望执行自定义SQL查询。为什么不使用类似于ORM的EntityFramework或LINQ2SQL来简化您的工作呢

传递参数的正确方式的示例代码如下所示:

SqlDataSource1.SelectCommand = "select * from [EventMsgs] where [Date] = @Date;";
SqlDataSource1.SelectParameters.Add("@Date", DateTime.Today);