5

在我的 SQL 服务器上,我有一个非常简单的测试表,它只包含三行: IDDate. Hours( varchar, DateTime, varchar)。

SQL 中的 DateTime 格式如下yyyy-MM-dd HH:mm:ss.fff

C# 中的 DateTime 格式如下:yyyy-dd-MM HH:mm:ss.fff.

我使用以下代码获取 C# DateTime 格式:

 string ddd = "2012-10-10 00:00:00.000";
 dt1 = DateTime.ParseExact(ddd, "yyyy-MM-dd HH:mm:ss.fff", null);

如果我尝试进入yyyy-dd-MM我会得到一个错误:

日历不支持由字符串表示的 DateTime。

在我的 C# 应用程序中,我试图找出不同日期之间的总小时数。我有点让它工作,但它只适用于 01 到 12 之间的日期。

所以从2012-01-102012-10-10(十天)会给我正确的数据库总小时数。

但是当我写信2012-01-102012-14-10(十四天)时,我收到一个错误:

将 char 数据类型转换为 datetime 数据类型导致超出范围"

先感谢您。

PS。你能推荐一种更简单的约会方式吗?

mySQL 查询

string CommandText = "SELECT * FROM date_test WHERE id = '4' AND date BETWEEN '" + dt1 + "' AND '" + dt2 + "'";

我已经找到了问题,但没有找到解决方案。

问题是SQL数据库看格式,想要yyyy-MM-dd,但是C#只能发送yyyy-dd-MM。

为什么不能ParseExact()做 yyyy-MM-dd?

4

2 回答 2

4

您正在为SQL 注入准备一个完美的基础。
也看这里。有一个参数化查询的例子。

于 2012-09-24T11:26:55.573 回答
3

日历不支持由字符串表示的 DateTime。

出现此错误是因为您的 C# 应用程序将日期2012-14-10视为14th月、10th日和2012th year. 找到日期和年份,但没有找到月份。此外,不要尝试更改 C# 应用程序查看日期的方式,这是基于系统文化的。

您对如何定义DateTime对象以及如何显示对象感到困惑。

由于您将日期存储为DateTimeSQL,因此我没有充分的理由相信您需要进行任何类型的解析。考虑下面的代码示例。

var dataTable = new DataTable();
var dataAdapter = new SqlDataAdapter("SELECT * FROM YourTable", "{connection string}");

dataAdapter.Fill(dataTable);

var yourDate = dataTable.Rows[0]["Date"]; <=== the type will be DateTime, simple.

添加参数

让我们以您的示例查询为例:

"SELECT * FROM date_test WHERE id = '4' AND date BETWEEN '" + dt1 + "' AND '" + dt2 + "'";

让我们稍微修正一下,考虑下面的例子:

var dataTable = new DataTable();
var dataAdapter = new SqlDataAdapter("SELECT * FROM date_test WHERE id = @ID AND date BETWEEN @StartDate AND @EndDate", "{connection string}");

dataAdapter.SelectCommand.Parameters.AddWithValue("@ID", "4");
dataAdapter.SelectCommand.Parameters.AddWithValue("@StartDate", new DateTime(2012, 10, 1));
dataAdapter.SelectCommand.Parameters.AddWithValue("@EndDate", new DateTime(2012, 10, 14));

dataAdapter.Fill(dataTable);

var yourDate = dataTable.Rows[0]["Date"]; <=== the type will be DateTime, simple.
于 2012-09-24T11:24:28.510 回答