【问题标题】:Insert date into an SQL database将日期插入 SQL 数据库
【发布时间】:2016-04-22 21:02:50
【问题描述】:

所以我在做我的学校项目时遇到了另一个问题。 仅供参考,我们不使用 sql 参数,也没有学习如何使用它们。

我正在尝试在 sql 数据库中插入生日,但我尝试了所有方法,但始终存在数据类型不匹配。

你们能帮帮我吗(不改变代码的结构)? 您可以通过搜索“生日”来查找它,因为其他所有东西都有德国名字。

非常感谢您的帮助,因为我真的很绝望。 编辑:有一个文本框,用户应该在其中输入生日。这就是我获取数据的地方。

编辑:我删除了所有其他不必要的字符串等。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;

public class webUser
{

private DateTime _birthday;

public webUser()
{
    //
    // TODO: Add constructor logic here
    //

public DateTime birthday
{
    get { return _birhday; }
    set { _birthday= value; }
}

public bool checkUser(string eMail)
{
    string sql = "SELECT eMail, kennwort FROM Benutzerdatenbank WHERE eMail ='" + eMail + "'";
    string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Benutzerdatenbank.accdb");

    OleDbConnection con = new OleDbConnection(conStr);
    con.Open();
    OleDbDataAdapter da = new OleDbDataAdapter(sql, con);
    DataSet ds = new DataSet();
    da.Fill(ds);
    con.Close();

    if (ds.Tables[0].Rows.Count == 1)
        return true;
    else
        return false;
}

public bool addUser(string eMail, string kennwort, string vorname, string zuname, string telefonnummer, string strasse, string plz, string ort, string firma, string titel, DateTime birthday)
{
    if (this.checkUser(eMail) == true)

    {
        return false; 

    }

    else
    {

        string zeichen =   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjiklmnopqrstuvwxyz0123456789";
        string aktivierungscode = "";
        Random rnd = new Random();
        for (int i = 1; i < 62; i++)
        {
            aktivierungscode = aktivierungscode + zeichen.Substring(rnd.Next(0, zeichen.Length - 1), 1);
        }

        string sql = "INSERT INTO Benutzerdatenbank (eMail, kennwort, Titel, Vorname, Zuname, Firma, birthday, Telefonnummer, Strasse, PLZ, Ort, aktivierungscode) VALUES ('" +
        eMail + "','" + kennwort + "','" + titel + "','" + vorname + "','" + zuname + "','" + firma +  "','" + birthday+ "','" + telefonnummer + "','" + strasse + "','" + plz + "','" + ort + "','" + aktivierungscode + "');";


        string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Benutzerdatenbank.accdb");
        OleDbConnection con = new OleDbConnection(conStr);
        OleDbCommand cmd = new OleDbCommand(sql, con);

        con.Open();
        cmd.ExecuteNonQuery(); 
        con.Close();
        return true;
    }
}

public void ReadUser(string eMail, string kennwort)
{
    string sql = "SELECT * FROM Benutzerdatenbank WHERE eMail='" + eMail + "' AND kennwort ='" + kennwort + "'";
    string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Benutzerdatenbank.accdb");

    OleDbConnection con = new OleDbConnection(conStr);
    con.Open();
    OleDbDataAdapter da = new OleDbDataAdapter(sql, con);
    DataSet ds = new DataSet();
    da.Fill(ds);
    con.Close();

    if (ds.Tables[0].Rows.Count == 1)
    {
        this.eMail = (string)ds.Tables[0].Rows[0]["eMail"];
        this.vorname = (string)ds.Tables[0].Rows[0]["Vorname"];
        this.zuname = (string)ds.Tables[0].Rows[0]["Zuname"];
        this.telefonnummer = (string)ds.Tables[0].Rows[0]["Telefonnummer"];
        this.strasse = (string)ds.Tables[0].Rows[0]["strasse"];
        this.plz = (string)ds.Tables[0].Rows[0]["PLZ"];
        this.ort = (string)ds.Tables[0].Rows[0]["ORT"];
        this.titel = (string)ds.Tables[0].Rows[0]["Titel"];
        this.firma = (string)ds.Tables[0].Rows[0]["Firma"];
        this.birthday= Convert.ToDateTime(ds.Tables[0].Rows[0]["birthday"];

    }
    else
    {
        this.eMail = "";
        this.vorname = "";
        this.zuname = "";
    }
}

}

【问题讨论】:

  • 我建议大幅删除代码和空行,只留下绝对必要的代码来帮助您解决问题。
  • 好吧!现在会做
  • 您的所有数据类型(甚至日期)都是 STRING 是否有原因?有没有想过 SQL Server 中的日期是日期,而在您的代码中应该是日期时间?否则我会坚持滥用 SQL - 使用 SQL 服务器始终可以理解的日期 (2016-01-22) 的 ISO 表单。
  • 日期(生日)是日期时间吗?
  • @TomTom:这不是 SQL Server,而是 Access 数据库。 AFAIK,Access 使用 #mm/dd/yyyy# 作为日期文字。

标签: c# sql


【解决方案1】:

仅供参考,我们不使用 sql 参数,也没有学习如何使用它们。

然后学习如何使用它们。 以错误的方式学习确实没有意义。另外,使用不带参数的日期实际上比使用参数更复杂

参数真的很简单。以下问题包含您开始所需的一切:

您需要注意的唯一区别是 OleDbCommand 在 SQL 语句中使用 ? 而不是 @parameterName 作为参数占位符。参数名称被忽略,参数按? 占位符出现的顺序添加。


在您的情况下,相关代码如下所示:

string sql = "INSERT INTO Benutzerdatenbank (eMail, kennwort, Titel, Vorname, Zuname, Firma, birthday, Telefonnummer, Strasse, PLZ, Ort, aktivierungscode) " +
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";

OleDbCommand cmd = new OleDbCommand(sql, con);

// The parameter names (first argument) are ignored, the order is important
cmd.Parameters.AddWithValue("@eMail", eMail);
...
cmd.Parameters.AddWithValue("@birthday", birthday);
...

cmd.ExecuteNonQuery(); 

【讨论】:

  • 好的,谢谢,我会努力自学的。也许我会在这个项目上得到一些额外的分数?他其实很博学,不知道为什么他没有向我们展示“正确”的方式。可能是因为我们还在上高中,idk。但是我应该如何解决这个日期问题呢?
  • @Nuray:我添加了一个示例。
  • 程序突出显示 AddWithValue 说在使用 System.Data.OleDb.OleDbCommand 时没有定义它 - 我该怎么办?
  • @Nuray:对不起,应该是cmd.Parameters.AddWithValue
【解决方案2】:

可能是您的 DateTime 对象的格式与 SQL 数据库的要求不匹配。 datetime format to SQL format using C#

【讨论】:

    【解决方案3】:

    这是使用 SQL 语言在 SQL Server 中插入的示例:

    表格是 PERSON,这是你的结构:

    ID、int、主键、自增

    NAME,nvarchar(50),不为空

    生日,日期时间

    现在,插入是:

    INSERT INTO PERSON (NAME, BIRTHDATE) VALUES('Jose Luis', DATETIMEFROMPARTS(1988, 7, 27, 0,0,0,0));

    对于选择是:

    SELECT * FROM PERSON WHERE BIRTHDATE = DATETIMEFROMPARTS(1988, 7, 27, 0,0,0,0);

    此代码正在 SQL Server 中进行测试。

    这个想法是你改变你的代码变量'sql'的值,例如push:

    var bithdateformat = string.Format("DATETIMEFROMPARTS({0}, {1}, {2}, {3}, {4}, {5}, {6})",birthday.Year,birthday.Month , 生日.Day, 0, 0, 0, 0);

    string sql = "INSERT INTO Benutzerdatenbank (eMail, kennwort, Titel, Vorname, Zuname, Firma,birthday, Telefonnummer, Strasse, PLZ, Ort, aktivierungscode) VALUES ('" + 电子邮件 + "','" + kennwort + "','" + 标题 + "','" + vorname + "','" + zuname + "','" + Firma + "','" + bithdateformat + "','" + 电话号码 + "','" + strasse + "','" + plz + "','" + ort + "','" + aktivierungscode + "');";

    【讨论】:

    • 这和我的代码太不一样了,而且我在编程方面没有我们高中时那么有经验......
    【解决方案4】:

    使用“yyyyMMdd”将您的日期参数格式化为“年月日”,例如:birthday.ToString("yyyyMMdd")。
    否则,SQL Server 会尝试将其从 m/d/yyyy 格式转换。

    string sql = "INSERT INTO Benutzerdatenbank (eMail, kennwort, Titel, Vorname, Zuname, Firma, birthday, Telefonnummer, Strasse, PLZ, Ort, aktivierungscode) VALUES ('" +
    eMail + "','" + kennwort + "','" + titel + "','" + vorname + "','" + zuname + "','" + firma +  "','" + birthday.ToString("yyyyMMdd") + "','" + telefonnummer + "','" + strasse + "','" + plz + "','" + ort + "','" + aktivierungscode + "');";
    

    【讨论】:

    • 好的,完成了,但是我的 aspx.cs 上有一个错误 - 说“最好的重载方法有一些无效的参数”标记 protected void btnRegistrieren_Click1(object sender, EventArgs e) { webUser mywebUser = new webUser(); if (mywebUser.addUser(txtFirma.Text, txteMail.Text, txtKennwort.Text, txtbirthday.Text, txtOrt.Text, txtPLZ.Text, txtStrasse.Text, txtTitel.Text, txtVorname.Text, txtZuname.Text, txtTelefonnumer.Text) == true) lblMeldung.Text = ""; else lblMeldung.Text = "";
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2021-08-31
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多