【问题标题】:C# and saving date field to MS Access databaseC# 并将日期字段保存到 MS Access 数据库
【发布时间】:2014-11-09 17:25:37
【问题描述】:

我是 Access 和保存数据的新手。我有一个日期时间字段,我在 Visual Studio 中使用它来制作表单并选择日期时间选择器。我不确定我哪里出错了,但我知道这是导致问题的日历选择器。我在插入到语句中得到错误语法错误。

这是我的代码

string When = qaWhendateTimePicker.Value.ToString("HH:mm:ss.fff");

然后是我的保存查询

 SQLString = "INSERT INTO QAAnswers (QuestionID,CallMonitorNumber,When) VALUES('"+QuestionID + "','" + CallMonitorNumber + "','" + When + "');";

这当然是缩短版。但是为了我的爱,如果我把它保存到数据库的时间取出来就好了

我拥有的 Access 数据库 WHEN SET AS DATE / TIME。

我应该将其设置为文本吗?我认为不会,因为这样我就无法根据日期提取查询。

提前感谢,因为我已经在这里工作了好几个小时。

更新

根据下面的评论,我更改了语法。这就是我所拥有的。如果我输入 .value 或 .date 它不起作用。我确定这是我做错的事情。我收到错误,无法将参数值从 datetimepicker 转换为 datetime。谢谢,因为我在访问中学到了很多东西。

ad.InsertCommand = new OleDbCommand("insert into QAAnswers ([CallMonitorNumber],[When],[ProperGreeting],[AssureHelp],[AccountVerification],[ConfirmCaller],[ProperPoliciesSolutions],[ProperPoliciesAdmin],[AppropriateTools],[TroubleshootingSteps],[ConfirmResolved],[CustomerEducation],[CSATSurvey],[ThanksCallerBrand],[ProfessionalToneAttitude],[CustomerInvolved],[CallPace],[Empathy],[PhoneEtiquette],[DiffuseEscalated],[UnacceptableCallPractice],[Notes],[ScorePotential],[ScoreActual],[FinalScore]) values (@CallMonitorNumber,@When,@ProperGreeting,@AssureHelp,@AccountVerification,@ConfirmCaller,@ProperPoliciesSolutions,@ProperPoliciesAdmin,@AppropriateTools,@TroubleshootingSteps,@ConfirmResolved,@CustomerEducation,@CSATSurvey,@ThanksCallerBrand,@ProfessionalToneAttitude,@CustomerInvolved,@CallPace,@Empathy,@PhoneEtiquette,@DiffuseEscalated,@UnacceptableCallPractice,@Notes,@ScorePotential,@ScoreActual,@FinalScore)", con);

ad.InsertCommand.Parameters.Add("@QuestionID", OleDbType.VarChar).Value = agentIDNumbertextBox.Text.ToString();
ad.InsertCommand.Parameters.Add("@CallMonitorNumber", OleDbType.VarChar).Value = qaCallMonitorNumbertextBox.Text.ToString();
ad.InsertCommand.Parameters.Add("@When", OleDbType.DBDate).Value = qaWhendateTimePicker;  

更新答案

我终于明白了。不确定这是否是最好的方法,但我只是忽略了 datetimepicker。我希望我可以使用日期选择器。相反,我只是使用此语句输入添加日期(缩短版本)注意 [when] 和 Date() 。

DateTime now = DateTime.Now;

            ad.InsertCommand = new OleDbCommand("insert into QAAnswers ([CallMonitorNumber],[When]) values (@CallMonitorNumber,Date())", con);

我希望这对其他人有所帮助。我真的不喜欢对数据库使用访问权限,但这就是我必须使用的。

我给 marc 打分,因为我从来没有听说过参数化查询

【问题讨论】:

  • 错误说明了什么?
  • 查看行的最后一个字符 >> "');"; 并删除 ";
  • 您为什么将您的专栏称为When
  • 我可以随便称呼它,但我正在测试。另外,如果我选择“;它会显示错误
  • 只需将,'" + When + "') 更改为,#" + When + "#) 即可。

标签: c# sql database winforms ms-access-2007


【解决方案1】:

我终于明白了。不确定这是否是最好的方法,但我只是忽略了 datetimepicker。我希望我可以使用日期选择器。相反,我只是使用此语句输入添加日期(缩短版本)注意 [when] 和 Date() 。

DateTime now = DateTime.Now;
        ad.InsertCommand = new OleDbCommand("insert into QAAnswers ([CallMonitorNumber],[When]) values (@CallMonitorNumber,Date())", con);

【讨论】:

    【解决方案2】:

    您也可以使用此方法:- 在存储过程中编写插入查询(或者您可以直接使用查询)然后在您的方法中调用它

    string strcon = ConfigurationManager.ConnectionStrings["YourConnectionStringName"].ConnectionString;
    con.ConnectionString = strcon;
    con.Open();
    
    SqlCommand cmd = new SqlCommand("[Your_StoredProcedureName]", con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
    da.SelectCommand.Parameters.AddWithValue("@value1", value1);
    da.SelectCommand.Parameters.AddWithValue("@value2", value2);
    da.SelectCommand.Parameters.AddWithValue("@value3", value3);
    
    int result = da.SelectCommand.ExecuteNonQuery();
    return result ;
    

    【讨论】:

    • OP 正在使用 MS Access(不是 SQL Server) - 所以使用 SqlCommandSqlConnection 不起作用!跨度>
    【解决方案3】:

    您应该使用参数化查询进行插入,以避免 SQL 注入攻击!

    类似这样的:

    SQLString = "INSERT INTO QAAnswers (QuestionID, CallMonitorNumber, When) VALUES(?, ?, ?);";
    

    然后当您准备插入语句时,您需要添加三个参数(在 Access 中通常定义为 p1p2p3)并为它们分配值。

    using (OleDbConnection conn = new OleDbConnection(YourConnectionStringHere))
    using (OleDbCommand cmd = new OleDbCommand(SQLString, conn))
    {
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.Add("p1", OleDbType.VarChar, 50).Value = QuestionID;
        cmd.Parameters.Add("p2", OleDbType.VarChar, 50).Value = CallMonitorNumber;
        cmd.Parameters.Add("p3", OleDbType.DBDate).Value = When;
    
        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
    }
    

    这也将避免字符串格式的日期问题,以及单引号问题和所有那些混乱的事情。

    【讨论】:

    • 如果我改变你的方式,我必须添加一个数据源吗?还是我仍然可以使用 sql 字符串来调用它?
    • @matthewmoore:不需要数据源 - 只需使用我发布的代码 - “运行”INSERT 并且应该将该数据插入到您的 MS Access 数据库中
    • 我有一个问题。我做了代码,它给出了一个错误,无法将参数值从 datetimepicker 转换为日期时间。感谢您到目前为止的帮助。我不知道从这里去哪里
    • @matthewmoore:好吧,您需要将日期时间选择器(qaWhendateTimePicker.DateqaWhendateTimePicker.Value)的 分配给您的参数 - 而不是整个 DateTimePicker对象.....
    • 我根据您的需要更新了我的代码。我第一次遇到这种情况,但无法约会,所以我想我会再试一次。再次感谢。对不起,我只是慢慢地得到这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多