C# 使用SQL插入日期时间(转换为字符串时)

C# 使用SQL插入日期时间(转换为字符串时),c#,mysql,datetime,C#,Mysql,Datetime,因此,基本上我使用两层,第一层称为“BL”(代表业务逻辑),另一层称为“DAL” 我有一个数据库,其中包含一个users表(在它的一个表中) BL通过引用(.dll)访问DAL,DAL访问数据库(BL不能直接访问数据库) 我想接收BL上的用户信息,将其发送给DAL,DAL将其插入数据库 我目前的方法: BL: public bool InsertUser(string userFName、string userLName、string userPass、DateTime userBirth、st

因此,基本上我使用两层,第一层称为“BL”(代表业务逻辑),另一层称为“DAL”
我有一个数据库,其中包含一个users表(在它的一个表中)

BL通过引用(.dll)访问DAL,DAL访问数据库(BL不能直接访问数据库)

我想接收BL上的用户信息,将其发送给DAL,DAL将其插入数据库

我目前的方法:

BL:

public bool InsertUser(string userFName、string userLName、string userPass、DateTime userBirth、string userEmail、string userCountry)
{
if(UsersDAL.Insert(userFName、userLName、userPass、userBirth.ToString()、userEmail、userCountry))
{
返回true;
}
返回false;
}
DAL:

公共静态bool Insert(字符串userFName、字符串userLName、字符串userPass、字符串userBirth、字符串userEmail、字符串userCountry)
{
DateTime userBirth=DateTime.Parse(userBirth);
尝试
{
OleDbHelper.fill(“插入到UsersTable(userFName、userLName、userPass、userBirth、userEmail、userCountry、userActive)值(“+userFName+”、“+userLName+”、“+userPass+”、“+userBirth+”、“+userEmail+”、“+userCountry+”、true)、“UsersTable”);
}
抓住
{
返回false;
}
返回true;
}
问题发生在Datetime上,所以我找不到任何解决方案


注意:在数据库中,“userBirth”是一个日期时间

我相信您试图在数据库中的日期中插入字符串。您应该能够将字符串转换为适合数据库中日期格式的日期(甚至可以删除userBirth上的.toString()方法,并将Insert方法中的userBirth类型更改为DateTime)

< >编辑:尝试这样做,而不是在查询的中间添加DATETIME作为字符串:

SqlCommand cmd = new SqlCommand("INSERT INTO <table> (<column>) VALUES (@value)", connection);
cmd.Parameters.AddWithValue("@value", dateTimeVariable);
SqlCommand cmd=newsqlcommand(“插入()值(@value)”,连接);
cmd.Parameters.AddWithValue(“@value”,dateTimeVariable);

我相信您试图在数据库中的日期中插入字符串。您应该能够将字符串转换为适合数据库中日期格式的日期(甚至可以删除userBirth上的.toString()方法,并将Insert方法中的userBirth类型更改为DateTime)

< >编辑:尝试这样做,而不是在查询的中间添加DATETIME作为字符串:

SqlCommand cmd = new SqlCommand("INSERT INTO <table> (<column>) VALUES (@value)", connection);
cmd.Parameters.AddWithValue("@value", dateTimeVariable);
SqlCommand cmd=newsqlcommand(“插入()值(@value)”,连接);
cmd.Parameters.AddWithValue(“@value”,dateTimeVariable);

基本上,这里的基本问题是首先将日期时间视为字符串。这是没有必要的,除了极少数情况。更重要的问题是将值连接到SQL中的常规做法,由于各种原因,这是不好的。其中一个原因——实际上是更次要的原因之一——是数字和日期的格式问题


基本上:使用sql参数。通过将该值作为参数而不是串联字符串添加,它将正常工作。您也不会受到如此严重的影响。

基本上,这里的基本问题是首先将日期时间视为字符串。这是没有必要的,除了极少数情况。更重要的问题是将值连接到SQL中的常规做法,由于各种原因,这是不好的。其中一个原因——实际上是更次要的原因之一——是数字和日期的格式问题


基本上:使用sql参数。通过将该值作为参数而不是串联字符串添加,它将正常工作。您也不会受到如此严重的影响。

在您的业务层中,不要使用
ToString()
DateTime
值转换为
string

现在在数据访问层中,对该参数使用
DateTime
,而不是
string
。现在,
DateTime userBirthday=…
行是多余的:

public static bool Insert(string userFName, string userLName, string userPass, DateTime userBirth, string userEmail, string userCountry)
{
    try
    {
        OleDbHelper.fill("INSERT INTO UsersTable(userFName, userLName, userPass, userBirth, userEmail, userCountry, userActive) VALUES('" + userFName + "', '" + userLName + "', '" + userPass + "', " + userBirth + ", '" + userEmail + "', '" + userCountry + "', true)", "UsersTable");
    }
    catch
    {
        return false;
    }
    return true;
}

作为旁注,你应该这样做。使用当前的字符串连接方法,您很容易受到SQL注入的影响。

在您的业务层中,不要使用
ToString()将
DateTime
值转换为
string

现在在数据访问层中,对该参数使用
DateTime
,而不是
string
。现在,
DateTime userBirthday=…
行是多余的:

public static bool Insert(string userFName, string userLName, string userPass, DateTime userBirth, string userEmail, string userCountry)
{
    try
    {
        OleDbHelper.fill("INSERT INTO UsersTable(userFName, userLName, userPass, userBirth, userEmail, userCountry, userActive) VALUES('" + userFName + "', '" + userLName + "', '" + userPass + "', " + userBirth + ", '" + userEmail + "', '" + userCountry + "', true)", "UsersTable");
    }
    catch
    {
        return false;
    }
    return true;
}

作为旁注,你应该这样做。使用当前的字符串连接方法,您很容易受到SQL注入的影响。

Gah!Sql注入啊。阿尔多:不要把约会时间当作一根绳子。什么问题?另外,为什么要将
DateTime
转换为
String
,以便在下一个方法中将其转换回
DateTime
?使用上面提到的sql参数。当您尝试查找即将到来的生日时,您会后悔没有将其作为
DateTime thingy
您确实需要对该查询进行参数化。它不仅可以解决日期时间问题,还可以帮助您抵御SQL注入攻击,甚至可以通过允许重用SQL执行计划来提高性能!Sql注入啊。阿尔多:不要把约会时间当作一根绳子。什么问题?另外,为什么要将
DateTime
转换为
String
,以便在下一个方法中将其转换回
DateTime
?使用上面提到的sql参数。当您尝试查找即将到来的生日时,您会后悔没有将其作为
DateTime thingy
您确实需要对该查询进行参数化。它不仅可以解决日期时间问题,还可以帮助保护您免受